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 日