2006年8月10日,星期四

Rails 1.1.6,回溯修补和完全披露

作者:David

纸包不住火,所以现在就来详细披露当前的这个安全漏洞。在 Rails 1.1.0 到 1.1.5 (不包括短暂发布的 1.1.3) 版本中,由于 Rails 路由代码中的一个 bug,你可以通过 URL 触发 Ruby 代码的执行。这意味着你可以通过启动类似 /script/profiler 这样的请求,基本上可以使一个 Rails 进程崩溃,因为该代码会长时间运行,并且在该进程执行期间会被挂起。其他 URL 甚至可能导致数据丢失。

对于那些无法更新版本的用户,我们已将修复补丁回溯到所有受影响的版本。你需要为你的版本应用相应的 diff。

这些补丁(以及 1.1.6 版本)会破坏使用第三方引擎(engines)概念的应用。因此,如果你因为依赖这些引擎而无法升级,你也可以在更新引擎期间添加以下 URL 阻止规则。以下是如何在 Apache 的 mod_rewrite 下实现:

RewriteRule ^(app|components|config|db|doc|lib|log|public|script|test|tmp|vendor)/ - [F]

以下是如何在 lighttpd 下实现:

url.rewrite-once = ( "^/(app|components|config|db|doc|lib|log|public|script|test|tmp|vendor)/" => "index.html" )

不幸的是,昨天发布的 1.1.5 版本只部分修复了这个漏洞(消除了最严重的数据丢失风险)。在了解了问题的详细程度后,我们现在发布了 1.1.6 版本,它完全修复了该漏洞的所有风险(使用了与上述回溯修补相同的技术)。

所以,如果你昨天升级到了 1.1.5,你需要再次升级。方法保持不变,但由于 Rubyforge 的 gem 服务器分发 gem 更新可能非常缓慢,你应该直接从 Rails 服务器获取这个修复。

sudo gem install rails --source http://gems.rubyonrails.org --include-dependencies

如果你使用的是 trunk(也称为 edge)版本,并且 revision 号是 4394 或更高,那么你不受任何形式的影响。

我们将尽快提供更多信息。毋庸置疑,这正是 Rails 核心团队目前正在全力处理的事情,我们还招募了一大批测试人员来帮助我们解决这个问题。我们将确保评估所有收到的反馈,并制定一些经验教训来处理未来的安全问题。感谢你的持续理解。

我们还在 Freenet 上启动了 #rails-security 频道,供有 IRC 条件的用户获取和分享更多信息。

更新:如果你使用 gem (没有 vendor/rails),请确保在你的 config/environment.rb 中更新 RAILS_GEM_VERSION。否则,即使安装了新 gem,你仍然会绑定到之前的 Rails 版本。

更新 2:Rails 1.1.6 现已在官方 gem 服务器上可用,因此你不再需要添加 —source http://gems.rubyonrails.org 参数。