CVE-2026-82397
largeUnauthenticated DoS in Tornado via unbounded form-urlencoded field parsing
Tornado versions prior to 6.5.8 parse application/x-www-form-urlencoded request bodies with urllib.parse.parse_qs without passing the max_num_fields limit, leaving the number of parameters in a request body effectively unbounded. Because RequestHandler parses the body before dispatching to the application handler, any unauthenticated client can send a POST whose body — bounded only by the default 100 MB max_buffer_size — contains millions of separator-delimited fields. Parsing such a body synchronously stalls Tornado's single-threaded event loop, delaying every connection served by that process, so the attacker gains a full denial of service with no confidentiality or integrity impact (CVSS 7.5, availability-only). Any Python service built on Tornado that accepts urlencoded POST bodies from unauthenticated users is affected, including widely deployed Tornado-based applications such as Jupyter-style services. No public proof-of-concept or in-the-wild exploitation is known; EPSS assigns a 0.4% probability of exploitation within 30 days and the issue is not in CISA KEV.
What to do: Upgrade Tornado to 6.5.8 or later. As interim mitigation, reduce max_buffer_size/max_body_size well below the 100 MB default, enforce a field-count or body-size cap at a reverse proxy or load balancer in front of Tornado services, and inventory which Tornado-based services accept unauthenticated POST bodies and prioritize upgrading internet-exposed ones.
| Tornado (open-source Python project) Tornado web framework and asynchronous networking library | all versions prior to 6.5.8 (fixed in 6.5.8) |
Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.
Tornado is a Python web framework and asynchronous networking library. Prior to 6.5.8, Tornado parses application/x-www-form-urlencoded request bodies with urllib.parse.parse_qs in tornado/escape.py without passing max_num_fields. RequestHandler._execute in tornado/web.py parses the body before handler dispatch through HTTPServerRequest._parse_body and parse_body_arguments in tornado/httputil.py, so an unauthenticated request body containing millions of separator-delimited fields can synchronously stall the single-threaded event loop and delay every connection. The body is bounded only by max_buffer_size, which defaults to 104857600 bytes. This issue is fixed in version 6.5.8.
- Weakness
- CWE-400, CWE-1284
- Vector
- CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
In the news0 stories
No ingested article mentions this CVE yet.