ash_authentication 存在邮件链接自动点击导致账户被意外确认的漏洞
漏洞标识符: CVE-2025-32782
GitHub 咨询数据库 ID: GHSA-3988-q8q7-p787
严重等级: 中危 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N)
概述
ash_authentication 库是用于 Erlang 应用程序的身份验证组件。该库在账户创建流程中,通过电子邮件向用户发送确认链接。由于确认操作是通过用户点击链接(触发一个 GET 请求)来完成的,当某些电子邮件客户端、病毒扫描程序或邮件预览工具自动访问或“预取”该链接时,可能导致账户在用户不知情的情况下被意外确认。
影响
- 核心问题: 攻击者可以使用他人的电子邮件地址注册账户,并可能由于受害者的邮件客户端自动跟踪链接而完成账户确认。
- 影响范围: 此漏洞仅限于新账户的确认过程。它不会允许攻击者接管或访问现有账户或私有数据。
受影响的版本
ash_authentication 版本 < 4.7.0
已修复的版本
ash_authentication 版本 >= 4.7.0
修复方案
修复方案已在版本 4.7.0 中发布。核心修复是将确认流程从通过 GET 请求自动完成,更改为需要明确的用户交互(例如在确认页面上点击按钮),从而确保邮件客户端的自动链接预取或扫描不会无意中确认账户。
具体升级和配置步骤:
- 升级核心库: 升级
ash_authentication到版本 4.7.0 或更高。 - 升级配套库(如适用): 如果你使用
ash_authentication_phoenix,需要升级到版本 2.6.0 或更高,以利用自动生成的确认视图。 - 修改确认策略: 在你的确认策略中设置
require_interaction? true。1 2 3 4confirmation <strategy_name> do ... require_interaction? true end - 添加确认路由(如适用): 如果你使用
ash_authentication_phoenix并希望使用新的内置确认流程,需要在路由器中添加confirm_route。重要提示: 如果使用了路径选项且路径以/auth(或你配置的auth_routes_prefix)开头,请确保此路由放置在auth_routes之上,因为auth_routes会贪婪地处理其配置路径下的所有路由。注意: 如果升级到 4.7.0 版本但未将1 2 3 4 5 6 7 8 9confirm_route( MyApp.Accounts.User, <confirmation_strategy_name>, auth_routes_prefix: "/auth", overrides: [MyAppWeb.AuthOverrides, AshAuthentication.Phoenix.Overrides.Default], # 使用以下选项可保持与当前已发出的确认邮件的兼容性 path: "/auth/user/<confirmation_strategy_name>", token_as_route_param?: false )require_interaction?设置为true,编译将失败并提示链接到本公告的错误信息。只有在确信自己不受影响时,才可以绕过此错误。
变通方案(在不升级的情况下)
如果不便立即升级,可以通过禁用库提供的确认路由并创建自定义的 LiveView 来实现修复。核心思路是:将确认链接中的令牌作为参数取出,放入一个隐藏的表单字段,该表单仅包含一个提交按钮,通过 POST 请求(而不是 GET)发送到原始的确认 URL。如果使用 LiveView,可以通过 phx-trigger-action 和 phx-action 来实现。但官方强烈建议通过升级来利用内置的修复视图。
安全弱点(CWE)
- CWE-306:关键功能缺少身份验证 - 该产品未对需要可证明用户身份的功能执行任何身份验证。
参考链接
致谢
此漏洞由社区成员和 GitHub 安全团队协同处理,特别感谢 zachdaniel(修复开发者)、jimsynz、barnabasJ(修复审查者)、maennchen(分析师)以及 sevenseacat(修复验证者)的贡献。