JSON 中的拒绝服务和不安全对象创建漏洞 (CVE-2013-0269)
由 usa 于 2013 年 2 月 22 日发布
Ruby 中捆绑的 json 存在拒绝服务和不安全对象创建漏洞。此漏洞已被分配 CVE 标识符 CVE-2013-0269。我们强烈建议升级 Ruby。
详情
在解析某些 JSON 文档时,JSON 库 (包含在 Ruby 中) 可以被强制在目标系统中创建 Ruby 符号。由于 Ruby 符号不会被垃圾回收,这可能导致拒绝服务攻击。
相同的技术可以用于在目标系统中创建类似于内部对象的对象。这些“类似”的对象可以绕过某些安全机制,并可能成为 Ruby on Rails 中 SQL 注入攻击的跳板。
受影响的代码看起来像这样
JSON.parse(user_input)其中 `user_input` 变量将是一个像这样的 JSON 文档
{"json_class":"foo"}
JSON 库将尝试查找常量 "foo"。查找此常量将创建一个符号。
在 JSON 版本 1.7.x 中,可以使用这样的 JSON 文档创建具有任意属性的对象
{"json_class":"JSON::GenericObject","foo":"bar"}
此文档将导致创建一个 `JSON::GenericObject` 的实例,该实例具有属性 "foo" 且值为 "bar"。实例化这些对象将导致任意符号的创建,在某些情况下可用于绕过安全措施。
请注意:使用 `JSON.load` 时,此行为不会改变。`JSON.load`切勿接受来自未知来源的输入。如果您正在处理来自未知来源的 JSON,务必使用 `JSON.parse`。
所有运行受影响版本的用户都应立即升级或使用以下任一解决方法。
变通方法
对于无法升级 ruby 或 JSON 库的用户,请将您的代码从以下方式更改为
JSON.parse(json)改为这种方式
JSON.parse(json, :create_additions => false)如果您无法更改 `JSON.parse` 的使用方式 (例如,您使用的 gem 依赖于 `JSON.parse`,如 multi_json),则应用此猴子补丁
module JSON
class << self
alias :old_parse :parse
def parse(json, args = {})
args[:create_additions] = false
old_parse(json, args)
end
end
end受影响的版本
- 所有 ruby 1.9 版本,早于 ruby 1.9.3 patchlevel 392
- 所有 ruby 2.0 版本,早于 ruby 2.0.0 patchlevel 0
- 早于 trunk revision 39208
致谢
非常感谢以下人员负责任地披露了此问题,并与 Rails 团队合作进行修复
- Thomas Hollstegge (Zweitag, www.zweitag.de)
- Ben Murphy
历史
- 最初发布于 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 日