rails:2319
From: "Haruhiko Mitsuya" <3arrows@g...>
Date: Mon, 6 Aug 2007 15:54:06 +0900
Subject: [rails:2319] Re: RailsのXMLパースによるDos脆弱性対策としてのDTD無効化について
みつやです。お世話になります。以下、自己レスです。 本件ですが、Railsコアの開発者へ相談した結果、Rick Olson氏が、とりあえず版の パッチを作成してくれました。 > > Lame one-line fix until someone smarter than me comes up with one: > > REXML::Document.class_eval { def doctype() nil end } > > This hides any doctype so XmlSimple will ignore it. I think it's good > enough until this gets properly patched. > > script/plugin install http://svn.techno-weenie.net/projects/plugins/xml_simple_doctype_fix > ご自身の管理されているWebアプリケーションで利用される際は、パッチによる 悪影響の有無を十分テストなさってください。 コードをご覧頂けばお分かりになると思いますが、blindly delete the DocType と言えるやや強引な手法です。(笑) DHH氏がRails固有の問題ではないという判断で、REXMLメンテナの Sean Russell氏に問い合わせてくれたようで、彼からも助言を得られています。 バグではなくて仕様なので、以下の様に対処しましょうという意見です。 (私もそう思います。) > > There are two solutions: either remove the doctype declaration, or > have the code that interprets the SOAP message check for DOS attacks. > Removing the doctype can be done either prior to parsing: > > REXML::Document.class_eval { def doctype() nil end } > > (as suggested by Rick) or after parsing: > > d = REXML::Document.new( bad_xml ) > d << REXML::DocType.new > > Unfortunately for both of these cases, the XML spec requires that > undefined entities be reported as errors, so that trying to read the > text will result in an Exception. Therefore, it really is up to the > SOAP toolkit to perform sanity checks on the DocType to see if an > exploit like this is being attempted -- you should NOT blindly delete > the DocType in an attempt to avoid this exploit. > しかしながら、あくまでもRailsはWebアプリケーションのための フレームワークなので、規定値としては対処されているべき内容 だと考えています。 そうでないと、普通に作成したRailsアプリケーションはすべて Dos脆弱性を持つということになりかねません。 (おそらく近いうちにセキュリティアナウンスがされると思います。) 「ご注意」 Sean Russell氏が文中でSOAPメッセージはどうこう、という説明を されていますが、SOAPメッセージを普通のHTTPリクエストとして Webアプリケーションに投げれば、今回の過負荷現象は再現しますので、 HTTP通信機能があり、XML処理を行う可能性のあるすべてのWeb アプリケーション(Railsのようなアプリケーション)が深刻な影響を 受けます。 DHH氏の言う通りRails固有の問題ではなく、REXMLを利用するすべての RubyアプリケーションにおけるDos脆弱性です。 07/08/03 に Haruhiko Mitsuya<3arrows@g...> さんは書きました: > みつやと申します。いつもMLで勉強させて頂きありがとうございます。 > 今日は、一つご質問をさせて頂きたくてメール致します。 > > > > ご存知の方も多いと思いますが、XMLドキュメントにはDTDを含めることが > できます。 > DTDにネストされたエントリや複合的な定義が含まれている場合、そのXML > ドキュメント解析に長い時間がかかることがあります。 > > この仕様を悪用して、DTDに、過度の処理時間を要する入れ子のエンティティや > 複合的な定義を含めてリクエストを投入するというDos攻撃手法が存在します。 > > > > 例えば、以下のようなDTDを差し込んだXML文書を通常のHTTPリクエストとして > POSTした場合、RailsはXMLパースのために限界までCPU処理をしようとします。 > (あえて、エクスプロイトコード全体は記載致しません。) > > > > <?xml version="1.0" encoding="UTF-8"?> > <!DOCTYPE foobar [ > <!ENTITY x0 "hello"> > <!ENTITY x1 "&x0;&x0;"> > <!ENTITY x2 "&x1;&x1;"> > <!ENTITY x3 "&x2;&x2;"> > <!ENTITY x4 "&x3;&x3;"> > <!ENTITY x5 "&x4;&x4;"> > <!ENTITY x6 "&x5;&x5;"> > (この後、繰り返しが続き、最後にエンティティを参照するXML定義が必要です。) > > > > > 結果としてCPU利用率100%によるDos状況が発生します。 > > 私が試してみた限りでは、Railsの1.1系、1.2系のいずれでも、また、Mongrel > でもWEBrickでも、Lighttpd+FastCGIでも同様の状態になります。 > > > 下記は、その際の実行ログの一部です。(Rails 1.1.6の場合) > ※REXMLが再帰的に、高負荷な処理を要求されています。 > > "backtrace"=>["/usr/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel.rb:675:in > `unnormalize'", "/usr/lib/ruby/1.8/rexml/text.rb:321:in `each'", > "/usr/lib/ruby/1.8/rexml/text.rb:321:in `unnormalize'", > "/usr/lib/ruby/1.8/rexml/entity.rb:78:in `unnormalized'", > "/usr/lib/ruby/1.8/rexml/doctype.rb:143:in `entity'", > "/usr/lib/ruby/1.8/rexml/text.rb:323:in `unnormalize'", > "/usr/lib/ruby/1.8/rexml/text.rb:321:in `each'", > "/usr/lib/ruby/1.8/rexml/text.rb:321:in `unnormalize'", > "/usr/lib/ruby/1.8/rexml/entity.rb:78:in `unnormalized'", > "/usr/lib/ruby/1.8/rexml/doctype.rb:143:in `entity'", > "/usr/lib/ruby/1.8/rexml/text.rb:323:in `unnormalize'", > "/usr/lib/ruby/1.8/rexml/text.rb:321:in `each'", > "/usr/lib/ruby/1.8/rexml/text.rb:321:in `unnormalize'", > "/usr/lib/ruby/1.8/rexml/entity.rb:78:in `unnormalized'", > "/usr/lib/ruby/1.8/rexml/doctype.rb:143:in `entity'", > "/usr/lib/ruby/1.8/rexml/text.rb:323:in `unnormalize'", > "/usr/lib/ruby/1.8/rexml/text.rb:321:in `each'", > "/usr/lib/ruby/1.8/rexml/text.rb:321:in `unnormalize'", > "/usr/lib/ruby/1.8/rexml/entity.rb:78:in `unnormalized'", > "/usr/lib/ruby/1.8/rexml/doctype.rb:143:in `entity'", > "/usr/lib/ruby/1.8/rexml/text.rb:323:in `unnormalize'", > "/usr/lib/ruby/1.8/rexml/text.rb:321:in `each'", > "/usr/lib/ruby/1.8/rexml/text.rb:321:in `unnormalize'", > > > > この状況を避けるためには、XMLパーサーにおけるDTDを無効にする必要が > あると思われます。 > > > そこでご質問なのですが、 > > Railsが利用しているXMLパーサーのDTDを無効に設定することは可能なのでしょうか? > (また、可能だとしたら、何か悪影響は考えられるのでしょうか。) > > あるいは、上記のような極端に負荷の高いXMLパース要求によるDos攻撃に対する > なんらかのパッチモジュールが提供されているという事はあるのでしょうか。 > > パッチモジュール等を探してみましたが、今のところ見つけられておりません。 > (探し方がまずいのかもしれません。) > > > > 以上、すべてのRailsアプリケーションに共通する課題のように思いましたので、 > 既に対策をご存知の方がいらっしゃれば、何かご教示頂けましたら幸いです。 > > > どうぞ宜しくお願い申し上げます。 > -- ML: rails@r... 使い方: http://QuickML.com/
2308 2007-08-03 06:52 [3arrows@g... ] RailsのXMLパースによるDos脆弱性対策としてのDTD無効化について -> 2319 2007-08-06 08:54 ┗[3arrows@g... ] 2320 2007-08-07 06:36 ┗[k.sato@a... ] RAILS上でYAJB