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 日

更多新闻...