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

rails:2308

From: "Haruhiko Mitsuya" <3arrows@g...>
Date: Fri, 3 Aug 2007 13:52:22 +0900
Subject: [rails:2308] RailsのXMLパースによるDos脆弱性対策としてのDTD無効化について

みつやと申します。いつも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