关于 Exception#to_s / NameError#to_s 的 $SAFE 转义漏洞 (CVE-2012-4464, CVE-2012-4466)

发现了 Exception#to_s、NameError#to_s 和 name_err_mesg_to_s() (Ruby 解释器内部 API) 的漏洞。恶意用户代码可以利用这些安全漏洞之一绕过 $SAFE 检查。

详情

Ruby 的 $SAFE 机制使不受信任的用户代码能够在 $SAFE >= 4 模式下运行。这是一种沙箱机制,因此在该模式下会限制某些操作,以保护沙箱外的其他数据。

发现的问题围绕着这个机制。Exception#to_s、NameError#to_s 和 name_err_mesg_to_s() 解释器内部 API 没有正确处理 $SAFE 位,因此,一个非污染的 String 对象可以通过它们被破坏性地标记为已污染。 通过使用此漏洞,沙箱中不受信任的代码可以破坏性地修改先前未污染的字符串。

Ruby 1.8 曾经有 类似的安全问题。它修复了 Exception#to_s 和 NameError#to_s,但 name_err_mesg_to_str() 的问题在之前的安全修复中仍然存在。

受影响版本

  • 所有 Ruby 1.8.7,低于 patchlevel 371 的版本
  • 所有 Ruby 1.9.3,低于 patchlevel 286 的版本
  • 所有 Ruby 2.0 的开发分支,低于 revision r37068 的版本

解决方案

升级到最新版本。

贡献者

此漏洞由 Tyler Hickes 发现。

更新

  • 最初发布于 2012-10-12 19:17:50 JST。