Ruby 中的 DL 和 Fiddle 对象污点绕过 (CVE-2013-2065)

usa 于 2013 年 5 月 14 日发布

Ruby 中的 DL 和 Fiddle 存在漏洞,允许系统调用使用受污染的字符串,而不考虑 Ruby 中设置的 $SAFE 级别。此漏洞已被分配 CVE 标识符 CVE-2013-2065。

影响

Ruby 的 DL 或 Fiddle 暴露给 Ruby 的原生函数不会检查传入对象的污染值。这可能导致在应抛出 SecurityError 异常时,却接受了被污染的对象作为输入。

受影响的 DL 代码看起来会是这样:

def my_function(user_input)
  handle    = DL.dlopen(nil)
  sys_cfunc = DL::CFunc.new(handle['system'], DL::TYPE_INT, 'system')
  sys       = DL::Function.new(sys_cfunc, [DL::TYPE_VOIDP])
  sys.call user_input
end

$SAFE = 1
my_function "uname -rs".taint

受影响的 Fiddle 代码看起来会是这样:

def my_function(user_input)
  handle    = DL.dlopen(nil)
  sys = Fiddle::Function.new(handle['system'],
                             [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
  sys.call user_input
end

$SAFE = 1
my_function "uname -rs".taint

所有运行受影响版本的用户都应立即升级或使用以下任一解决方法。

请注意,这不会阻止将数字内存偏移量用作指针值。数字不能被污染,因此无法检查传递数字内存偏移量的代码。例如:

def my_function(input)
  handle    = DL.dlopen(nil)
  sys = Fiddle::Function.new(handle['system'],
                             [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
  sys.call input
end

$SAFE = 1
user_input = "uname -rs".taint
my_function DL::CPtr[user_input].to_i

在这种情况下,会传递内存位置,DL/Fiddle 无法确定对象的污染状态。在这种情况下,请在传递内存位置之前检查用户输入的污染情况。

user_input = "uname -rs".taint
raise if $SAFE >= 1 && user_input.tainted?
my_function DL::CPtr[user_input].to_i

变通方法

如果您无法升级 Ruby,可以使用此 monkey patch 作为一种变通方法。

class Fiddle::Function
  alias :old_call :call
  def call(*args)
    if $SAFE >= 1 && args.any? { |x| x.tainted? }
      raise SecurityError, "tainted parameter not allowed"
    end
    old_call(*args)
  end
end

受影响的版本

  • 所有 Ruby 1.9 版本,在 426 补丁级别之前的 1.9.3 版本
  • 所有 Ruby 2.0 版本,在 195 补丁级别之前的 2.0.0 版本
  • 在 trunk revision 40728 之前的版本

Ruby 1.8 版本不受影响。

致谢

感谢 Vit Ondruch 报告此问题。

历史

  • 最初发布于 2013-05-14 13: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 日

更多新闻...