ash_authentication 库存在邮件链接自动点击导致账户被意外确认的安全漏洞

文章详细分析了 Erlang 库 ash_authentication 中的一个安全漏洞(CVE-2025-32782),该漏洞允许攻击者利用邮件客户端或安全工具的自动链接点击功能,在无需用户交互的情况下确认新注册的账户,并提供了修复方法和缓解措施。

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 请求自动完成,更改为需要明确的用户交互(例如在确认页面上点击按钮),从而确保邮件客户端的自动链接预取或扫描不会无意中确认账户。

具体升级和配置步骤:

  1. 升级核心库: 升级 ash_authentication 到版本 4.7.0 或更高。
  2. 升级配套库(如适用): 如果你使用 ash_authentication_phoenix,需要升级到版本 2.6.0 或更高,以利用自动生成的确认视图。
  3. 修改确认策略: 在你的确认策略中设置 require_interaction? true
    1
    2
    3
    4
    
    confirmation <strategy_name> do
      ...
      require_interaction? true
    end
    
  4. 添加确认路由(如适用): 如果你使用 ash_authentication_phoenix 并希望使用新的内置确认流程,需要在路由器中添加 confirm_route重要提示: 如果使用了路径选项且路径以 /auth(或你配置的 auth_routes_prefix)开头,请确保此路由放置在 auth_routes 之上,因为 auth_routes 会贪婪地处理其配置路径下的所有路由。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    confirm_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
    )
    
    注意: 如果升级到 4.7.0 版本但未将 require_interaction? 设置为 true,编译将失败并提示链接到本公告的错误信息。只有在确信自己不受影响时,才可以绕过此错误。

变通方案(在不升级的情况下)

如果不便立即升级,可以通过禁用库提供的确认路由并创建自定义的 LiveView 来实现修复。核心思路是:将确认链接中的令牌作为参数取出,放入一个隐藏的表单字段,该表单仅包含一个提交按钮,通过 POST 请求(而不是 GET)发送到原始的确认 URL。如果使用 LiveView,可以通过 phx-trigger-actionphx-action 来实现。但官方强烈建议通过升级来利用内置的修复视图。

安全弱点(CWE)

  • CWE-306:关键功能缺少身份验证 - 该产品未对需要可证明用户身份的功能执行任何身份验证。

参考链接

致谢

此漏洞由社区成员和 GitHub 安全团队协同处理,特别感谢 zachdaniel(修复开发者)、jimsynzbarnabasJ(修复审查者)、maennchen(分析师)以及 sevenseacat(修复验证者)的贡献。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计