Zamieszczone przez zzak 2014-10-27
                         Tłumaczone przez crabonature
Nieograniczony rozrost encji może prowadzić do podatności na DoS w REXML. Tej podatności został przypisany identyfikator CVE-2014-8080. Zdecydowanie zalecamy aktualizację Rubiego.
Szczegóły
Podczas czytania węzłów tekstu z dokumentu XML, parser REXML może zostać zmuszony do alokowania bardzo dużych napisów, które mogą zająć całą dostępną pamięć maszyny, powodując odmowę usługi.
Kod może wyglądać następująco:
require 'rexml/document'
xml = <<XML
<!DOCTYPE root [
  # ENTITY expansion vector
]>
<cd></cd>
XML
p REXML::Document.new(xml)Wszyscy użytkownicy używający podatnej wersji powinni natychmiast zaktualizować ją lub użyć obejścia problemu.
Podatne wersje
- Dla 1.9 wszystkie wcześniejsze wersje od 1.9.3 patchlevel 550
 - Dla 2.0 wszystkie wcześniejsze wersje od 2.0.0 patchlevel 594
 - Dla 2.1 wszystkie wcześniejsze wersje od 2.1.4
 - Wcześniej niż rewizja trunk 48161
 
Obejście
Jeśli nie możesz zaktualizować Rubiego, użyj tej łatki jako obejście problemu dla wersji Rubiego 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
endDla wersji Rubiego starszych niż 2.1.0, możesz użyć poniższej łatki:
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
endPodziękowania
Podziękowania dla Willisa Vandevantera za zgłoszenie tego problemu.
Historia
- Oryginalnie opublikowane 2014-10-27 12:00:00 (UTC)