[ruby-dev:39578] [Bug #2308] セーフレベル1の場合、Net::IMAPでSecurityErrorが発生する

View: New views
5 Messages — Rating Filter:   Alert me  

[ruby-dev:39578] [Bug #2308] セーフレベル1の場合、Net::IMAPでSecurityErrorが発生する

by Hongli Lai-5 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Bug #2308: セーフレベル1の場合、Net::IMAPでSecurityErrorが発生する
http://redmine.ruby-lang.org/issues/show/2308

起票者: Nozomu Kurasawa
ステータス: Open, 優先度: Normal
カテゴリ: lib
ruby -v: ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux]

鍋太郎といいます。
初めまして。

Net:IMAPを利用してプログラムを作成しているのですが、
セーフレベル1の場合にNet::IMAP#listがエラーとなってしまいます。

以下のコードで検証できます。

 ruby -r net/imap -e 'Net::IMAP.debug = true;$SAFE=1;i=Net::IMAP.new("localhost");i.login("test","test");i.list("","*")'

#前準備としてIMAPサーバを立てて、testユーザを準備する必要があります。

結果は以下になります。検証にはdovecotを使用しました。

S: * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE STARTTLS AUTH=PLAIN AUTH=LOGIN AUTH=CRAM-MD5] Dovecot ready.
C: RUBY0001 LOGIN test test
S: RUBY0001 OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE SORT THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT IDLE CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH QUOTA] Logged in
C: RUBY0002 LIST "" "*"
S: * LIST (\HasChildren) "." "INBOX"
/usr/lib/ruby/1.8/net/imap.rb:2876:in `intern': Insecure: can't intern tainted string (SecurityError)
        from /usr/lib/ruby/1.8/net/imap.rb:2876:in `flag_list'
        from /usr/lib/ruby/1.8/net/imap.rb:2875:in `collect'
        from /usr/lib/ruby/1.8/net/imap.rb:2875:in `flag_list'
        from /usr/lib/ruby/1.8/net/imap.rb:2519:in `mailbox_list'
        from /usr/lib/ruby/1.8/net/imap.rb:2515:in `list_response'
        from /usr/lib/ruby/1.8/net/imap.rb:1978:in `response_untagged'
        from /usr/lib/ruby/1.8/net/imap.rb:1950:in `response'
        from /usr/lib/ruby/1.8/net/imap.rb:1876:in `parse'
        from /usr/lib/ruby/1.8/net/imap.rb:1008:in `get_response'
        from /usr/lib/ruby/1.8/net/imap.rb:932:in `receive_responses'
        from /usr/lib/ruby/1.8/net/imap.rb:925:in `initialize'
        from /usr/lib/ruby/1.8/net/imap.rb:924:in `start'
        from /usr/lib/ruby/1.8/net/imap.rb:924:in `initialize'
        from -e:1:in `new'
        from -e:1

ライブラリを確認したところ、フラグをパースした後で、Symbol化する際に、
サーバから取得したフラグがまだ汚染されているのに intern しているのが原因のようです。

サーバから取得したフラグのうち、パーサ内に定義されているもののみ internしていますので、
untaintしてしまっても問題ないと思いますがいかがでしょうか?

Index: lib/net/imap.rb
===================================================================
--- lib/net/imap.rb (revision 25555)
+++ lib/net/imap.rb (working copy)
@@ -2878,7 +2878,7 @@
         if @str.index(/\(([^)]*)\)/ni, @pos)
           @pos = $~.end(0)
           return $1.scan(FLAG_REGEXP).collect { |flag, atom|
-            atom || flag.capitalize.intern
+            atom || flag.capitalize.untaint.intern
           }
         else
           parse_error("invalid flag list")

以上よろしくお願いします。


----------------------------------------
http://redmine.ruby-lang.org


[ruby-dev:39623] Re: [Bug #2308] セーフレベル1の場合、Net::IMAPでSecurityErrorが発生する

by Shugo Maeda :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

前田です。

2009年10月30日9:09 Nozomu Kurasawa <redmine@...>:
> Net:IMAPを利用してプログラムを作成しているのですが、
> セーフレベル1の場合にNet::IMAP#listがエラーとなってしまいます。
(snip)
> S: * LIST (\HasChildren) "." "INBOX"
> /usr/lib/ruby/1.8/net/imap.rb:2876:in `intern': Insecure: can't intern tainted string (SecurityError)

手元で上手く再現しなかったのですが、すでにSymbolがある文字列("Noinferiors"など)
だとSecurityErrorにならないのですね。

以下のcommitで導入されたようですが、そもそもこのチェックはどういう意図
でしょうか? > まつもとさん

Wed Sep 13 16:43:36 2006  Yukihiro Matsumoto  <matz@...>

        * string.c (rb_str_intern): prohibit interning tainted string.

SymbolはGCの対象にならないので、外部からの入力をinternするのはまずい、
ということでしょうか。

だとすると、今回のケースでuntaintするのもまずいかもしれません。
そもそも文字列のまま扱った方がよいような気もするのですが、互換性の問題
がありますね。

とりあえず、当面のworkaroundとしては、

  :Haschidren

のようにあらかじめ対応するSymbolを作っておくと、SecurityErrorが発生しなく
なると思います。

--
Shugo Maeda


[ruby-dev:39624] Re: [Bug #2308] セーフレベル1の場合、Net::IMAPでSecurityErrorが発生する

by Yukihiro Matsumoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

まつもと ゆきひろです

In message "Re: [ruby-dev:39623] Re: [Bug #2308] セーフレベル1の場合、Net::IMAPでSecurityErrorが発生する"
    on Tue, 3 Nov 2009 22:27:53 +0900, Shugo Maeda <shugo@...> writes:

|手元で上手く再現しなかったのですが、すでにSymbolがある文字列("Noinferiors"など)
|だとSecurityErrorにならないのですね。
|
|以下のcommitで導入されたようですが、そもそもこのチェックはどういう意図
|でしょうか? > まつもとさん
|
|Wed Sep 13 16:43:36 2006  Yukihiro Matsumoto  <matz@...>
|
|        * string.c (rb_str_intern): prohibit interning tainted string.
|
|SymbolはGCの対象にならないので、外部からの入力をinternするのはまずい、
|ということでしょうか。

そういうことです。無限にシンボルを導入してメモリを圧迫する攻
撃を避けるためです。既存のシンボルはメモリ状態に変化がないの
で、例外になりません。


[ruby-dev:39634] Re: [Bug #2308] セーフレベル1の場合、Net::IMAPでSecurityErrorが発生する

by Shugo Maeda :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

前田です。

2009年11月3日22:57 Yukihiro Matsumoto <matz@...>:

> |以下のcommitで導入されたようですが、そもそもこのチェックはどういう意図
> |でしょうか? > まつもとさん
> |
> |Wed Sep 13 16:43:36 2006  Yukihiro Matsumoto  <matz@...>
> |
> |        * string.c (rb_str_intern): prohibit interning tainted string.
> |
> |SymbolはGCの対象にならないので、外部からの入力をinternするのはまずい、
> |ということでしょうか。
>
> そういうことです。無限にシンボルを導入してメモリを圧迫する攻
> 撃を避けるためです。既存のシンボルはメモリ状態に変化がないの
> で、例外になりません。

了解です。

Net::IMAPの場合は、サーバが返す文字列をクライアント側でinternするので、
逆の場合に比べればリスクは小さい気がしますね。
1.8ではuntaintすることにしようかなと思います。

--
Shugo Maeda


[ruby-dev:39728] [Bug #2308](Closed) セーフレベル1の場合、Net::IMAPでSecurityErrorが発生する

by Hongli Lai-5 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

チケット #2308 が更新されました。 (by Shugo Maeda)

ステータス OpenからClosedに変更

r25858で修正しました。
----------------------------------------
http://redmine.ruby-lang.org/issues/show/2308

----------------------------------------
http://redmine.ruby-lang.org