Ash Authentication Phoenix 会话过期缺陷安全通告

本文详细说明了Erlang/Elixir库ash_authentication_phoenix中存在的“会话过期不充分”漏洞(CVE-2025-4754)。该漏洞允许用户在登出后,其会话令牌在服务器端仍可能保持有效,构成安全风险。文章提供了影响范围、修复版本、补丁升级方法以及临时缓解措施。

Ash Authentication Phoenix 存在“会话过期不充分”漏洞 · CVE-2025-4754

漏洞概述 Erlang 包 ash_authentication_phoenix(版本 <= 2.9.0)中存在一个“会话过期不充分”的漏洞,已被分配 CVE 编号 CVE-2025-4754 和 GHSA ID GHSA-f7gq-h8jv-h3cq。该漏洞的严重等级被评估为低危,CVSS v4 总体评分为 2.3。

影响 该漏洞导致会话令牌在用户登出后,在服务器端仍然有效,从而产生安全缺口:

  • 通过 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 v4 基本指标

  • 攻击向量:网络
  • 攻击复杂性:低
  • 攻击要求:存在
  • 所需权限:无
  • 用户交互:被动
  • 受影响系统影响:机密性 - 低,完整性 - 低,可用性 - 无
  • 后续系统影响:机密性 - 无,完整性 - 无,可用性 - 无

弱点

  • CWE-ID: CWE-613
  • 描述: 会话过期不充分。根据 WASC 的定义,当网站允许攻击者重用旧的会话凭据或会话 ID 进行授权时,即存在此问题。

致谢

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