From: Kenta Murata <muraken@...> Date: 2011-09-06T10:51:05+09:00 Subject: [ruby-dev:44470] [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある Issue #5279 has been updated by Kenta Murata. 「rb_require_safe の第2引数に0を渡して良いかどうか」が問題なのではなく、 「transcoder の中で一時的に safe level を0に戻して良いかどうか」が問題なのではないでしょうか。 ---------------------------------------- Bug #5279: $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある http://redmine.ruby-lang.org/issues/5279 Author: Shota Fukumori Status: Open Priority: Normal Assignee: Category: Target version: ruby -v: ruby 1.9.4dev (2011-09-05 trunk 33195) [x86_64-darwin11.1.0] sora_hです. twitter で @hsbt さんがこのような事を言っていたので調査してみました: http://twitter.com/#!/hsbt/status/110700488667832320 調査したところ,どうやらString#encodeは内部的にrequireしていて, セーフレベル3から全てのオブジェクトが汚染されるので,rb_require_safeに渡るStringが汚染されるため, rb_requireでSecurityErrorが発生します. なので,以下の場合はSecurityErrorが発生しますが, $SAFE = 3 "a".encode("UTF-16") 以下の場合は発生しません. "a".encode("UTF-16") $SAFE = 3 "a".encode("UTF-16") これを修正するパッチを書いてみましたが(チケット末尾に貼り付け), 果たしてrb_require_safeの第二引数に0を渡しても問題ないのか自信がありません. これはセキュリティ周りの問題なので,合意を取ってからコミット,もしくはパッチに 含む問題を修正し合意が取れてからコミットしようと思います. 以下patch diff --git a/ChangeLog b/ChangeLog index a16e823..07f76a7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Tue Sep 6 08:56:06 2011 Shota Fukumori <sorah@tubusu.net> + + * transcode.c: Use rb_require_safe() to load transcoder. + Because if $SAFE is higher than 3, rb_require() raises SecurityError. + Mon Sep 5 20:59:30 2011 CHIKANAGA Tomoyuki <nagachika00@gmail.com> * insns.def: change encoding pragma for emacs (shift_jis to utf-8). diff --git a/transcode.c b/transcode.c index 2c188b6..0651aec 100644 --- a/transcode.c +++ b/transcode.c @@ -375,7 +375,7 @@ load_transcoder_entry(transcoder_entry_t *entry) return NULL; memcpy(path, transcoder_lib_prefix, sizeof(transcoder_lib_prefix) - 1); memcpy(path + sizeof(transcoder_lib_prefix) - 1, lib, len + 1); - if (!rb_require(path)) + if (!rb_require_safe(rb_str_new2(path), 0)) return NULL; } -- http://redmine.ruby-lang.org