由 usa 发布于 2013 年 2 月 22 日
Ruby 捆绑的 json 中存在拒绝服务和不安全对象创建漏洞。此漏洞已被分配 CVE 标识符 CVE-2013-0269。我们强烈建议升级 Ruby。
详细信息
在解析某些 JSON 文档时,JSON gem(包括 Ruby 捆绑的)可以被强制在目标系统中创建 Ruby 符号。由于 Ruby 符号不会被垃圾回收,这可能导致拒绝服务攻击。
相同的技术可用于在目标系统中创建类似于内部对象的对象。这些“行为相似”的对象可用于绕过某些安全机制,并可用作 Ruby on Rails 中 SQL 注入攻击的跳板。
受影响的代码如下所示
JSON.parse(user_input)
其中 `user_input` 变量将具有如下 JSON 文档
{"json_class":"foo"}
JSON gem 将尝试查找常量“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 gem 的用户,请将您的代码从这里更改为
JSON.parse(json)
更改为这里
JSON.parse(json, :create_additions => false)
如果您无法更改 `JSON.parse` 的用法(例如,您正在使用依赖于 `JSON.parse` 的 gem,如 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.3 patchlevel 392 的 ruby 1.9 版本
- 所有早于 ruby 2.0.0 patchlevel 0 的 ruby 2.0 版本
- 早于 trunk 版本 39208
鸣谢
非常感谢以下人员负责任地披露此问题,并与 Rails 团队合作修复此问题
- Zweitag 的 Thomas Hollstegge (www.zweitag.de)
- Ben Murphy
历史
- 最初发布于 2013-02-22 12:00:00 (UTC)