异常方法可以绕过 $SAFE

Urabe Shyouhei 发布于 2011 年 2 月 18 日

Exception#to_s 方法可用于欺骗 $SAFE 检查,使不受信任的代码能够修改任意字符串。

详细描述

在 Ruby 的 $SAFE 语义中,安全级别 4 用于运行不受信任的代码(例如插件)。因此,在较高的安全级别下,某些操作是被禁止的,以防止不受信任的代码攻击外部(受信任的)数据。

Exception#to_s 被发现存在问题。该方法可以欺骗安全级别机制,并破坏性地修改一个未被标记的字符串使其被标记。通过这种方式,攻击者可以修改任意未被标记的字符串,例如:

$secret_path = "foo"

proc do
    $SAFE = 4
    Exception.new($secret_path).to_s
    $secret_path.replace "/etc/passwd"
end.call

open($secret_path) do
  ...
end

受影响的版本

幸运的是,此攻击对 Ruby 的 1.9.x 系列无效。受影响的版本仅限于:

  • Ruby 1.8.6 patchlevel 420 及之前的所有版本
  • Ruby 1.8.7 patchlevel 330 及之前的所有版本
  • Ruby 1.8 的开发版本 (1.8.8dev)

解决方案

请升级到较新版本。

更新

近期新闻

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 日

更多新闻...