Authlib JWE压缩炸弹漏洞分析:DEFLATE解压缩导致拒绝服务攻击

本文详细分析了Authlib库中的JWE zip=DEF解压缩漏洞CVE-2025-62706,该漏洞允许攻击者通过特制的小型密文在解密时引发内存和CPU资源耗尽,导致拒绝服务攻击,影响范围包括使用zip=DEF功能的所有Authlib版本。

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.decompress
  • authlib/authlib/jose/rfc7516/jwe.py - JWE解码路径在头部存在zip=DEF时应用zip_.decompress(msg)

对比分析

joserfc项目通过固定的最大限制(256 KB)来保护zip=DEF解压缩,如果输出超过此限制则会引发ExceededSizeError,从而防止压缩炸弹攻击。而Authlib在此代码库快照中缺少此类防护机制。

概念验证

测试环境

  • Python 3.10+环境
  • 从代码库可编辑安装的Authlib

测试脚本

1
2
3
4
python3 -m venv .venv
.venv/bin/pip install --upgrade pip
.venv/bin/pip install -e .
.venv/bin/python /authlib/jwe_deflate_dos_demo.py --size 50 --max-rss-mb 2048

测试结果

  • 正常情况:明文=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.pyauthlib/authlib/jose/rfc7516/jwe.py
  • GHSA ID:GHSA-g7f3-828f-7h7m
  • CVE ID:CVE-2025-62706

弱点分类

  • CWE-400:不受控制的资源消耗
  • CWE-770:无限制或节流的资源分配
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计