REXML 中的拒绝服务漏洞

Shugo Maeda 于 2008 年 8 月 23 日发布

包含在 Ruby 标准库中的 REXML 库存在拒绝服务漏洞。所谓的“XML 实体爆炸”攻击技术可用于远程导致解析用户提供的 XML 的任何应用程序崩溃(禁用)。

大多数 Rails 应用程序会受到影响,因为 Rails 默认使用 REXML 解析用户提供的 XML。

影响

攻击者可以通过让 REXML 解析包含递归嵌套实体的文档来造成拒绝服务,例如

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE member [
  <!ENTITY a "&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;">
  <!ENTITY b "&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;">
  <!ENTITY c "&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;">
  <!ENTITY d "&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;">
  <!ENTITY e "&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;">
  <!ENTITY f "&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;">
  <!ENTITY g "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx">
]>
<member>
&a;
</member>

受影响的版本

1.8 系列

  • 1.8.6-p287 及所有先前版本
  • 1.8.7-p72 及所有先前版本

1.9 系列

  • 所有版本

解决方案

请下载以下 monkey patch 来修复此问题。

然后修复您的应用程序,使其在使用 REXML 之前加载 rexml-expansion-fix2.rb。

require "rexml-expansion-fix2"
...
doc = REXML::Document.new(str)
...

如果您有 Rails 应用程序,请将 rexml-expansion-fix2.rb 复制到加载路径中的一个目录(例如 RAILS_ROOT/lib/),并在 config/environment.rb 中添加以下行。

require "rexml-expansion-fix2"

如果您的应用程序是 Rails 2.1 或更高版本,您可以简单地将 rexml-expansion-fix2.rb 复制到 RAILS_ROOT/config/initializers,它将自动加载。

默认情况下,XML 实体扩展限制为 10000。您可以通过更改 REXML::Document.entity_expansion_limit 来更改它。例如:

REXML::Document.entity_expansion_limit = 1000

此修复程序将作为 gem 提供,并被未来版本的 rails 使用,但用户应立即采取纠正措施。

致谢

感谢 ACROS Security 的 Luka Treiber 和 Mitja Kolsek 将此问题披露给 Ruby 和 Rails 安全团队。

感谢 Rails 核心团队的 Michael Koziarski 创建了 monkey patch 来修复此漏洞。

变更

  • 2008-08-29 18:46 +09:00 修正了摘要,以免误导认为此漏洞是 Rails 特有的。
  • 2008-11-09 12:40 +09:00 修正了 monkey patch 的一个 bug

近期新闻

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 日

更多新闻...