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