[#44469] [Ruby 1.9 - Bug #5279][Open] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある — Shota Fukumori <sorah@...>

21 messages 2011/09/06
[#44471] [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある — Shota Fukumori <sorah@...> 2011/09/06

[#44472] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある — "NARUSE, Yui" <naruse@...> 2011/09/06

2011年9月6日11:02 Shota Fukumori <sorah@tubusu.net>:

[#44473] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある — "Shota Fukumori (sora_h)" <sorah@...> 2011/09/06

じゃぁ,大丈夫かな.

[#44474] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある — Kazuhiko <kazuhiko@...> 2011/09/06

On 06/09/2011 06:10, Shota Fukumori (sora_h) wrote:

[#44541] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある — Kazuhiko <kazuhiko@...> 2011/09/24

かずひこです。

[#44549] Re: [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある — KOSAKI Motohiro <kosaki.motohiro@...> 2011/09/26

> かずひこです。

[#44491] [Ruby 1.9 - Feature #5314][Open] パッケージマネージャをコアリリースに含めて欲しい — Taro MURAOKA <koron.kaoriya@...>

13 messages 2011/09/13

[#44506] [Ruby 1.9 - Feature #5317][Open] rubyのヘッダファイルを使った拡張を行う際にuid_tの宣言回避をする事が出来ない。 — Yasuhiro Matsumoto <mattn.jp@...>

9 messages 2011/09/13

[#44520] [Ruby 1.9 - Bug #5350][Open] WeakRef で謎の NoMethodError — Makoto Kishimoto <redmine@...>

20 messages 2011/09/21

[#44542] [Ruby 1.9 - Bug #5363][Open] OpenSSL::ASN1.decode_all の引数に PEM 形式の証明書を指定すると Segmentation fault が発生する — Hiroshi Yoshida <hexa.diary@...>

8 messages 2011/09/25

[#44546] [Ruby 1.9 - Bug #5368][Open] ensure節でsleepするようなThreadがあるとインタプリタが終了しない — Masaki Matsushita <glass.saga@...>

22 messages 2011/09/26

[ruby-dev:44471] [Ruby 1.9 - Bug #5279] $SAFEが3以上の時にString#encodeがSecurityErrorを発生させるケースがある

From: Shota Fukumori <sorah@...>
Date: 2011-09-06 02:02:00 UTC
List: ruby-dev #44471
Issue #5279 has been updated by Shota Fukumori.


中身的にはそういう事ですね. < transcoder の中で一時的に safe level を 0

#ruby-ja で議論したところ,autoloadはautoloadを定義した場所のSAFEで読み込むので,
$SAFE=0のときにあらかじめautoloadを仕掛けておいたというような解釈(仕組みな全然違いますが)
をすれば別に問題ないのではないか,という感じでした.

懸念しているのはrequireのpathにスクリプトサイドから自分でパスを流す事ができるかできないかで,
自分の認識ではできないと思っているのですが,もし可能だとするとrb_require_safeの第二引数に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

In This Thread