Ash Authentication Phoenix 会话失效不充分漏洞解析

本文详细分析了 ash_authentication_phoenix 库中存在的会话失效不充分安全漏洞。该漏洞允许已失效的会话令牌在用户登出后仍可被用于认证,构成了潜在的安全风险,并提供了修补方法和缓解措施。

Ash Authentication Phoenix 会话失效不充分漏洞解析

CVE-2025-4754 漏洞概述

ash_authentication_phoenix 库中存在一个会话失效不充分的安全漏洞。具体而言,即使用户主动登出,其会话令牌在服务器端仍然保持有效状态。

影响

此安全漏洞导致以下风险:

  • 已泄露的令牌(例如,通过 XSS 攻击、网络拦截或设备被盗获取)在用户登出后仍然有效。这为用户在共享设备或可能被入侵的设备上登出后无法完全使其会话失效创造了安全隐患。
  • 数据库中存储的会话最终会过期,这在一定程度上限制了漏洞可被利用的持续时间。
  • 默认情况下,更改密码会使所有其他会话失效,因此将更改密码作为一项安全措施是有效的。
  • 可能导致不符合要求完整会话失效的安全框架的合规性问题。

受影响的版本

版本号 <= 2.9.0

已修复版本

版本号 2.10.0

修复方法

升级到 2.10.0 版本。升级后,用户需要更新其 AuthController 的实现,以使用新的 clear_session/2 函数并指定其 OTP 应用名称。编译时会提示您完成此操作。

重要配置变更: 如果您的 tokens 配置部分没有将 require_token_presence_for_authentication? 设置为 true,您将看到一个单独的错误:

1
2
3
** (Spark.Error.DslError) authentication -> session_identifier:
Must set `authentication.session_identifier` to either `:jti` or `:unsafe`.
...

为了在登出时撤销不直接在会话中存储令牌的会话,我们必须有一个唯一的标识符来实现此功能。如果可能,您应该优先启用 require_token_presence_for_authentication?,而不是将其设置为 :jti

请注意: 无论您在此处执行什么操作,如果您之前没有将 require_token_presence_for_authentication? 设置为 true,那么将其设置为 true 或将 authentication.session_identifier 设置为 :jti 将使所有当前已认证的用户登出

临时缓解措施

您可以在认证控制器(auth controller)的 logout/2 处理程序中手动撤销令牌。

相关参考

安全评分

  • CVSS 总体评分: 2.3(低危)
  • CVSS v4 向量: CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N
  • EPSS 评分: 0.099%(被利用概率较低)

弱点类型

  • CWE-613: 会话过期不充分

致谢

感谢以下人员的贡献:

  • jimsynz(修复审核)
  • zachdaniel(修复开发者)
  • mbuhot(分析师)
  • maennchen(分析师)
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计