REXMLのDoS脆弱性

Posted by Shugo Maeda on 23 Aug 2008

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 モンキーパッチのバグを修正しました。

最近のニュース

Ruby 4.0.0 リリース

Ruby 4.0.0 が公開されました。 Ruby 4.0 には “Ruby Box”、”ZJIT” ほか多数の改善が含まれています。

Posted by naruse on 25 Dec 2025

サイトのアイデンティティの再設計

サイトの包括的なデザインのアップデートを発表できることを嬉しく思います。今回の更新ではTaeko Akatsukaさんにデザインを担当していただきました。

Posted by Hiroshi SHIBATA on 22 Dec 2025

Ruby 4.0.0 preview2 リリース

Ruby 4.0.0-preview2 が公開されました。Ruby 4.0では、Unicodeバージョンの17.0.0へのアップデートなど様々な改善が行われています。

Posted by naruse on 17 Nov 2025

もっと読む...