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.text

Wenn 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
end

Dieser 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

Weitere Neuigkeiten...