Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSend request with maliciously crafted Accept/Content-Type header
-
ExploitDjango content negotiation invokes parse_header_parameters()
-
ExecutionQuadratic parsing of separators in quoted value consumes CPU
-
ImpactWorker exhaustion degrades service availability
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V2 - Validation and Business Logic Algorithmic complexity limits
|
| Exploitation Conditions | Exploitation requires the Django application to invoke parse_header_parameters() on attacker-controlled input, which happens by default during content negotiation via HttpRequest.accepts() and when parsing Accept or Content-Type headers - no non-default configuration or feature toggle is needed. The attacker must craft a quoted parameter value containing many separator characters to trigger the quadratic parsing cost, and can use repeated headers to bypass the per-call length limit since it does not bound their combined size. Limiting factors: impact is partial availability only (A:L) with no data exposure; the application must actually reach this parsing path (content-negotiation or header-parameter handling), and the affected versions are Django 6.1<6.1.2, 6.0<6.0.9, and 5.2<5.2.18 (earlier unsupported series may also be affected but were not evaluated). |
| Impact | This is a moderate-severity, availability-only denial-of-service issue (CWE-407, inefficient algorithmic complexity). The provided CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L, base 5.3) indicates a network-reachable, low-complexity, unauthenticated attack with no user interaction - favorable conditions for an attacker - but the impact is limited to partial availability (A:L) with zero confidentiality or integrity effect, which caps real-world severity. Django itself rates this 'moderate' per its security policy, consistent with the quadratic (not exponential) parsing cost. No EPSS score was provided in the input, so exploitation probability cannot be quantified; there is no CISA KEV listing and no public exploit was identified at time of analysis, so there is no confirmed active exploitation. The one tension worth noting: the 'Information Disclosure' tag in the input conflicts with the actual vulnerability class - this is a pure availability DoS (C:N/I:N/A:L), not information disclosure, so that tag appears mislabeled. Net assessment: a legitimate patch-management priority for Django operators because it is unauthenticated and remotely reachable via standard headers, but it is not a drop-everything emergency given partial availability impact only and no evidence of exploitation. |
| Exploit ScenarioDerived | An unauthenticated attacker sends an HTTP request to a Django application carrying a crafted Accept or Content-Type header (or repeated such headers) containing a quoted parameter value with a very large number of separator characters. When Django performs content negotiation via HttpRequest.accepts(), parse_header_parameters() parses this value with quadratic time complexity, consuming excessive CPU; because the per-call length limit does not bound the combined size of repeated headers, the attacker can amplify the cost and degrade or exhaust worker capacity. No public exploit code was identified at time of analysis. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 06, 2026
Quadratic-time parsing of quoted HTTP header parameters in Django 5.2 (before 5.2.18), 6.0 (before 6.0.9), and 6.1 (before 6.1.2) allows unauthenticated remote clients to consume disproportionate CPU by supplying a header value containing many separator characters inside a quoted parameter, potentially degrading or exhausting worker capacity. The vulnerable code path is reached by default through content negotiation such as HttpRequest.accepts() and Accept/Content-Type header handling, and the existing per-call length limit does not bound the combined size of repeated headers, so an attacker can amplify the cost across many headers in a single request. Impact is availability-only (CVSS 5.3, A:L, CWE-407); vendor patches are available in Django 6.1.2, 6.0.9, and 5.2.18, and no public exploit code was identified at time of analysis.
RemediationAI
Vendor-released patch: upgrade to Django 6.1.2, 6.0.9, or 5.2.18 (matching your branch), as documented at https://www.djangoproject.com/weblog/2026/oct/06/security-releases/ and https://docs.djangoproject.com/en/dev/releases/security/; the upstream fixes are visible in the Django commits 7ff7fcc0508864a4bc39693128ace38b1e95a890, de56deeabd4c48dfb5193f0001469d80102fb367, 3d8f121695c21234aff3071de0d38b6bd38c3f52, and 6ecd66e09a383be004a78a3a738ea9727ff07b0e. Because the patch swaps the parser for Python's email.message.Message, Django notes that parsing of some malformed or unusual header values may change (for example, RFC 2231 values with a missing encoding are now decoded), so regression-test code that inspects Content-Type, Accept, or Content-Disposition parameters before and after upgrading. If you cannot upgrade immediately, add compensating controls at the reverse proxy or load balancer, since the framework-level per-call length limit does not bound repeated headers: enforce a strict total request-header size and header-count limit (for example, nginx large_client_header_buffers/client_header_buffer_size and a low max header count, or equivalent settings in HAProxy/Envoy) and reject requests exceeding them - the trade-off is that legitimately large cookies or long Accept chains may be rejected; additionally apply per-source rate limiting and request timeouts to a single request path that performs content negotiation, which slows but does not eliminate the amplification. Deployments on unsupported 5.1.x, 5.0.x, or 4.2.x branches should plan migration to a supported, patched series because no fix is published for those branches.
Affected VersionsENISA
Affected Packages
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
CVE-2026-84429 is a CWE-407 (inefficient algorithmic complexity) flaw in django.utils.http.parse_header_parameters(), an undocumented helper in Django's django/utils/http.py module. The pre-fix implementation built its own parameter parser: a generator (_parseparam) repeatedly re-scanned the input string with s.find(';') and s.count('"', 0, end) / s.count('\\"', 0, end) to determine whether a semicolon fell inside an unterminated quoted string. For a value containing many separator characters inside a quoted parameter, that repeated rescans-from-the-front behavior yields quadratic growth of the work performed relative to input length, and the value is additionally processed for RFC 2231 encoding (filename*=UTF-8''...) and backslash/quote unescaping. Django's per-call MAX_HEADER_LENGTH limit is applied to each invocation, but the framework does not constrain the combined size of multiple repeated headers (for example, repeated Content-Type or Accept headers), so an attacker can multiply the parsing cost within a single request. The parser is reachable without authentication on any code path that inspects these headers, most notably Django's content-negotiation helper HttpRequest.accepts(). The fix replaces the hand-rolled parser with Python's stdlib email.message.Message.get_params() and collapse_rfc2231_value(), which avoids the quadratic scan and also explicitly validates RFC 2231 charset names rather than silently falling back to us-ascii. CPE data (cpe:2.3:a:djangoproject:django:*:*:*:*:*:*:*:*) confirms the affected component is the core Django framework package rather than a plugin or add-on.
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
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
Unauthenticated remote request reaches default content-negotiation parsing (AV:N/PR:N/UI:N/AC:L); quadratic DoS causes only partial availability loss (A:L), no C/I impact.
AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
Primary rating from Vendor (DSF).
CVSS VectorVendor: DSF
Lifecycle Timeline
2DescriptionCVE.org
An issue was discovered in Django 6.1 before 6.1.2, 6.0 before 6.0.9, and 5.2 before 5.2.18. django.utils.http.parse_header_parameters() was subject to a potential denial-of-service attack due to quadratic time complexity when parsing a value with many separators inside a quoted parameter. An unauthenticated request could reach this parsing through headers such as Accept or Content-Type, for instance via the content negotiation performed by HttpRequest.accepts(). The per-call length limit does not bound the combined size of repeated headers. 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 Jisung Chae for reporting this issue.
Threat Intelligence Overview
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.
What every action level means
SSVC AssessmentENISA
Priority Score
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
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
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
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
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
An authentication/authorization bypass in the djust Python live-view framework (versions prior to 1.0.7) lets unauthenti
Unauthenticated arbitrary Python module import in djust before 1.0.7 lets any client that can reach the WebSocket or SSE
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
Cross-site scripting (XSS) vulnerability in the dismissChangeRelatedObjectPopup function in contrib/admin/static/admin/j
Forged content modification in django-page-cms through 2.0.13 lets unauthenticated remote attackers exploit five CSRF-ex
Cross-site request forgery in djust's Server-Sent-Events transport affects all versions prior to 1.0.7 and allows a cros
Unauthenticated remote attackers can read live Django view and session state and invoke server-side handlers through dju
Same weakness CWE-407 – Inefficient Algorithmic Complexity
View allVendor StatusVendor
SUSE
Severity: Moderate| Product | Status |
|---|---|
| SUSE Linux Enterprise Module for Package Hub 15 SP7 | Affected |
| SUSE Linux Enterprise Module for Package Hub 15 SP6 | Affected |
| openSUSE Leap 15.6 | Affected |
EUVD-2026-93417
GHSA-76g2-x83x-73r7
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB