Guardian 是一个流行的 Elixir 认证库,其 Guardian.Permissions 模块存在一个资源未限制分配漏洞(CVE-2026-55734),可导致拒绝服务。漏洞根因在于 encode_permissions!/1 函数在将权限映射编码为 claims 时,对映射中的每个键直接执行 String.to_atom(to_string(k)),且该操作发生在任何键校验之前。更严重的是,当键对应的值为整数时,do_encode_permissions!/2 的整数子句会短路直接编码,完全跳过对键是否属于配置权限集的校验,从而将任意攻击者可控的键作为新原子永久插入 BEAM 原子表。BEAM 原子表大小固定(默认约 1,048,576 项),且原子不会被垃圾回收,因此每个唯一键都会永久占用一个槽位。攻击者若能控制到达 encode_permissions!/1 的权限映射(例如通过请求体传入并用于签发 token),即可无限制地创建新原子,最终耗尽原子表,导致整个 BEAM 节点崩溃,所有运行在其上的服务全部不可用。受影响的 guardian 版本为 2.0.0 至 2.4.1 之前,官方已在 2.4.1 中修复。评估认为该漏洞风险较高,但无 CVSS/EPSS 数据,且未被列入 KEV 或标记在野利用,因此不确认已被实际武器化利用。建议立即升级修复版本,并在外部输入进入权限编码流程前进行严格的白名单校验,同时监控原子表使用情况。
💡 影响/原因: 该漏洞允许远程攻击者通过构造恶意权限映射耗尽 BEAM 原子表,造成整个节点拒绝服务,影响所有依赖服务。官方已发布修复版本,建议立即升级。