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 日