CVE-2014-8080: REXML におけるXML展開に伴うサービス不能攻撃について

Posted by nagachika on 27 Oct 2014

REXML において XML のパラメータエンティティの展開によりサービス不能攻撃が可能となる脆弱性が報告されました。 この脆弱性は CVE-2014-8080 として CVE に登録されています。 ユーザーの皆さんには Ruby を更新することを強くお勧めします。

詳細

XMLドキュメントからテキストのノードを読み込む際にREXMLパーサーに極めて大きな String オブジェクトを生成させることで、マシン上のメモリを使い果たさせてサービス不能攻撃(DoS)を成立させることができます。

影響を受けるのは以下のようなコードです:

require 'rexml/document'

xml = <<XML
<!DOCTYPE root [
  # ENTITY expansion vector
]>
<cd></cd>
XML

p REXML::Document.new(xml)

影響を受けるバージョンの Ruby を使用している全てのユーザーは、速やかに Ruby を更新するか、以下の回避策を適用してください。

影響を受けるバージョン

  • Ruby 1.9.3 patchlevel 550 より前の全ての Ruby 1.9 系列
  • Ruby 2.0.0 patchlevel 594 より前の全ての Ruby 2.0 系列
  • Ruby 2.1.4 より前の全ての Ruby 2.1 系列
  • revision 48616 より前の開発版 (trunk)

回避策

もし Ruby を更新することができない場合、2.1系列では回避策として以下のモンキーパッチを適用してください:

class REXML::Entity
  def value
      if @value
        matches = @value.scan(PEREFERENCE_RE)
        rv = @value.clone
        if @parent
          sum = 0
          matches.each do |entity_reference|
            entity_value = @parent.entity( entity_reference[0] )
            if sum + entity_value.bytesize > Security.entity_expansion_text_limit
              raise "entity expansion has grown too large"
            else
              sum += entity_value.bytesize
            end
            rv.gsub!( /%#{entity_reference.join};/um, entity_value )
          end
        end
        return rv
      end
      nil
   end
end

Ruby 2.1.0 よりも古い系列の Ruby では、以下のモンキーパッチを適用してください:

class REXML::Entity
  def value
      if @value
        matches = @value.scan(PEREFERENCE_RE)
        rv = @value.clone
        if @parent
          sum = 0
          matches.each do |entity_reference|
            entity_value = @parent.entity( entity_reference[0] )
            if sum + entity_value.bytesize > Document.entity_expansion_text_limit
              raise "entity expansion has grown too large"
            else
              sum += entity_value.bytesize
            end
            rv.gsub!( /%#{entity_reference.join};/um, entity_value )
          end
        end
        return rv
      end
      nil
   end
end

クレジット

この脆弱性は Willis Vandevanter によって報告されました。

更新履歴

  • 2014-10-27 21:00:00 (JST) 初版

最近のニュース

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

もっと読む...