Authlib JWE zip=DEF 解压缩炸弹漏洞分析
漏洞概述
Authlib库的JWE zip=DEF路径执行无限制的DEFLATE解压缩操作。极小的密文在解密时可扩展至数十或数百兆字节,使得能够提供可解密令牌的攻击者可以耗尽内存和CPU资源,导致拒绝服务。
技术细节
受影响组件
- Authlib JOSE组件
- JWE zip=DEF(DEFLATE)支持功能
漏洞位置
在authlib/authlib/jose/rfc7518/jwe_zips.py中,DeflateZipAlgorithm.decompress方法调用zlib.decompress(s, -zlib.MAX_WBITS)时未设置最大输出限制,这允许压缩载荷无限制扩展。
漏洞流程
在JWE解码流程(authlib/authlib/jose/rfc7516/jwe.py)中,当受保护头部包含"zip": "DEF"时,库将解密的密文路由到解压缩方法,并将完全解压缩的字节分配给明文字段后返回。在此过程中未应用任何流限制或配额控制。
攻击原理
由于DEFLATE在高度重复的输入上能够实现极高的压缩比,攻击者可以精心构造一个极小的zip=DEF密文,在解密时膨胀为非常大的明文,从而急剧增加RSS(常驻集大小)和CPU使用率。重复请求可以快速耗尽进程或主机的可用资源。
代码引用
authlib/authlib/jose/rfc7518/jwe_zips.py- DeflateZipAlgorithm.decompress使用无限制的zlib.decompressauthlib/authlib/jose/rfc7516/jwe.py- JWE解码路径在头部存在zip=DEF时应用zip_.decompress(msg)
对比分析
joserfc项目通过固定的最大限制(256 KB)来保护zip=DEF解压缩,如果输出超过此限制则会引发ExceededSizeError,从而防止压缩炸弹攻击。而Authlib在此代码库快照中缺少此类防护机制。
概念验证
测试环境
- Python 3.10+环境
- 从代码库可编辑安装的Authlib
测试脚本
|
|
测试结果
- 正常情况:明文=13B,密文=117B,解压缩后=13B,内存峰值=31.0MB,比率=0.1
- 恶意情况:明文=50MB,密文≈4KB,解压缩后=50MB,内存峰值=800+MB,比率=12500+
影响评估
直接影响
- 效果:在解密zip=DEF令牌期间导致拒绝服务(内存/CPU耗尽)
- 受影响对象:任何使用Authlib解密zip=DEF的JWE令牌,且攻击者能够提交将被成功解密的令牌的服务
安全影响
- 机密性/完整性:无直接影响
- 可用性:影响严重
CVSS v3.1评分
基础向量
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H → 6.5(中危)
评分理由
- 网络可达(AV:N),低复杂度(AC:L),无需用户交互(UI:N),范围未改变(S:U)
- 攻击者必须持有或获得为目标创建可解密令牌的能力(PR:L)
- 无机密性或完整性损失(C:N/I:N);由于解压缩扩展,可用性受到严重影响(A:H)
缓解措施
临时解决方案
- 在应用程序边界拒绝或剥离zip=DEF的传入JWE,直到修复可用
- 分叉并添加有界解压缩防护
- 强制执行严格的最大令牌大小限制,并对超大输入快速失败
修复指导
- 采用joserfc的方法:添加保守的最大输出大小(例如默认256 KB)并在超出时引发特定错误
- 考虑使用分块限制的流式解码以避免大的单次分配
参考信息
- Authlib源代码:
authlib/authlib/jose/rfc7518/jwe_zips.py,authlib/authlib/jose/rfc7516/jwe.py - GHSA ID:GHSA-g7f3-828f-7h7m
- CVE ID:CVE-2025-62706
弱点分类
- CWE-400:不受控制的资源消耗
- CWE-770:无限制或节流的资源分配