山口と申します。
1.9 においてセーフレベル4環境から $LOAD_PATH の書き換えられるのを防止するパッチを投稿致します。
現在 1.9 では gem_prelude.rb において追加されている gem の各パスが freeze
されていないため、次のようにしてセーフレベル4環境から $LOAD_PATH を書き換えられる可能性があります。
Thread.new do
$SAFE = 4
eval %q{
$LOAD_PATH.each do |path|
if path.tainted? and not path.frozen?
path.replace("/usr/lib")
end
end
}
end.join
gem の各パスを書き換えることの利点はないと思いますので、これらは予め freeze しておくのが良いと思われます。いかがでしょうか。
Index: gem_prelude.rb
===================================================================
--- gem_prelude.rb (revision 17572)
+++ gem_prelude.rb (working copy)
@@ -174,6 +174,9 @@
unless require_paths.empty?
require_paths.first.instance_variable_set(:@gem_prelude_index, true)
end
+
+ require_paths.each {|path| path.freeze }
+
# gem directories must come after -I and ENV['RUBYLIB']
$:[$:.index(ConfigMap[:sitelibdir]),0] = require_paths
end
---
北海道大学大学院文学研究科専門研究員
山口慶太
keita.yamaguchi / gmail.com