CVE-2014-8080: XML 확장의 서비스 거부공격(DoS)

REXML에서 무제한 엔티티 확장이 DoS 취약점이 될 수 있습니다. 이 취약점은 CVE ID CVE-2014-8080에 할당 되었습니다. 루비를 업그레이드하시기를 강력히 권합니다.

상세 정보

XML 문서로부터 텍스트 노드를 판독 할 때, REXML 파서에서, 서비스 거부를 유발하는 시스템의 모든 메모리를 소비 할 수 있는 매우 큰 문자열 객체의 할당이 강요 될 수 있습니다.

이런 코드가 영향을 받을 수 있습니다.

require 'rexml/document'

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

p REXML::Document.new(xml)

영향 받는 릴리스를 사용하시는 모든 분들은 즉시 업그레이드 하시거나 해결 방법 중 하나를 사용하셔야 합니다.

영향받는 버전

  • 루비 1.9.3 패치레벨 550 이전의 모든 루비 1.9 버전
  • 루비 2.0.0 패치레벨 594 이전의 모든 루비 2.0 버전
  • 루비 2.1.4 이전의 모든 루비 2.1 버전
  • 리비전 48161 이전의 트렁크

해결 방법

만약 루비를 업그레이드 할 수 없다면 루비 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

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

참여자

이 이슈를 보고해주신 Willis Vandevanter 님께 감사드립니다.

수정 이력

  • 2014-10-27 12:00:00 (UTC) 최초 공개