Authlib JWE zip=DEF解压缩炸弹漏洞分析
漏洞概述
Authlib的JWE zip=DEF路径执行无限制的DEFLATE解压缩。极小的密文在解密时可扩展至数十或数百兆字节,使得能够提供可解密令牌的攻击者可以耗尽内存和CPU资源,导致拒绝服务(DoS)。
技术细节
受影响组件
- 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)
概念验证
测试环境
- Python 3.10+虚拟环境
- 从仓库可编辑安装Authlib
测试步骤
|
|
测试结果
- 正常情况:明文=13B,密文=117B,解压缩=13B,峰值RSS=31.0MB
- 恶意情况:明文=50MB,密文≈4KB,解压缩=50MB,峰值RSS=800+MB,压缩比=12500+
影响分析
影响范围
- 任何使用Authlib解密具有zip=DEF的JWE令牌的服务
- 攻击者能够提交将被成功解密的令牌的场景
严重程度
CVSS v3.1评分:6.5(中危)
- 攻击向量:网络
- 攻击复杂度:低
- 所需权限:低
- 用户交互:无
- 影响范围:未改变
- 机密性:无影响
- 完整性:无影响
- 可用性:高影响
缓解措施
临时解决方案
- 在应用边界拒绝或剥离zip=DEF的入站JWE
- 添加有界解压缩保护
- 强制执行严格的最大令牌大小并结合速率限制
修复指导
- 添加保守的最大输出大小(默认256 KB)
- 考虑使用分块限制的流式解码以避免大单次分配
受影响版本
- 受影响版本:< 1.6.5
- 已修复版本:1.6.5
参考链接
- GHSA-g7f3-828f-7h7m
- authlib/authlib@e0863d5