CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-73228

CVE-2026-73228: Uncontrolled Resource Consumption (DATA_UPLOAD_MAX_MEMORY_SIZE Bypass) in Django REST Framework

Alon Barad
Alon Barad
Software Engineer

Sep 1, 2026·6 min read·7 visits

Executive Summary (TL;DR)

Django REST Framework bypassed Django's native DATA_UPLOAD_MAX_MEMORY_SIZE configuration, letting unauthenticated attackers exhaust system memory and trigger Out-Of-Memory (OOM) crashes by sending massive JSON or URL-encoded payloads.

A vulnerability in Django REST Framework (DRF) before version 3.17.2 allows remote attackers to bypass the native Django DATA_UPLOAD_MAX_MEMORY_SIZE limits. When parsing JSON or URL-encoded request bodies, DRF's JSONParser and FormParser read directly from the low-level HTTP network stream, bypassing Django's high-level request size checks and causing Denial of Service (DoS) via resource exhaustion.

Vulnerability Overview

Django REST Framework (DRF) before version 3.17.2 is vulnerable to uncontrolled resource consumption because it fails to enforce native request size constraints during the parsing process. Under normal execution, Django mitigates denial-of-service attempts by setting a global size limit on raw payloads using the DATA_UPLOAD_MAX_MEMORY_SIZE setting. Any access to high-level properties like request.body evaluates this threshold and terminates oversized requests with a RequestDataTooBig exception. This safeguard ensures that standard Django views are protected from being flooded with large payloads that could crash the application server.

However, the Django REST Framework architecture introduces a technical gap. Inside rest_framework/request.py, DRF intercepts incoming requests and invokes specialized parsers like JSONParser and FormParser to handle incoming JSON or form-encoded payloads. Because these parsers read directly from the raw, low-level streaming interface of Django's request, they bypass Django's validation checks. This behavior exposes a significant attack surface on any endpoint configured to receive client data.

This architectural gap allows remote, unauthenticated attackers to submit exceptionally large HTTP requests to any endpoint processing JSON or form data. The application allocates system memory dynamically to consume this input stream, resulting in memory depletion and CPU exhaustion. The resulting resource depletion frequently leads to process termination by the operating system, creating an application-layer denial of service.

Root Cause Analysis

To analyze the technical root cause, we must examine the difference between high-level request properties and low-level streams in Django. When a request reaches Django, the raw HTTP socket is presented as an input stream. Standard Django views consume this stream when the developer references request.body or request.POST. The loading code explicitly checks the size of the incoming stream, raising a RequestDataTooBig exception if the size exceeds DATA_UPLOAD_MAX_MEMORY_SIZE.

In contrast, DRF delegates payload reading to parsing classes like JSONParser or FormParser. To parse efficiently, DRF hands the raw stream directly to these parsers. The parser reads from the socket and decodes the stream iteratively. Because this bypasses request.body or request.POST accesses, Django's native checks are never triggered, allowing an attacker to transmit large quantities of data directly to the parser.

Once the parser begins reading the payload, it allocates heap memory to hold the raw stream bytes. The Python JSON parser then deserializes these bytes, creating complex data structures such as deeply nested dictionaries and arrays. The memory required to store these parsed objects is often multiple times larger than the raw string size, causing memory usage to escalate. If several such requests are processed concurrently, the host operating system or container run-time runs out of memory and terminates the application worker process.

The following diagram illustrates the vulnerable execution path versus the patched validation flow:

Code-Level Analysis and Patch Review

The vulnerability was fixed in Django REST Framework 3.17.2 by forcing Django to evaluate the request size before the parser begins reading the input stream. This fix was introduced in the rest_framework/request.py file within the Request._parse() method. The modification intercepts the parsing pipeline when a standard JSON or form-encoded parser is selected.

The patched implementation implements dynamic imports to prevent circular dependencies in DRF initialization, followed by an explicit type check:

# Patched implementation in rest_framework/request.py
 
def _parse(self):
    # ... configuration and parser selection ...
    if not parser:
        raise exceptions.UnsupportedMediaType(media_type)
 
    # Dynamic imports prevent circular dependencies in DRF initialization
    from rest_framework.parsers import FormParser, JSONParser
 
    # Check if the chosen parser is an instance of JSONParser or FormParser
    if isinstance(parser, (JSONParser, FormParser)):
        # Accessing self.body forces Django's native limits validation
        stream = io.BytesIO(self.body)
 
    try:
        parsed = parser.parse(stream, media_type, self.parser_context)
    except Exception:
        # ... exception handling ...

By accessing self.body, DRF triggers Django's high-level request size evaluation. If the payload is too large, Django raises RequestDataTooBig and aborts execution before the parsing logic can run. If the size is valid, Django caches the payload and returns the raw bytes. The patch wraps these validated bytes in an io.BytesIO stream, providing a safe, bounded source for the parser to consume.

A critical review of this patch reveals a potential limitation. The code relies on an explicit type check using isinstance(parser, (JSONParser, FormParser)). Any custom or third-party parser that does not inherit directly from these classes will bypass this check and continue reading from the raw, unchecked stream. Security researchers and developers must evaluate custom parser classes to ensure they do not expose the application to similar resource depletion attacks.

Attack Methodology and Proof of Concept

Exploiting this vulnerability does not require authenticated sessions or sophisticated technical knowledge. An attacker must simply locate an API endpoint that processes JSON or URL-encoded form data. Because many public-facing APIs (such as registration and login screens) accept these media types without requiring authentication, the attack surface is substantial.

The attacker constructs a large JSON payload consisting of a single key with a long string value or deeply nested dictionaries. Sending a 100 megabyte payload over a slow connection allows the attacker to hold the connection open, consuming resources incrementally. When the application worker tries to parse the 100 megabyte payload, memory allocations can balloon to 400 or 500 megabytes because of Python object overhead.

If the attacker coordinates multiple concurrent requests, they can consume all available RAM on the application server. The kernel's Out-Of-Memory (OOM) killer will intervene, killing the WSGI or ASGI process and causing a denial of service. The service remains unavailable until the process manager (such as Gunicorn or uWSGI) spawns new worker instances.

Strategic Remediations and Workarounds

The primary and recommended solution is to upgrade Django REST Framework to version 3.17.2 or higher. This upgrade updates the _parse method to validate incoming stream sizes automatically. Developers should execute pip install --upgrade djangorestframework>=3.17.2 to apply this change immediately.

If upgrading the library is not immediately possible, several secondary defenses can be deployed. A web application firewall (WAF) or reverse proxy can enforce strict payload size limits at the network edge, preventing large requests from reaching the application server. For example, adding client_max_body_size 5M; to the NGINX configuration block restricts request payloads before they are passed to the WSGI socket.

Alternatively, custom middleware can be added to the Django application pipeline to force validation of all incoming JSON and form-encoded requests. This middleware intercepts requests and accesses request.body before DRF routes the request to a view. If the request exceeds the allowed limit, Django's native handler blocks the request and returns a clean HTTP 400 response, neutralizing the attack path.

Official Patches

encodeRelease notes and fixed version

Fix Analysis (2)

Technical Appendix

CVSS Score
5.3/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L
EPSS Probability
0.32%
Top 75% most exploited

Affected Systems

Django REST Framework (DRF) installations prior to version 3.17.2

Affected Versions Detail

Product
Affected Versions
Fixed Version
django-rest-framework
encode
< 3.17.23.17.2
AttributeDetail
CWE IDCWE-400 / CWE-770
Attack VectorNetwork (AV:N)
CVSS Score5.3 (Medium)
Exploit MaturityPoC / Functional
CISA KEVNot Listed
Affected Componentrest_framework/request.py (Request._parse)

MITRE ATT&CK Mapping

T1499Endpoint Denial of Service
Impact
CWE-400
Uncontrolled Resource Consumption

The software does not properly control the allocation and maintenance of a limited resource, enabling an actor to cause resource depletion.

Vulnerability Timeline

Vulnerability fix committed to the source repository
2026-08-05
GitHub Security Advisory GHSA-2m8g-3cmr-wg3w published
2026-08-11
Django REST Framework 3.17.2 released
2026-08-11
National Vulnerability Database (NVD) publishes CVSS and CWE attributes
2026-08-13

References & Sources

  • [1]GitHub Security Advisory GHSA-2m8g-3cmr-wg3w
  • [2]NVD - CVE-2026-73228
  • [3]DRF Pull Request #10013
  • [4]DRF Release 3.17.2

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•32 minutes ago•CVE-2026-84307
3.7

CVE-2026-84307: Authentication Oracle and Multi-Factor Authentication Challenge Leak in Filament

An authentication oracle vulnerability exists in Filament before 4.12.5 and 5.7.5. The application initiates MFA challenge workflows prior to verifying user authorization policies, allowing unauthenticated attackers to validate guessed credentials.

Alon Barad
Alon Barad
0 views•6 min read
•about 2 hours ago•CVE-2026-84306
6.5

CVE-2026-84306: Multi-Factor Authentication Bypass via Replay Attack in Filament

A multi-factor authentication bypass vulnerability exists in Filament (Laravel full-stack framework panels) due to improper time-step tracking of Time-Based One-Time Password (TOTP) codes. By submitting valid TOTP codes from an older time window within the drift allowance, an attacker with a user's password can bypass the single-use MFA guarantee and obtain unauthorized account access.

Alon Barad
Alon Barad
3 views•7 min read
•about 3 hours ago•CVE-2026-19418
7.3

CVE-2026-19418: Broken Access Control and Cross-Site Request Forgery in TYPO3 CMS Core

CVE-2026-19418 is a high-severity origin validation vulnerability in TYPO3 CMS that enables Cross-Site Request Forgery (CSRF) and access control bypasses. Due to architectural consolidation of entry points in version 13.0, the core ReferrerEnforcer fails to isolate backend endpoints from the frontend, allowing an attacker with frontend script execution capabilities to perform unauthorized administrative actions.

Alon Barad
Alon Barad
3 views•5 min read
•about 4 hours ago•CVE-2026-84304
8.7

CVE-2026-84304: Uncontrolled Resource Consumption in gRPC-Go HTTP/2 Frame Processing

CVE-2026-84304 is a high-severity uncontrolled resource consumption vulnerability in gRPC-Go, the Go implementation of the gRPC framework. The issue stems from a memory amplification flaw inside the HTTP/2 DATA frame processing subsystem. Remote, unauthenticated attackers can exploit this vulnerability by sending a high volume of heavily fragmented, tiny DATA frames within multiplexed concurrent streams. This causes gRPC-Go servers to allocate excessive internal metadata structures on the Go heap, leading to severe heap memory amplification, intense garbage collection thrashing, and process termination due to Out-of-Memory (OOM) conditions.

Alon Barad
Alon Barad
3 views•7 min read
•about 5 hours ago•CVE-2026-79675
9.8

CVE-2026-79675: JVM Argument Injection in Natural Language Toolkit (NLTK) Stanford Wrappers

CVE-2026-79675 is a critical command injection vulnerability in NLTK versions prior to 3.10.3 that permits remote attackers to execute arbitrary code on the hosting system. This vulnerability stems from an incomplete mitigation of a previous vulnerability, CVE-2026-12841. While NLTK verified global JVM options configured through the library's setup routines, it failed to perform equivalent safety checks on options provided during per-call invocations of Stanford NLP Java wrappers. Attackers controlling these parameters can pass dangerous Java configuration options to the system shell, bypassing security boundaries to spawn interactive processes or load untrusted Java archives.

Amit Schendel
Amit Schendel
5 views•6 min read
•about 6 hours ago•GHSA-2RX9-3G3H-C2JV
8.1

GHSA-2rx9-3g3h-c2jv: Path Traversal Vulnerability in pacquet Lockfile Parser and Filesystem Sinks

A directory traversal vulnerability exists in pacquet, the Rust port of pnpm. When executing an install with the --trust-lockfile flag enabled, a crafted pnpm-lock.yaml file bypasses resolution-policy verification. This allows an attacker to inject path traversal sequences into package names or versions, leading to symbolic links being written outside the workspace directory.

Amit Schendel
Amit Schendel
4 views•5 min read