From: Keita Yamaguchi Date: 2008-06-25T00:46:12+09:00 Subject: [ruby-dev:35219] freeze Tempfile#path 山口と申します。 tempfile.rb における Tempfile#path (@tmpname) の値をTempfileオブジェクト作成時に freeze するためのパッチを投稿致します。 現在 1.8, 1.9 共に tempfile.rb における Tempfile#path (@tmpname) の値は freeze されていません。このため、 - 環境変数 TMP 等が設定されていること - セーフレベル0でTempfileオブジェクトが作成されていること の二点を条件として、セーフレベル4環境から任意のファイルを削除できる可能性があります。 $SAFE = 0 require "tempfile" tmp = Tempfile.new("test") Thread.new do $SAFE = 4 eval('tmpfile.path.replace("hello.txt")') end.join # => removing hello.txt...done これはセーフレベル4環境を導入する以前に tmpfile.path.freeze を行なうことで簡単に防ぐことが出来るのですが、tmpfile.path の値が変更可能である利点はないと思われますので、Tempfile オブジェクトが作成された時点で @tmpname を freeze しておいた方が良いと考えます。いかがでしょうか。 Index: lib/tempfile.rb =================================================================== --- lib/tempfile.rb (revision 17564) +++ lib/tempfile.rb (working copy) @@ -40,6 +40,7 @@ begin tmpname = File.join(tmpdir, make_tmpname(basename, n)) + tmpname.freeze lock = tmpname + '.lock' n += 1 end while @@cleanlist.include?(tmpname) or --- 北海道大学大学院文学研究科専門研究員 山口慶太 keita.yamaguchi@gmail.com