2009 年 6 月 3 日,星期三

authenticate_with_http_digest 中的安全问题

作者:michael

据报道,Ruby on Rails 中的摘要认证代码存在安全问题。此漏洞可能允许用户绕过您的密码保护机制。此漏洞已在多个网站上公开,建议用户立即采取下列缓解措施。

问题源于对 authenticate_or_request_with_http_digest 传入块的处理。此块必须返回明文形式的用户密码或用户的 sha1 哈希密码。遗憾的是,文档对此说法不够明确,并且在引用的示例中,如果找不到用户,则会返回 nil。如果用户不存在,正确的行为应该是返回 false

如果返回值为 nil,则 rails 会针对提供的密码对该值进行验证。基于此,攻击者可以提供一个无效的用户名且不提供密码,并且可以成功验证。

已修复的版本

我们已更改相关代码的行为,将 nil 设置为验证失败。此修复程序已推送到 2-3-stable 中,并且会在未来几天发布的 2.3.3 中提供。在提交 1ad57cfe2fbda58439e4b7f84008ad23bc68e8b0 之后的 edge rails 的所有版本都包含此修复程序。

保护您的应用程序应采取的步骤。

用户无需升级即可保护自己,只需确保他们的身份验证块从不返回 nil 即可。举个文档中的例子

authenticate_or_request_with_http_digest(REALM) do |username| USERS[username] end

应该改为类似于以下形式

authenticate_or_request_with_http_digest(REALM) do |username| USERS[username] || false end

披露说明

由于沟通困难以及报告者和安全团队之间的误解。此漏洞已在多个网站上公开披露,建议用户立即更新其应用程序。我们正采取措施,确保今后安全电子邮件的可靠性会更高。我们对此披露的性质表示遗憾,并会努力确保今后不再发生此类事件。