山口と申します。
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