From: Nozomu Kurasawa Date: 2009-10-30T09:09:46+09:00 Subject: [ruby-dev:39578] [Bug #2308] セーフレベル1の場合、Net::IMAPでSecurityErrorが発生する 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