ash_authentication 库存在电子邮件链接自动点击确认漏洞

文章详细披露了 ash_authentication 库(Erlang 包)中的一个安全漏洞(CVE-2025-32782)。该漏洞源于账户创建确认流程设计缺陷,使用 GET 请求的电子邮件确认链接可能被邮件客户端或安全工具自动访问,导致攻击者注册的账户被意外确认。文章提供了漏洞影响、修复版本、具体升级和配置步骤以及临时解决方案。

漏洞详情

CVE ID: CVE-2025-32782 GHSA ID: GHSA-3988-q8q7-p787 严重程度: 中等 (CVSS 评分 5.3) 影响包: erlang / ash_authentication 受影响版本: < 4.7.0 已修复版本: 4.7.0

影响分析

账户创建的确认流程当前通过点击电子邮件中发送的链接来触发 GET 请求。某些电子邮件客户端和安全工具(例如 Outlook、病毒扫描程序和电子邮件预览工具)可能会自动跟踪这些链接,从而无意中确认了账户。这使得攻击者能够使用他人的电子邮件注册账户,并可能通过受害者的电子邮件客户端自动确认该账户。

此漏洞不允许攻击者接管或访问现有账户或私人数据。它仅限于新账户的确认环节。

修复方案

版本 4.7.0 中已发布缓解措施。您还需要将 ash_authentication_phoenix 升级到 2.6.0 或更高版本,才能利用自动生成的确认视图。修复方法更新了确认流程,要求明确的用户交互(例如点击确认页面上的按钮),而不是通过 GET 请求执行确认。这确保了电子邮件客户端的自动链接预取或扫描不会无意中确认账户。

要实施缓解,请按照以下步骤操作:

  1. 升级 ash_authentication >= 4.7.0
  2. 升级 ash_authentication_phoenix >= 2.6.0 (如果使用 ash_authentication_phoenix)
  3. 在您的确认策略中设置 require_interaction? true
  4. 如果使用 ash_authentication_phoenix,请将 confirm_route 添加到您的路由器中,并置于 auth_routes 之上

设置 require_interaction? true

按如下方式修改您的确认策略:

1
2
3
4
confirmation <strategy_name> do
  ...
  require_interaction? true
end

confirm_route 添加到路由器

为了使用这个新的确认流程,您需要将其添加到路由器中以获得所需的行为。它将为新的确认页面 LiveView 添加一条新路由。请注意 pathtoken_as_route_param? 选项,这是保持与当前默认值向后兼容所必需的。如果您以某种方式更改了这些路由,则可能需要进行调整。

重要提示 - 置于 auth_routes 之上 如果您使用 path 选项,并且路径以 /auth 或您配置的 auth_routes_prefix 开头,请确保此行代码位于 auth_routes 之上。auth_routes 会贪婪地处理配置路径下的所有路由。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
confirm_route(
  MyApp.Accounts.User,
  <confirmation_strategy_name>,
  auth_routes_prefix: "/auth",
  overrides: [MyAppWeb.AuthOverrides, AshAuthentication.Phoenix.Overrides.Default],
  # 使用以下选项保持当前已发出的确认电子邮件兼容
  # 如果没有下面的选项,路由将默认为 `/<the_strategy_name>/:token`
  path: "/auth/user/<confirmation_strategy_name>",
  token_as_route_param?: false
)

用户应尽快升级到 4.7.0 版本,并在其确认策略中将 require_interaction? 设置为 true。这将把用于确认的 GET 请求更改为 POST 请求。

如果您升级到此版本但未将 require_interaction? 设置为 true,编译将失败,并显示一条消息链接到本公告。如果您确信自己不受影响,可以绕过此错误。

临时解决方案

用户能否在不升级的情况下修复或补救此漏洞? 您可以禁用确认路由并创建自己的 LiveView。我们强烈建议您尽可能升级并利用内置视图。如果您不使用提供的视图,则需要添加一个确认 LiveView,该视图向旧的确认 URL 发送 POST 请求而不是 GET 请求。您可以通过将令牌作为参数从链接中取出,并将其作为隐藏字段添加到表单中来实现这一点。该表单不应有输入字段,只有一个向确认 URL 提交的按钮。如果使用 LiveView,可以通过 phx-trigger-actionphx-action 实现。

参考链接

安全弱点

CWE-306:关键功能缺少身份验证 产品未对需要可证明用户身份或消耗大量资源的功能执行任何身份验证。

致谢

  • zachdaniel: 修复开发者
  • jimsynz: 修复审核者
  • maennchen: 分析师
  • barnabasJ: 修复审核者
  • sevenseacat: 修复验证者
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计