ZeroHour

CVE-2026-82397

large

Unauthenticated DoS in Tornado via unbounded form-urlencoded field parsing

CVSS 3.1
7.5 high
EPSS
<1%p28
Published
()
Modified
AI analysis

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.

Affected
Tornado (open-source Python project) Tornado web framework and asynchronous networking libraryall versions prior to 6.5.8 (fixed in 6.5.8)
Estimated exposure
largetens of thousands of internet-exposed Tornado-based services (estimated 10k–100k exposed instances) — Tornado is a mainstream Python async framework embedded in many deployed applications (notably Jupyter-family servers), and exposed instances are commonly identifiable in public internet scans via the default TornadoServer response header,…

Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.

Description

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 news

No ingested article mentions this CVE yet.