2011年6月8日,星期三

Ruby on Rails 应用程序中潜在的 XSS 漏洞

由 aaronp 发布

近期版本的 Ruby on Rails 中 XSS 防护支持允许某些字符串操作,当与用户提供的数据结合使用时,可能会导致“不安全字符串”被错误地视为安全。应用程序调用这些方法的可能性很小,但我们今天发布了新版本,以防止其被意外调用。

XSS 防护如何工作

当字符串渲染到客户端时,如果字符串未被标记为“html safe”(HTML 安全),则该字符串将自动被转义并标记为“html safe”。一些助手方法会自动返回已标记为安全的字符串。

例如

<%= link_to('hello world', @user) %>

`link_to` 方法将返回一个被标记为 html safe 的字符串。由于 `link_to` 返回一个“html safe”字符串(也称为安全缓冲区),文本将被直接输出,这意味着用户看到的是一个链接标签而不是转义后的 HTML。

问题所在

安全缓冲区可以通过 `sub!` 等方法进行就地修改。这些方法可以将不安全字符串添加到安全缓冲区中,而安全缓冲区将继续被标记为安全。

一个示例问题可能如下所示

<%= link_to('hello world', @user).sub!(/hello/, params[:xss])  %>

在上面的示例中,一个不受信任的字符串 (`params[:xss]`) 被添加到 `link_to` 返回的安全缓冲区中,并且该不受信任的内容已成功发送到客户端而未被转义。为了防止这种情况发生,`sub!` 和其他类似方法在被调用到安全缓冲区上时将引发异常。

除了就地修改版本外,这些方法中一些返回字符串副本的版本也会错误地将字符串标记为安全。例如

<%= link_to('hello world', @user).sub(/hello/, params[:xss]) %>

新版本现在将确保这些方法在安全缓冲区上返回的所有字符串都被标记为不安全。

受影响的版本

此问题影响所有版本的 rails:3.1.0.rc1、3.0.7 和 2.3.11。

解决方案

任何在不转义输入的情况下修改安全缓冲区的操作现在将引发异常。

如果你需要修改一个安全缓冲区,请通过调用 `to_str` 方法将其转换为 Ruby 字符串。

<%= link_to('hello world', @user).to_str.sub!(/hello/, params[:xss]) %>

升级

此问题已在 Rails 3.1.0.rc2、3.0.8 和 2.3.12(带有 `rails_xss`)中修复。如果由于某种原因你无法升级你的 Rails 安装,请应用这些补丁。

致谢

感谢 LinuxFr.org 的 Bruno Michel 和 Brett Valantine,他们各自独立向我们报告了此问题。