[前][次][番号順一覧][スレッド一覧]

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