CVE-2026-115927
Medium · 5.3CVSS
5.3
EPSS
0.4%
Published
Oct 26, 2026
CISA due date
—
Cloudanix analysis
An attacker can send specially formatted web traffic that freezes an entire Tornado-based application, stopping it from answering any other users until the server is restarted.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Denial Of Service
- Component
- Web Framework
- Class
- Denial of service
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
Tornado processes HTTP/1.1 chunked transfer encoding without yielding to the event loop, allowing a remote peer to send millions of one-byte chunks that monopolize the single-threaded event loop and stall all other connections on the process; non-streaming handlers also retain each chunk as a separate object leading to roughly 20x memory amplification relative to received body size, and the same loop-blocking behavior exists in SimpleAsyncHTTPClient when fetching responses.
Why it matters to the business
A single unauthenticated attacker can render an entire Tornado-based service unresponsive to legitimate traffic within seconds, causing widespread denial of service that affects every connection handled by the affected process and may require process restarts to recover; the issue appeared only three days ago with no known exploitation yet.
How an attack unfolds
An attacker opens a single HTTP/1.1 connection to a Tornado server and transmits a request body using chunked transfer encoding, sending millions of one-byte chunks in rapid succession. Because the decoder never yields to the event loop, the Tornado process remains busy handling the incoming chunks, preventing any other I/O or request processing. The same technique can be used against SimpleAsyncHTTPClient when it reads a malicious server response. No authentication or special privileges are required.
How to fix it
Upgrade all Tornado installations to version 6.6.0 or later. Where immediate upgrade is not possible, enforce request timeouts at a reverse proxy or load balancer, restrict chunked encoding at the network edge, and ensure handlers use @stream_request_body where feasible to reduce per-chunk object retention.
How to confirm the fix worked
After upgrade, confirm the Tornado version string reports 6.6.0 or higher; run a synthetic load test that sends many small chunks and verify that other concurrent requests continue to be served without excessive latency; monitor process CPU and memory under the test to ensure no single connection can starve the loop.
Typical attack path
- Establish a TCP connection to a Tornado HTTP endpoint
- Issue an HTTP/1.1 request declaring chunked transfer encoding
- Transmit millions of single-byte chunks without closing the connection
- Observe that the Tornado event loop stops servicing other sockets
- Optionally repeat against SimpleAsyncHTTPClient clients
How to detect it
Search web-server and application logs for HTTP requests that declare Transfer-Encoding: chunked and contain an unusually high number of small chunks or extremely long chunked bodies; look for processes showing sustained 100% CPU on a single thread while handling a single connection; correlate with connection-duration metrics that exceed normal request timeouts.
What your security team should do
- Prioritize upgrade to Tornado 6.6.0 across all environments within the next 7 days given the three-day-old disclosure
- Add application-level request timeouts and body-size limits at any ingress proxy
- Audit code for handlers that do not use @stream_request_body and consider refactoring high-traffic endpoints
- Include the new chunked-encoding behavior in load and chaos testing suites
The record
Tornado is a Python web framework and asynchronous networking library. Prior to 6.6.0, Tornado decodes HTTP/1.1 chunked transfer encoding by processing body data that has already arrived without yielding to the event loop. A remote unauthenticated peer can send millions of one-byte chunks to monopolize the process event loop and stall every other connection served by that process, while lowering max_body_size only limits the duration of each request. For handlers that do not use @stream_request_body, retaining each chunk as a separate object can consume roughly twenty times the received body size, and SimpleAsyncHTTPClient has the same event-loop behavior when reading a response from a malicious server. This issue is fixed in version 6.6.0.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|
Related vulnerabilities
- CVE-2026-63341 Aedes is an MQTT broker that can run on any stream server. CWE-400
- CVE-2026-62300 Filecoin Pin is an IPFS Pinning Service API implementation that pins to Filecoin's PDP… CWE-400
- CVE-2026-62254 LibreDWG is a free C library to read and write DWG files. CWE-400
- CVE-2026-62250 LibreDWG is a free C library to read and write DWG files. CWE-400
- CVE-2026-62303 Pistache is a high-performance REST toolkit written in C++. CWE-400
- CVE-2026-62160 Daptin is a GraphQL/JSON-API headless CMS. CWE-400
- CVE-2026-61848 Crass is a Ruby CSS parser that's fully compliant with the CSS Syntax Level 3… CWE-400
- CVE-2026-61854 VoiceSentinel is a real-time voice moderation system for Minecraft servers. CWE-400