CVE-2026-97791 Apache CXF STSTokenValidator 认证绕过漏洞
影响攻击者可绕过 SAML 断言签名校验,伪造身份通过认证
Apache CXF 的 STSTokenValidator 在将 SAML 断言发送给 STS 之前会校验其是否由受信任证书签名,但该校验结果被存放在所有请求共享的同一对象中,导致请求之间可互相读取结果。远程未认证攻击者可在合法请求处理期间发送使用不受信任证书签名的伪造断言,从而被误判为受信任而无需经过 STS 校验。
影响范围
受影响的是使用 STSTokenValidator 校验 SAML 令牌且未设置 alwaysValidateToSts 的服务;官方修复版本为 4.2.4、4.1.9、3.6.13,此前版本均可能受影响。
漏洞详情
漏洞类型为并发场景下的认证绕过(共享状态/竞态条件)。成因是签名校验结果被存储在跨请求共享的对象中,未做请求级隔离,导致一个请求可读取另一个请求的校验结果。攻击者利用该竞态,在合法请求通过校验的时间窗口内提交使用不受信任证书签名的伪造 SAML 断言,使其被当作已信任断言接受,从而绕过 STS 校验。
利用条件与风险
利用前提是目标服务使用 STSTokenValidator 且未启用 alwaysValidateToSts,并需在合法请求并发处理时发起攻击,存在一定时序竞争要求,但无需认证即可远程触发,成功后可伪造身份,实战风险较高。
修复建议
官方建议升级至 4.2.4、4.1.9 或 3.6.13 版本以修复该问题;临时缓解措施可考虑启用 alwaysValidateToSts 强制所有断言经 STS 校验,或限制相关服务的网络访问,具体以官方公告为准。
In Apache CXF, STSTokenValidator checks whether a SAML assertion is signed by a trusted certificate before deciding to send it to the STS. That result was stored in one object shared by all requests, so one request could read another’s result. A remote, unauthenticated attacker could send a forged assertion signed with an untrusted certificate while legitimate requests were being processed, and it could be accepted as trusted without ever reaching the STS. Only services that use STSTokenValidator to validate SAML tokens without alwaysValidateToSts set are affected.
Users are recommended to upgrade to versions 4.2.4 or 4.1.9 or 3.6.13, which fix this issue.