由 usa 于 2012 年 10 月 12 日发布
发现一个漏洞,文件创建例程可以通过在文件路径中策略性地插入 NUL 字符来创建意外的文件。此漏洞已报告为 CVE-2012-4522。
详情
Ruby 可以将任意二进制模式作为字符串处理,包括 NUL 字符。另一方面,操作系统和其他库往往不会这样。它们通常将 NUL 视为字符串的结束标记。因此,为了将它们与 Ruby 连接起来,应正确避免使用 NUL 字符。
然而,像 IO#open 这样的方法并没有检查传递给它们的文件名,而是直接将这些字符串传递给底层例程。这导致了创建意外的文件,例如这样
p File.exists?("foo") #=> false
open("foo\0bar", "w") { |f| f.puts "hai" }
p File.exists?("foo") #=> true
p File.exists?("foo\0bar") #=> raises ArgumentError
受影响的版本
- 所有 Ruby 1.9.3,低于 patchlevel 286 的版本
- 所有 Ruby 2.0.0 的开发分支,低于修订版 r37163 的版本
解决方案
升级到最新版本。
鸣谢
此问题由 Peter Bex 报告。
更新
- 于 2012-10-19 14:54:49 JST 修复了错别字。
- 于 2012-10-16 08:58:51 JST 添加了关于 CVE 编号的提及。
- 最初发布于 2012-10-12 19:19:55 JST。