CVE-2014-8080: Denial of Service pada Ekspansi XML

Ekspansi entity yang tidak dilarang dapat menyebabkan celah DoS pada REXML. Celah tersebut telah ditetapkan dalam CVE identifier CVE-2014-8080. Kami sangat merekomendasikan untuk memperbarui versi Ruby.

Detil

Ketika membaca ujung teks sebuah dokumen XML, REXML parser dapat dipaksa untuk mengalokasikan objek string yang sangat besar yang mana dapat mengonsumsi keseluruhan memori dalam sebuah mesin, menyebabkan denial of service.

Imbas tersebut akan terlihat seperti kode berikut:

require 'rexml/document'

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

p REXML::Document.new(xml)

Semua pengguna yang terkenda imbas ini seharusnya memperbarui versi segera atau menggunakan salah satu solusi berikut.

Versi yang terkena imbas

  • Semua Ruby versi 1.9 sebelum rilis Ruby 1.9.3 patchlevel 550
  • Semua Ruby versi 2.0 sebelum rilis Ruby 2.0.0 patchlevel 594
  • Semua Ruby versi 2.1 sebelum rilis Ruby 2.1.4
  • sebelum revisi trunk 48161

Solusi

Jika Anda tidak dapat memperbarui Ruby, gunakan monkey patch ini sebagai solusi untuk 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

Untuk versi Ruby di bawah 2.1.0, Anda dapat gunakan monkey patch berikut ini:

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

Credit

Terima kasih Willis Vandevanter telah melaporkan masalah ini.

Histori

  • Semula diterbitkan pada 2014-10-27 12:00:00 (UTC)