CVE-2026-114138

Django REST framework: Accept header with many large quoted parameters burns ~19s of CPU per request in content negotiation

Published Oct 21, 2026 CVSS 3.1 · 7.5 High EPSS < 1% KEV · Not listed
Description
Django REST framework is a toolkit for building Web APIs. Prior to 3.18.2, DefaultContentNegotiation.get_accept_list in rest_framework/negotiation.py accepts an unbounded number and aggregate size of Accept tokens, while select_renderer in that file repeatedly invokes _MediaType parsing from rest_framework/utils/mediatypes.py for each attacker-controlled token, every renderer, and forced 406 renegotiation. A remote unauthenticated client can send many distinct media types containing large quoted parameter values with numerous semicolons, causing Django's parameter parser and DRF's repeated parsing structure to consume disproportionate CPU. Requests to any reachable endpoint can pin synchronous workers for prolonged periods, and concurrent requests can make the service unavailable until the requests stop. This issue is fixed in version 3.18.2.

Analysis

AI-generated

Technical impact

Django REST framework versions before 3.18.2 process every Accept header token without limits, repeatedly parsing large quoted parameters for each renderer. A malicious client can send a long list of media types with extensive parameters, causing the server to expend disproportionate CPU time and hold up synchronous workers. This results in significant service slowdown or unavailability for legitimate traffic.

Affected Systems

The vulnerability impacts any installation of the Django REST framework library encoded as "encode:django-rest-framework" running a version earlier than 3.18.2. Systems exposing API endpoints that use default content negotiation are potentially exposed.

Risk and Exploitability

The CVSS score of 7.5 points to a high severity threat. The EPSS score is < 1% (0.00432), indicating a very low probability that exploitation is actively occurring, and the vulnerability is not listed in CISA KEV. A remote, unauthenticated attacker can exploit it by crafting HTTP requests with many Accept header tokens; the attack requires no authentication and can be launched from any Internet‑reachable host. Successful exploitation can tie up workers for extended periods, making the API unresponsive to legitimate users.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Upgrade Django REST framework to version 3.18.2 or newer to eliminate the unbounded parsing behavior.
  • Configure the web server or reverse proxy to limit Accept header length and number of tokens, or to reject requests that exceed reasonable limits, as a temporary mitigation while upgrading.
  • If upgrading immediately is not feasible, adjust the application’s content negotiation logic to disable or restrict default negotiation, thereby reducing the CPU impact of malformed Accept headers.

Generated by OpenCVE AI on October 22, 2026 at 15:44 UTC.

Tracking

Sign in to view the affected projects.

Advisories

Source ID Title
Github GHSA Github GHSA GHSA-33wh-fxxf-88vv Django REST framework: Accept header with many large quoted parameters burns ~19s of CPU per request in content negotiation
History
Type Values Removed Values Added
Metrics ssvc

{'options': {'Automatable': 'yes', 'Exploitation': 'poc', 'Technical Impact': 'partial'}, 'version': '2.0.3'}

Type Values Removed Values Added
First Time appeared Encode
Encode django Rest Framework
Vendors & Products Encode
Encode django Rest Framework
Type Values Removed Values Added
Description Django REST framework is a toolkit for building Web APIs. Prior to 3.18.2, DefaultContentNegotiation.get_accept_list in rest_framework/negotiation.py accepts an unbounded number and aggregate size of Accept tokens, while select_renderer in that file repeatedly invokes _MediaType parsing from rest_framework/utils/mediatypes.py for each attacker-controlled token, every renderer, and forced 406 renegotiation. A remote unauthenticated client can send many distinct media types containing large quoted parameter values with numerous semicolons, causing Django's parameter parser and DRF's repeated parsing structure to consume disproportionate CPU. Requests to any reachable endpoint can pin synchronous workers for prolonged periods, and concurrent requests can make the service unavailable until the requests stop. This issue is fixed in version 3.18.2.
Title Django REST framework: Accept header with many large quoted parameters burns ~19s of CPU per request in content negotiation
Weaknesses CWE-400
CWE-407
References
Metrics cvssV3_1

{'score': 7.5, 'vector': 'CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H'}

Weaknesses
  • CWE-400

    Uncontrolled Resource Consumption

  • CWE-407

    Inefficient Algorithmic Complexity

  • CWE-770

    Allocation of Resources Without Limits or Throttling

Sources

Status
PUBLISHED
Assigner
GitHub_M
Published
Updated
Oct 28, 2026, 6:11 PM
Reserved
Oct 20, 2026, 9:53 PM
Status
Awaiting Analysis
Published
Oct 21, 2026, 9:17 PM
Modified
Oct 28, 2026, 7:17 PM
Severity
Important
Public date
Oct 21, 2026, 8:09 PM