Skip to main content

Django EUVDEUVD-2026-116021

| CVE-2026-113593 LOW
Use of Cache Containing Sensitive Information (CWE-524)
2026-11-03 DSF
2.3
CVSS 4.0 · Vendor: DSF
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Identify app using Django page caching with Vary
  2. Exploit
    Send request omitting the Vary-listed header
  3. Execution
    Collide with key of empty-header request
  4. Impact
    Receive another user's cached private response

Vulnerability Assessment

Weakness
CWE
ASVS 5.0
V3 - Web Frontend Security Cache-Control for sensitive pages
Exploitation Conditions

The target application must enable Django's server-side per-page caching - either django.middleware.cache.UpdateCacheMiddleware or the django.views.decorators.cache.cache_page() decorator - AND return responses whose Vary header lists a request header that clients can either omit or send with an empty value. Private or per-request data must actually be cached under such a Vary-keyed response for exposure to occur. Exploitation is limited by several factors: caching must be configured (not Django's default), the collision only occurs between an absent header and a present-but-empty header value, and the attacker cannot choose which victim's cached response they receive (reflected in AT:P and UI:P in the vendor vector). This makes successful disclosure opportunistic rather than deterministic.

Impact

All signals converge on low real-world risk. The vendor CVSS 4.0 vector (AV:N/AC:L/AT:P/PR:N/UI:P/VC:L and all other impacts N) yields a base score of 2.3, Django's own security policy rates it 'low', and the vuln.today decision label is 'monitor' - none of which indicate urgency. The AT:P (attack requirements) and UI:P (passive user interaction) metrics reflect that exploitation is opportunistic rather than attacker-controlled: an attacker cannot reliably force a specific victim's private response to be served, they merely benefit from a cache-key collision between an absent and an empty Vary-listed header. Confidentiality impact is only Low (VC:L) with no integrity or availability impact. No EPSS score was supplied in the input, so exploitation probability cannot be quantified; this gap should be noted rather than assumed low or high. The CVE is not in CISA KEV and no public exploit or PoC reference is present - only vendor patch commits and release notes. There is no conflict between the network attack vector and the mechanism: the flaw is reachable over HTTP, but only against applications that have opted into Django's server-side page caching with a Vary header, which sharply narrows the exposed population.

Exploit ScenarioDerived

An application uses Django's UpdateCacheMiddleware or the cache_page() decorator and returns responses that Vary on a request header (for example a region or language header) carrying per-user private content. Because a request that omits that header and a request that sends it empty previously produced identical cache keys, a private response cached for one visitor can be served to a different visitor whose request collides on the key. No public exploit code or PoC is identified; exploitation is opportunistic and depends on cache timing and traffic.

Monitor Track and reassess. Why: LOW severity (CVSS 0.1-3.9).
Patch available

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Nov 03, 2026

Django's server-side per-page caching layer (UpdateCacheMiddleware and the cache_page() decorator) can generate identical cache keys for two requests that should be cached separately: one that omits a request header named in the response's Vary header, and one that sends that header with an empty value. Because a missing header was substituted with an empty string during key generation, a response cached for one of those requests may be served to the other, potentially disclosing private or per-request data to a different client. Exposure requires that the application has opted into Django's caching middleware or decorator and caches responses that vary on a header clients can omit or blank; the vendor rates the issue low severity, no public exploit has been identified at time of analysis, and fixes are available in Django 6.1.3, 6.0.10, and 5.2.19.

RemediationAI

Vendor-released patch: upgrade to Django 6.1.3, 6.0.10, or 5.2.19 respectively, per the advisory at https://www.djangoproject.com/weblog/2026/nov/03/security-releases/ (backport commits include c0b7e5e4e4546e8ddc58262f1945938bb9d9ac2d, 55e2e009b4f3996e5c55af7b22a8c41eb826e892, 2006a2b068766bf332f1afcc32b7614d8e5759a2, and 9007fecd3633cfd90b093ebe106af564347c8aee). Be aware of the documented side effect: responses previously cached for requests that omitted a Vary-listed header will no longer match and will be regenerated on the next request, so expect a brief cache-miss burst and, if cached content was sensitive, a flush of the affected cache backend as a precaution. Where upgrading is not immediately possible, the exposure can be narrowed by ensuring responses carrying private or per-request data are not stored in the shared server-side cache, or by avoiding Vary on headers that clients are able to send with an empty value - both of which reduce caching efficiency and require auditing which views use UpdateCacheMiddleware or cache_page(). Users on unsupported series (5.1.x, 5.0.x, 4.2.x) should move to a supported branch, since the vendor did not evaluate those versions.

Affected VersionsENISA

Django 6.1 <6.1.3
Django 5.2 <5.2.19
Django 6.0 <6.0.10

Affected Packages

euvd django fix: 5.2.19, 6.0.10, 6.1.3

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

The flaw is in Django's cache key derivation (django/utils/cache.py, _generate_cache_key), used by django.middleware.cache.UpdateCacheMiddleware and django.views.decorators.cache.cache_page() to build keys from the response's Vary header fields. The pre-fix code substituted a missing request header with an empty string, so a request that omitted a Vary-listed header and a request that supplied it with an empty value hashed to the same key - a collision that violates RFC 9111 Section 4.1, which requires caches to treat an absent field differently from a present-but-empty field. CWE-524 (Use of Cache Containing Sensitive Information) is the applicable weakness class: the cache can return content generated for a different request context. The upstream fix replaces the empty-string placeholder with a marker (b"-,") that cannot collide with any netstring encoding, and adds a regression test asserting that a HEAD request with no headers and one with an empty "Pony" header under Vary: Pony produce different keys. The observable effect of the fix is that previously cached entries keyed on an omitted Vary header no longer match and are re-cached on the next request. Exploitation is not deterministic: the trigger requires caching to be enabled, requires a response whose Vary header names a header a client can either omit or send empty, requires private data to actually be cached under such a response, and the attacker cannot select which victim's cached response is returned (reflected in the vendor's AT:P and UI:P metrics).

Know when Django gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (DSF) PRIMARY 2.3 LOW
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:P/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N
vuln.today AI 3.7 LOW

Network-reachable and unauthenticated (AV:N/PR:N), but AC:H because exploitation depends on optional Vary-based caching and an uncontrolled cache-key collision; only Low confidentiality impact, no integrity/availability effect.

3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N
4.0 AV:N/AC:H/AT:P/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (DSF).

CVSS VectorVendor: DSF

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
Present
Privileges Required
None
User Interaction
Passive
Vulnerable system: Confidentiality
Low
Vulnerable system: Integrity
None
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

2
CVSS changed
Nov 03, 2026 - 16:22 NVD
3.1 (LOW) 2.3 (LOW)
CVE Published
Nov 03, 2026 - 15:42 cve.org
LOW 2.3

DescriptionCVE.org

An issue was discovered in Django 6.1 before 6.1.3, 6.0 before 6.0.10, and 5.2 before 5.2.19. The django.middleware.cache.UpdateCacheMiddleware and the django.views.decorators.cache.cache_page() decorator generate identical cache keys for requests that omit a header listed in the response’s Vary header and requests that include that header with an empty value, potentially allowing remote attackers to access private data cached for another request. Earlier, unsupported Django series (such as 5.1.x, 5.0.x, and 4.2.x) were not evaluated and may also be affected. Django would like to thank Andrew Gonzalez for reporting this issue.

Threat Intelligence Overview

Prevalence
High
widely-deployed Python web framework; server-side page caching is optional
Data Quality
4 sources
Confidence: Medium

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity LOW
CISA KEV No
Public POC No
EPSS N/A
Patch available Yes
Active threat No
Deciding rule
LOW severity (CVSS 0.1-3.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact· derived
High

Priority Score

12
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +12
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

More in Django

View all
CVE-2021-23336 MEDIUM POC
5.9 Feb 15

The package python/cpython from 0 and before 3.6.13, from 3.7.0 and before 3.7.10, from 3.8.0 and before 3.8.8, from 3.9

CVE-2017-12794 MEDIUM POC
6.1 Sep 07

In Django 1.10.x before 1.10.8 and 1.11.x before 1.11.5, HTML autoescaping was disabled in a portion of the template for

CVE-2022-34265 CRITICAL POC
9.8 Jul 04

An issue was discovered in Django 3.2 before 3.2.14 and 4.0 before 4.0.6. Rated critical severity (CVSS 9.8), this vulne

CVE-2021-35042 CRITICAL POC
9.8 Jul 02

Django 3.1.x before 3.1.13 and 3.2.x before 3.2.5 allows QuerySet.order_by SQL injection if order_by is untrusted input

CVE-2019-19844 CRITICAL POC
9.8 Dec 18

Django before 1.11.27, 2.x before 2.2.9, and 3.x before 3.0.1 allows account takeover. Rated critical severity (CVSS 9.8

CVE-2026-61594 CRITICAL POC
9.1 Sep 16

An authentication/authorization bypass in the djust Python live-view framework (versions prior to 1.0.7) lets unauthenti

CVE-2026-61599 HIGH POC
8.8 Sep 16

Unauthenticated arbitrary Python module import in djust before 1.0.7 lets any client that can reach the WebSocket or SSE

CVE-2020-9402 HIGH POC
8.8 Mar 05

Django 1.11 before 1.11.29, 2.2 before 2.2.11, and 3.0 before 3.0.4 allows SQL Injection if untrusted data is used as a

CVE-2016-6186 MEDIUM POC
6.1 Aug 05

Cross-site scripting (XSS) vulnerability in the dismissChangeRelatedObjectPopup function in contrib/admin/static/admin/j

CVE-2026-93456 HIGH POC
8.4 Sep 18

Forged content modification in django-page-cms through 2.0.13 lets unauthenticated remote attackers exploit five CSRF-ex

CVE-2026-61593 HIGH POC
8.1 Sep 16

Cross-site request forgery in djust's Server-Sent-Events transport affects all versions prior to 1.0.7 and allows a cros

CVE-2026-61590 HIGH POC
7.4 Sep 16

Unauthenticated remote attackers can read live Django view and session state and invoke server-side handlers through dju

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy