REXML 中的实体扩展 DoS 漏洞 (XML 炸弹, CVE-2013-1821)

usa 于 2013 年 2 月 22 日发布

REXML 中不受限制的实体扩展可能导致 DoS 漏洞。此漏洞已被分配 CVE 标识符 CVE-2013-1821。我们强烈建议升级 Ruby。

详情

在读取 XML 文档的文本节点时,REXML 解析器可能会被诱导分配极其巨大的字符串对象,从而耗尽机器上的所有内存,导致拒绝服务。

受影响的代码看起来是这样的

document = REXML::Document.new some_xml_doc
document.root.text

当调用 `text` 方法时,实体将被展开。攻击者可以发送一个相对较小的 XML 文档,当解析这些实体时,会消耗目标系统上极其大量的内存。

请注意,此攻击与“十亿个笑话”攻击类似,但有所不同。它也与 Python 的 CVE-2013-1664 相关。

所有运行受影响版本的用户都应立即升级或使用以下任一解决方法。

变通方法

如果无法升级 Ruby,请使用此 monkey patch 作为临时解决方案。

class REXML::Document
  @@entity_expansion_text_limit = 10_240

  def self.entity_expansion_text_limit=( val )
    @@entity_expansion_text_limit = val
  end

  def self.entity_expansion_text_limit
    @@entity_expansion_text_limit
  end
end

class REXML::Text
  def self.unnormalize(string, doctype=nil, filter=nil, illegal=nil)
    sum = 0
    string.gsub( /\r\n?/, "\n" ).gsub( REFERENCE ) {
      s = self.expand($&, doctype, filter)
      if sum + s.bytesize > REXML::Document.entity_expansion_text_limit
        raise "entity expansion has grown too large"
      else
        sum += s.bytesize
      end
      s
    }
  end

  def self.expand(ref, doctype, filter)
    if ref[1] == ?#
      if ref[2] == ?x
        [ref[3...-1].to_i(16)].pack('U*')
      else
        [ref[2...-1].to_i].pack('U*')
      end
    elsif ref == '&'
      '&'
    elsif filter and filter.include?( ref[1...-1] )
      ref
    elsif doctype
      doctype.entity( ref[1...-1] ) or ref
    else
      entity_value = DocType::DEFAULT_ENTITIES[ ref[1...-1] ]
      entity_value ? entity_value.value : ref
    end
  end
end

此 monkey patch 将每个节点的实体替换大小限制为 10k。REXML 默认允许每个文档最多进行 10000 次实体替换,因此通过实体替换生成的文本最大量约为 98MB。

受影响的版本

  • 所有 Ruby 1.9 版本,在 ruby 1.9.3 patchlevel 392 之前
  • 所有 Ruby 2.0 版本,在 ruby 2.0.0 patchlevel 0 之前
  • 在 trunk revision 39384 之前

致谢

感谢 Ben Murphy 报告此问题。

历史

  • 于 2013-03-11 07:45:00 (UTC) 添加了 CVE 编号。
  • 最初发布于 2013-02-22 12:00:00 (UTC)

近期新闻

Ruby 4.0.0 发布

我们很高兴地宣布 Ruby 4.0.0 的发布。Ruby 4.0 引入了“Ruby Box”和“ZJIT”,并增加了许多改进。

naruse 发布于 2025 年 12 月 25 日

Ruby 文档的全新外观

继 ruby-lang.org 重新设计之后,我们还有更多好消息来庆祝 Ruby 成立 30 周年:docs.ruby-lang.org 采用了 Aliki——RDoc 的新默认主题,焕然一新。

Stan Lo 发布于 2025 年 12 月 23 日

重新设计我们的网站标识

我们很高兴地宣布对我们的网站进行全面重新设计。此次更新的设计由 Akatsuka Taeko 创作。

Hiroshi SHIBATA 发布于 2025 年 12 月 22 日

Ruby 4.0.0 preview3 发布

我们很高兴地宣布 Ruby 4.0.0-preview3 的发布。Ruby 4.0 引入了 Ruby::Box 和“ZJIT”,并增加了许多改进。

naruse 发布于 2025 年 12 月 18 日

更多新闻...