CVE-2014-8080: Denial of Service XML Expansion

Gepostet von zzak am 27. Okt 2014

Unbeschränkte Entitätsexpansion kann zu einer DoS-Schwachstelle in REXML führen. Diese Schwachstelle wurde unter der CVE-Nummer CVE-2014-8080 registriert. 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 aufbrauchen und so einen Denial-of-Service verursachen können.

Betroffener Code sieht ungefähr so aus:

require 'rexml/document'

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

p REXML::Document.new(xml)

Alle Benutzer, die eine betroffene Version ausführen, sollten entweder ein Upgrade durchführen oder umgehend eine der Problemumgehungen verwenden.

Betroffene Versionen

  • Alle Ruby 1.9-Versionen vor Ruby 1.9.3 patchlevel 550
  • Alle Ruby 2.0-Versionen vor Ruby 2.0.0 patchlevel 594
  • Alle Ruby 2.1-Versionen vor Ruby 2.1.4
  • vor Trunk-Revision 48161

Problemumgehungen

Wenn Sie Ruby nicht aktualisieren können, verwenden Sie diesen Monkey-Patch als Workaround für Versionen von Ruby 2.1.0+

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

Für Ruby-Versionen älter als 2.1.0 können Sie den folgenden Monkey-Patch verwenden

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

Credits

Vielen Dank an Willis Vandevanter für die Meldung dieses Problems.

Verlauf

  • Ursprünglich veröffentlicht am 2014-10-27 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...