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