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

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) 初版