CVE-2014-8080: Tấn công từ chối dịch vụ bằng mở rộng XML

Đăng bởi zzak vào 27 Oct 2014

Mở rộng entity không giới hạn có thể dẫn đến lỗ hổng DoS trong REXML. Lỗ hổng này đã được gán mã định danh CVE CVE-2014-8080. Chúng tôi khuyến nghị mạnh mẽ nâng cấp Ruby.

Chi tiết

Khi đọc các nút văn bản từ tài liệu XML, bộ phân tích REXML có thể bị buộc phải cấp phát các đối tượng chuỗi cực lớn có thể tiêu thụ toàn bộ bộ nhớ trên máy, gây ra từ chối dịch vụ.

Mã bị ảnh hưởng sẽ trông như thế này:

require 'rexml/document'

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

p REXML::Document.new(xml)

Tất cả người dùng đang chạy phiên bản bị ảnh hưởng nên nâng cấp hoặc sử dụng một trong các giải pháp tạm thời ngay lập tức.

Các phiên bản bị ảnh hưởng

  • Tất cả phiên bản Ruby 1.9 trước Ruby 1.9.3 patchlevel 550
  • Tất cả phiên bản Ruby 2.0 trước Ruby 2.0.0 patchlevel 594
  • Tất cả phiên bản Ruby 2.1 trước Ruby 2.1.4
  • trước trunk revision 48161

Giải pháp tạm thời

Nếu bạn không thể nâng cấp Ruby, hãy sử dụng monkey patch này làm giải pháp tạm thời trên các phiên bản 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

Đối với các phiên bản Ruby cũ hơn 2.1.0, bạn có thể sử dụng monkey patch sau:

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

Ghi công

Cảm ơn Willis Vandevanter đã báo cáo vấn đề này.

Lịch sử

  • Công bố lần đầu vào 2014-10-27 12:00:00 (UTC)

Tin mới nhất

Phát hành Ruby 4.0.0

Chúng tôi vui mừng thông báo phát hành Ruby 4.0.0. Ruby 4.0 giới thiệu “Ruby Box” và “ZJIT”, cùng nhiều cải tiến khác.

Đăng bởi naruse vào 25 Dec 2025

Diện mạo mới cho tài liệu Ruby

Tiếp theo việc thiết kế lại ruby-lang.org, chúng tôi có thêm tin vui để kỷ niệm 30 năm Ruby: docs.ruby-lang.org có diện mạo hoàn toàn...

Đăng bởi Stan Lo vào 23 Dec 2025

Thêm Tin...