Ruby on Rails 的 digest 认证代码出现了一个安全问题。此漏洞可能允许用户绕过您的密码保护。此漏洞已在多个网站上公开披露,建议用户立即采取以下缓解措施。
问题出在对 authenticate_or_request_with_http_digest 传递的块的处理方式。该块必须以明文形式返回用户的密码,或者返回用户密码的 sha1 哈希值。不幸的是,文档在这方面不够清晰,并且引用的示例会在用户未找到时返回 nil。用户不存在时的正确行为是返回 false。
如果返回值是 nil,Rails 会继续将此值与提供的密码进行验证。因此,攻击者可以提供无效的用户名和密码,认证将成功。
我们已经修改了相关代码的行为,将 nil 视为认证失败。此修复已推送到 2-3-stable 分支,并将包含在未来几天发布的 2.3.3 版本中。edge rails 中提交 1ad57cfe2fbda58439e4b7f84008ad23bc68e8b0 之后的所有版本都包含此修复。
用户可以通过确保他们的认证块从不返回 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
由于报告人与安全团队之间沟通不畅和误解。此漏洞已在多个网站上公开披露,建议用户立即更新其应用程序。我们正在采取措施确保今后安全邮件的可靠性。我们对此次披露的方式表示遗憾,并将努力确保此类事件不再发生。