Skip to main content

Django CVE-2026-8404

| EUVDEUVD-2026-34088 LOW
Improper Handling of Case Sensitivity (CWE-178)
2026-06-03 6a34fbeb-21d4-45e7-8e0a-62b95bc12c92 GHSA-8cjm-8mp7-r2xf
2.3
CVSS 4.0 · Vendor: 6a34fbeb-21d4-45e7-8e0a-62b95bc12c92
View

Attack ChainAIDerived

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

  1. Access
    Identify Django app with UpdateCacheMiddleware enabled
  2. Delivery
    Locate endpoint that emits mixed-case Cache-Control headers
  3. Exploit
    Trigger legitimate user request to populate incorrect cache entry
  4. Execution
    Request same URL as unauthenticated or different-session attacker
  5. Persist
    Receive incorrectly cached private response
  6. Impact
    Extract disclosed sensitive content

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Case sensitivity handling
Exploitation Conditions

Two specific conditions must both be true for exploitation to be possible. First, the Django application must have django.middleware.cache.UpdateCacheMiddleware active in its MIDDLEWARE setting - this is not enabled by default and must be explicitly configured. Second, at least one response flowing through that middleware must include a Cache-Control header with uppercase or mixed-case directive values (e.g., 'Cache-Control: Private', 'Cache-Control: NO-STORE', 'Cache-Control: No-Cache'). This second condition is the key limiting factor: Django's own HTTP response APIs (HttpResponse, JsonResponse, decorators like @cache_control) emit lowercase values, so the triggering condition most likely originates from third-party packages, manually constructed headers, or reverse-proxy pass-through headers with non-normalized casing. Exploitation is further limited by the need for a prior legitimate user request to populate the cache entry (UI:P) and the confidentiality impact being bounded to whatever that specific cached response contained. Deployments not using UpdateCacheMiddleware are entirely unaffected regardless of Cache-Control header casing.

Impact

The CVSS 4.0 vector AV:N/AC:L/AT:P/PR:N/UI:P/VC:L/VI:N/VA:N yields a score of 2.3, reflecting a network-reachable attack with no required privileges but with two constraining factors: AT:P (specific attack conditions must be present - namely mixed-case Cache-Control headers in responses) and UI:P (passive user interaction, meaning a legitimate user must trigger the incorrectly cached response before an attacker can retrieve it). The confidentiality impact is limited to the vulnerable system (VC:L), with no integrity or availability impact. EPSS data was not provided, so exploitation probability cannot be quantified from that source. KEV status is absent, confirming no known active exploitation. No public POC has been identified. Real-world risk is narrow: it applies only to deployments that actively use UpdateCacheMiddleware and generate responses with non-lowercase Cache-Control directives - not a typical Django pattern. This is a genuine but low-priority finding absent evidence of broader exploitation.

Exploit ScenarioDerived

A Django application uses UpdateCacheMiddleware and includes a third-party library or custom view that sets 'Cache-Control: Private' with a capital P. The middleware, failing to match 'Private' against the expected lowercase 'private', stores the response in cache. A second attacker request to the same URL retrieves that cached response, potentially exposing session-specific data - such as a user profile page or partial form data - that was intended to be served only to the original authenticated user.

Monitor Track and reassess. Why: LOW severity (CVSS 0.1-3.9).
Patch available 0.0% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – Jun 03, 2026

Incorrect cache storage in Django's UpdateCacheMiddleware exposes responses that should have been excluded from caching due to uppercase or mixed-case Cache-Control directives (e.g., 'Private', 'NO-STORE'). Affected versions 5.2.x before 5.2.15 and 6.0.x before 6.0.6 fail to perform case-insensitive comparison of Cache-Control directive strings, causing the middleware to cache responses it should skip, which remote attackers can then retrieve. No public exploit has been identified at time of analysis, and active exploitation is not confirmed; the low CVSS 4.0 score of 2.3 accurately reflects limited scope, though real-world impact scales with how sensitive the incorrectly cached data is.

RemediationAI

Upgrade to Django 5.2.15 or Django 6.0.6, as released and documented in the official security advisory at https://www.djangoproject.com/weblog/2026/jun/03/security-releases/. Users running unsupported series (5.0.x, 4.1.x, 3.2.x) should upgrade to a current supported release, as those versions were not patched and received no formal security evaluation. If an immediate upgrade is not feasible, a targeted workaround is to audit all application code, custom middleware, and third-party libraries that set Cache-Control headers, ensuring all directive values are emitted in lowercase before reaching UpdateCacheMiddleware. A custom normalization middleware inserted before UpdateCacheMiddleware in MIDDLEWARE could enforce this, though operators should verify it does not conflict with downstream proxy or CDN caching behavior. If UpdateCacheMiddleware is not operationally required, removing it from the middleware stack eliminates the vulnerability entirely at the cost of losing Django's full-page cache functionality.

Affected VersionsENISA

Django 5.2 <5.2.15
Django 6.0 <6.0.6

Affected Packages

pypi django fix: 5.2.15, 6.0.6

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in pypi

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

Technical ContextAI · show details

CWE-178 (Improper Handling of Case Sensitivity) is the root cause. Per RFC 7234 Section 5.2, Cache-Control directive names are case-insensitive in the HTTP specification, meaning 'Private', 'PRIVATE', and 'private' are semantically equivalent. Django's django.middleware.cache.UpdateCacheMiddleware - the middleware responsible for writing full-page HTTP responses into the cache backend - fails to normalize or case-fold Cache-Control directive strings before comparing them against known exclusion values (e.g., 'private', 'no-store', 'no-cache'). When a response arrives at the middleware bearing a directive like 'Cache-Control: Private' or 'NO-CACHE', the case-sensitive string comparison misses the match, and the middleware treats the response as cacheable. The affected component sits in Django's middleware stack and is opt-in, not enabled by default. No CPE strings were provided in the source intelligence.

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 (6a34fbeb-21d4-45e7-8e0a-62b95bc12c92) 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

Primary rating from Vendor (6a34fbeb-21d4-45e7-8e0a-62b95bc12c92) · only source for this CVE.

CVSS VectorVendor: 6a34fbeb-21d4-45e7-8e0a-62b95bc12c92

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

1
Patch available
Jun 03, 2026 - 16:01 EUVD

DescriptionCVE.org

An issue was discovered in Django 5.2 before 5.2.15 and 6.0 before 6.0.6. django.middleware.cache.UpdateCacheMiddleware in Django does not match Cache-Control response directives case-insensitively, which allows remote attackers to read responses that were incorrectly cached because their Cache-Control directives used uppercase or mixed-case values. Earlier, unsupported Django series (such as 5.0.x, 4.1.x, and 3.2.x) were not evaluated and may also be affected. Django would like to thank Ahmed Badawe for reporting this issue.

Blast Radius

ecosystem impact
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 12 pypi packages depend on django (12 direct, 0 indirect)

Ecosystem-wide dependent count for version 5.2.

Threat Intelligence Overview

EPSS Score
0.0%
Top 88% exploitable
Social Media
1
Sightings
Data Quality
6 sources
Confidence: High

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 0.0%
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
Defer
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Low
Technical Impact
Partial

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