Rail ActionPack 参数解引发多种漏洞

  • 王兴宗

2013 年 1 月 24 日

话题:RubyRuby on Rails安全语言 & 开发

1 月 8 日,Rails 团队核心成员 Aaron Patterson 公布了CVE-2013-0156,这是一个由 ActionPack 参数解引发的多种漏洞,并且影响版本十分广泛,包括 3.0、3.1、3.2 以及很久没有更新的 2.3 系列。

漏洞的影响

  • 绕过授权系统
  • 注入任意 SQL 语句
  • 拒绝服务攻击
  • 执行任意 Ruby 代码

其中,可以远程执行任意 Ruby 代码(当然包括 Shell 命令,因为 Ruby 可以调用系统 Shell 命令)这一漏洞让大部分开发者和网站感到恐慌,一些网站采取下线的极端应对措施,其中包括荷兰政府的公民数字身份网站

Webrat 的作者 @brynary 在他的博客 中总结了这次漏洞的严重性:

  • 可利用性:容易,攻击脚本随处都可以找到,并且容易使用,只需要传入攻击目标网站的 URL 和想要执行的代码;
  • 影响范围:广泛,所有没升级到最新版本的 Rails 项目都受到影响;
  • 可检测性:容易,不需要和应用相关的知识,就可以实施自动化扫描来检测目标网站是否存在此漏洞;
  • 技术上的影响:严重,攻击者可以应用服务器的权限执行任何 Ruby(当然也可以是 Shell) 脚本,从而劫持整个主机;
  • 商业上的影响:严重,数据可以被窃取,服务器资源可以被攻击者用作恶意用途。

漏洞产生原理

  1. Rails 在解析 XML 的时候是会解析 XML 里内嵌的 YAML 文件的,这要追溯到这个补丁
  2. Ruby 的 YAML Parser 可以创建出任意对象,只要这个类在程序内存中有定义。

这样,攻击者就可以通过提交一个 XML 文件,通过 XML 里内嵌的 YAML 文件来创建一个含有不安全代码的对象,利用 Rails 内部的实现细节触发代码执行来实施攻击。这里是 ronin 提供的漏洞利用的详细代码:https://gist.github.com/4499206

漏洞防御措施

如果是 Rails3 项目,直接升级到最新版本。如果是 Rails2.3 项目,升级到最新版本比较麻烦,可以在项目初始化加载时添加下面两行代码:

ActiveSupport::CoreExtensions::Hash::Conversions::XML_PARSING.delete('symbol') 
ActiveSupport::CoreExtensions::Hash::Conversions::XML_PARSING.delete('yaml') 
RubyRuby on Rails安全语言 & 开发