REXMLのDoS脆弱性

Rubyの標準ライブラリに含まれているREXMLに、DoS脆弱性が発見されました。 XML entity explosion attackと呼ばれる攻撃手法により、ユーザから与えられ たXMLを解析するようなアプリケーションをサービス不能(DoS)状態にすること ができます。

Railsはデフォルトの状態でユーザから与えられたXMLを解析するため、大部分の Railsアプリケーションはこの攻撃に対して脆弱です。

影響

攻撃者は、以下のように再帰的にネストした実体参照を含むXML文書をREXMLに 解析させることにより、サービス不能(DoS)状態を引き起こすことができます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE member [
  <!ENTITY a "&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;">
  <!ENTITY b "&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;">
  <!ENTITY c "&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;">
  <!ENTITY d "&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;">
  <!ENTITY e "&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;">
  <!ENTITY f "&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;">
  <!ENTITY g "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx">
]>
<member>
&a;
</member>

脆弱性の存在するバージョン

1.8系

  • 1.8.6-p287以前のすべてのバージョン
  • 1.8.7-p72以前のすべてのバージョン

1.9系

  • すべてのバージョン

対処方法

問題を修正するためのモンキーパッチ(実行時にライブラリを修正するパッチ)をダウンロードしてください。

REXMLを使用する前にrexml-expansion-fix2.rbをロードするように、あなたのアプリケーションを修正してください。

require "rexml-expansion-fix2"
...
doc = REXML::Document.new(str)
...

Railsアプリケーションを利用している場合、rexml-expansion-fix2.rbをロード パス上のディレクトリ(たとえばRAILS_ROOT/lib/)にコピーし、次のような行を config/environment.rbに追加してください。

require "rexml-expansion-fix2"

Rails 2.1以降の場合、rexml-expansion-fix2.rbを RAILS_ROOT/config/initializersにコピーするだけで自動的にロードされます。

デフォルトでは、XML実体参照の展開は10000回に制限されます。 この値は、REXML::Document.entity_expansion_limit=により変更可能です。

REXML::Document.entity_expansion_limit = 1000

この修正はgemパッケージとして提供され、Railsの将来のバージョンで利用さ れるようになる予定ですが、ただちに対策されることを推奨します。

クレジット

この脆弱性はACROS SecurityのLuka Treiber氏とMitja Kolsek氏により Ruby Security Teamに報告されました。

脆弱性を修正するためのモンキーパッチはRails Core TeamのMichael Koziarski氏により作成されました。

変更履歴

  • 2008-08-29 18:53 +09:00 Rails固有の問題との誤解を与えないように概要を修正しました。
  • 2008-11-09 12:40 +09:00 モンキーパッチのバグを修正しました。