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