From: Kazuhiro NISHIYAMA Date: 2009-08-03T02:39:40+09:00 Subject: [ruby-dev:38984] [Bug #1864] Ruby-1.8.7 $SAFE=4のarray/hashのrecursive比較でSecurityError チケット #1864 が更新されました。 (by Kazuhiro NISHIYAMA) 同じく再現する短いコードは作成できなかったのですが、内部的に使っているハッシュがあやしそうということで調べてみたところ、このあたりのハッシュを taint すれば "Insecure: can't modify hash" にならなくなるようです。 手元で再現させた tdiary の環境だと「OBJ_TAINT(list);」の方だけで大丈夫で「OBJ_TAINT(hash);」はなくても "Insecure: can't modify hash" にはなりませんでしたが、同様だと思います。 Index: ruby_1_8_7/eval.c =================================================================== --- ruby_1_8_7/eval.c (revision 24298) +++ ruby_1_8_7/eval.c (working copy) @@ -13545,6 +13545,7 @@ sym = ID2SYM(rb_frame_last_func()); if (NIL_P(hash) || TYPE(hash) != T_HASH) { hash = rb_hash_new(); + OBJ_TAINT(hash); rb_thread_local_aset(rb_thread_current(), recursive_key, hash); list = Qnil; } @@ -13553,6 +13554,7 @@ } if (NIL_P(list) || TYPE(list) != T_HASH) { list = rb_hash_new(); + OBJ_TAINT(list); rb_hash_aset(hash, sym, list); } rb_hash_aset(list, obj, Qtrue); ---------------------------------------- http://redmine.ruby-lang.org/issues/show/1864 ---------------------------------------- http://redmine.ruby-lang.org