From: Hidetoshi NAGAI Date: 2008-04-02T13:37:50+09:00 Subject: [ruby-dev:34219] Ruby1.9 での $SAFE==4 での動作の仕様変更について 永井@知能.九工大です. 標題の件についてですか,どこかにまとめられた情報とかはないでしょうか? とりあえず現状で,rb_str_intern の仕様変更で SecurityError を出すようになって困ってます. 他にも仕様変更があるならそれに合わせた対策が必要になりそうですので, 情報 (「未整理で不明」という情報を含む) を御存知の方がありましたら 教えていただけないでしょうか. rb_str_intern の仕様変更の件は, 1.8 には存在した !rb_sym_interned_p(str) のチェックが消えたため, 渡された文字列をチェックして __send__ で送るようにしていたものが 動かなくなった (Insecure: can't intern tainted string) というものです. この仕様変更は必要なものだったのでしょうか? symbol が GC されないために登録される symbol の量を 爆発させないためというのなら理解できもするのですが, rb_sym_interned_p はすでに存在するものについては OK ということで 縛りを入れているわけですので,登録 symbol 量は増えませんよね? それに, s = 'foo'.taint; Thread.new{$SAFE=4; eval ":#{s}"}.value とか Thread.new{$SAFE=4; s = 'foo'; eval ":#{s}" if s.tainted?}.value とかは問題なく実行できて,あっさりと symbol を生成してしまうので 仕様変更の理由がよく分からないです. それとも,単に私がセキュリティの問題を理解できていないだけで, セキュリティホールになりうるような別のケースが存在するのでしょうか? -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp