DoS-Schwachstelle bei der Entitätenerweiterung in REXML (XML-Bombe, CVE-2013-1821)
Gepostet von usa am 22. Feb 2013
Unbeschränkte Entitätenerweiterung kann zu einer DoS-Schwachstelle in REXML führen. Diese Schwachstelle wurde unter der CVE-Kennung CVE-2013-1821 zugewiesen. Wir empfehlen dringend, Ruby zu aktualisieren.
Details
Beim Lesen von Textknoten aus einem XML-Dokument kann der REXML-Parser dazu gebracht werden, extrem große String-Objekte zuzuweisen, die den gesamten Speicher einer Maschine verbrauchen und so eine Denial-of-Service-Attacke auslösen können.
Betroffener Code sieht ungefähr so aus:
document = REXML::Document.new some_xml_doc
document.root.textWenn die `text`-Methode aufgerufen wird, werden Entitäten expandiert. Ein Angreifer kann ein relativ kleines XML-Dokument senden, das bei der Auflösung der Entitäten extrem viel Speicher auf dem Zielsystem verbraucht.
Beachten Sie, dass dieser Angriff dem "Billion Laughs"-Angriff ähnelt, aber davon abweicht. Er steht auch im Zusammenhang mit CVE-2013-1664 von Python.
Alle Benutzer, die eine betroffene Version ausführen, sollten entweder ein Upgrade durchführen oder umgehend eine der Problemumgehungen verwenden.
Problemumgehungen
Wenn Sie Ruby nicht aktualisieren können, verwenden Sie diesen Monkey Patch als Workaround
class REXML::Document
@@entity_expansion_text_limit = 10_240
def self.entity_expansion_text_limit=( val )
@@entity_expansion_text_limit = val
end
def self.entity_expansion_text_limit
@@entity_expansion_text_limit
end
end
class REXML::Text
def self.unnormalize(string, doctype=nil, filter=nil, illegal=nil)
sum = 0
string.gsub( /\r\n?/, "\n" ).gsub( REFERENCE ) {
s = self.expand($&, doctype, filter)
if sum + s.bytesize > REXML::Document.entity_expansion_text_limit
raise "entity expansion has grown too large"
else
sum += s.bytesize
end
s
}
end
def self.expand(ref, doctype, filter)
if ref[1] == ?#
if ref[2] == ?x
[ref[3...-1].to_i(16)].pack('U*')
else
[ref[2...-1].to_i].pack('U*')
end
elsif ref == '&'
'&'
elsif filter and filter.include?( ref[1...-1] )
ref
elsif doctype
doctype.entity( ref[1...-1] ) or ref
else
entity_value = DocType::DEFAULT_ENTITIES[ ref[1...-1] ]
entity_value ? entity_value.value : ref
end
end
endDieser Monkey Patch begrenzt die Größe von Entitätssubstitutionen auf 10 KB pro Knoten. REXML erlaubt standardmäßig nur 10.000 Entitätssubstitutionen pro Dokument, sodass die maximale Textmenge, die durch Entitätssubstitution erzeugt werden kann, etwa 98 Megabyte beträgt.
Betroffene Versionen
- Alle Ruby 1.9-Versionen vor Ruby 1.9.3 Patchlevel 392
- Alle Ruby 2.0-Versionen vor Ruby 2.0.0 Patchlevel 0
- Vor Trunk-Revision 39384
Credits
Vielen Dank an Ben Murphy für die Meldung dieses Problems.
Verlauf
- CVE-Nummer hinzugefügt am 2013-03-11 07:45:00 (UTC)
- Ursprünglich veröffentlicht am 2013-02-22 12:00:00 (UTC)
Aktuelle Nachrichten
Ruby 4.0.0 veröffentlicht
Wir freuen uns, die Veröffentlichung von Ruby 4.0.0 bekannt zu geben. Ruby 4.0 führt „Ruby Box“ und „ZJIT“ ein und bringt viele Verbesserungen mit sich.
Veröffentlicht von naruse am 25. Dez 2025
Ein neuer Look für Rubys Dokumentation
Nach dem Redesign von ruby-lang.org gibt es weitere Neuigkeiten zur Feier des 30-jährigen Jubiläums von Ruby: docs.ruby-lang.org hat ein komplett neues Erscheinungsbild mit Aliki – dem neuen Standard-Theme von RDoc.
Veröffentlicht von Stan Lo am 23. Dez 2025
Neues Website-Erscheinungsbild
Wir freuen uns, ein umfassendes Redesign unserer Website bekannt zu geben. Das Design für dieses Update wurde von Taeko Akatsuka erstellt.
Veröffentlicht von Hiroshi SHIBATA am 22. Dez 2025
Ruby 4.0.0 preview3 veröffentlicht
Wir freuen uns, die Veröffentlichung von Ruby 4.0.0-preview3 bekannt zu geben. Ruby 4.0 führt Ruby::Box und „ZJIT“ ein und bringt viele Verbesserungen mit sich.
Veröffentlicht von naruse am 18. Dez 2025