Skip to main content

Tornado CVE-2026-103262

| EUVDEUVD-2026-90656 HIGH
Improper Handling of Highly Compressed Data (Data Amplification) (CWE-409)
2026-10-01 VulnCheck GHSA-h36x-fm6v-f9vx
8.7
CVSS 4.0 · Vendor: VulnCheck
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Lure app to fetch attacker-controlled URL
  2. Delivery
    Server replies Content-Encoding: gzip bomb
  3. Exploit
    libcurl auto-decompresses to unbounded BytesIO
  4. Execution
    Memory accumulates with no size limit
  5. Impact
    Process OOM-killed, service denial

Vulnerability Assessment

Weakness
CWE
ASVS 5.0
V2 - Validation and Business Logic Compression ratio limits
Exploitation Conditions

Three concrete prerequisites must all hold: (1) the Tornado application must be explicitly configured to use CurlAsyncHTTPClient (via AsyncHTTPClient.configure to the curl implementation) - the default SimpleAsyncHTTPClient is NOT vulnerable because the CVE-2026-49855 size gates live in code the curl client never executes; (2) the request must leave decompress_response at its default True so libcurl advertises gzip,deflate and auto-decodes; and (3) the application must fetch a URL the attacker controls or has compromised so a malicious server can return the gzip bomb. The limiting factors are therefore the non-default client choice and the need for the app to fetch attacker-influenced URLs (SSRF-like or proxy/third-party fetch patterns); the only incidental ceiling before the patch was request_timeout (default 20s), which still permits multi-GB accumulation. There is no authentication required of the attacker and no victim user interaction. Patch adds max_body_size (default 100MB, measured post-decompression).

Impact

This is a genuine but conditionally-gated denial-of-service issue, not a high-CVSS-but-illusory one. The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N) scores 8.7 driven entirely by VA:H, with zero confidentiality or integrity impact (VC:N/VI:N) - consistent with CWE-409 (improper handling of highly compressed data / decompression bomb) and the description's OOM-kill outcome. No EPSS score, no CISA KEV listing, and no standalone weaponized exploit are present in the input, so there is no public exploit identified at time of analysis; the GHSA advisory does, however, contain detailed end-to-end reproduction (RSS 30MB→1008MB in 3.18s, exit 137 OOMKilled) that substantially lowers the barrier to weaponization. The headline caveat is that the raw CVSS PR:N/AC:L overstates real-world exposure: exploitation only applies when the application is deliberately configured to use the non-default CurlAsyncHTTPClient AND fetches an attacker-chosen or attacker-compromised URL - the default SimpleAsyncHTTPClient is NOT affected (its size gates from CVE-2026-49855 fully mitigate this). So the CVSS vector is technically defensible but the effective population of vulnerable deployments is far narrower than AV:N/PR:N suggests; treat as a real priority only for services that use the curl client to fetch untrusted/third-party URLs.

Exploit ScenarioDerived

A Tornado application configured with CurlAsyncHTTPClient (commonly chosen for proxy support or advanced TLS) calls fetch() against a URL an attacker controls or has compromised, with the default decompress_response=True. The malicious server returns Content-Encoding: gzip with a ~2.8MB wire 'bomb'; libcurl auto-decompresses it into an unbounded BytesIO buffer (no max_body_size check existed), driving the process RSS to ~1GB in roughly 3 seconds until the kernel OOM-kills it. No authentication is required of the attacker (they operate the responding server), and no user interaction is needed; the advisory provides a verified reproduction though no standalone exploit script is published.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.5% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 01, 2026

Denial of service in the Tornado web framework's CurlAsyncHTTPClient (all releases before 6.5.9) lets an unauthenticated remote server OOM-kill the application process by answering a fetch with a gzip decompression bomb: libcurl decompresses the body before invoking the client's write callback, and Tornado appends the decoded bytes to an unbounded BytesIO with no post-decompression size check, so a few megabytes on the wire expand to gigabytes of resident memory. Exposure is genuinely conditional - the application must be explicitly configured to use CurlAsyncHTTPClient (via AsyncHTTPClient.configure), must leave decompress_response at its default True, and must fetch a URL the attacker controls or has compromised; the default SimpleAsyncHTTPClient is not affected because the size gates added for CVE-2026-49855 live in code the curl client never executes. The upstream GHSA advisory documents a verified end-to-end reproduction on master (6.6.dev1) and v6.5.8 where a ~2.8 MB gzip payload grew client RSS from roughly 31 MB to about 1,032 MB in 3.18 seconds (exit 137, cgroup OOMKilled=true); the only incidental ceiling before the patch was the default 20-second request_timeout. No public exploit code or active exploitation has been identified at time of analysis, and no CISA KEV listing applies.

RemediationAI

Vendor-released patch: upgrade to Tornado 6.5.9 or later (pip install --upgrade 'tornado>=6.5.9'), which adds the CurlAsyncHTTPClient max_body_size argument - default 100 MB, measured after decompression so compressed expansion cannot slip past it - together with a 1 MB internal pause/resume buffer; note that this release raises the libcurl requirement from 7.22 to 7.81, so older base images may need libcurl upgraded first, and applications that legitimately fetch very large responses must explicitly raise max_body_size or they will now see those transfers rejected. If upgrading is not immediately possible, the most effective compensating control is to stop using the curl client: configure AsyncHTTPClient to tornado.simple_httpclient.SimpleAsyncHTTPClient, whose CVE-2026-49855 gates abort the same bomb at roughly 65 MB - the trade-off is losing the proxy and advanced TLS support that motivated the curl client in the first place. Where the curl client must be retained, set decompress_response=False on requests and perform decompression yourself behind an explicit byte cap (side effect: you must implement gzip/deflate handling and enforce the limit correctly, or the exposure returns), and reduce request_timeout well below the 20-second default to shrink the accumulation window - recognising this only limits, never eliminates, the growth. Independently, treat fetched URLs as untrusted input: restrict or allowlist the destinations an application fetches, and guard against SSRF-style fetches of attacker-supplied URLs, since the whole class of curl-client issues is only reachable when the application retrieves content chosen by an attacker. Detection is straightforward - watch for the cgroup OOMKilled flag, exit code 137, or monotonic RSS growth on processes performing outbound HTTP - and details are in GHSA-chx6-46f5-w4vp, the fix commit e412435febba4569c552c5c9054f1bf92bd171a9 and pull request https://github.com/tornadoweb/tornado/pull/3719.

Affected VersionsENISA

Tornado 0 <6.5.9

Affected Packages

pypi tornado fix: 6.5.9

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in pypi

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

The root cause is CWE-409 (Improper Handling of Highly Compressed Data / data amplification) applied to the outbound HTTP client rather than the server. In tornado/curl_httpclient.py a plain BytesIO is created at line 202 and used as the libcurl WRITEFUNCTION sink at lines 359-360; when request.decompress_response is True (the HTTPRequest default), lines 373-374 call curl.setopt(pycurl.ENCODING, "gzip,deflate"), so libcurl transparently advertises and decodes compressed encodings before the callback ever runs. The callback therefore receives fully decompressed bytes and appends them to a buffer that is never accounted for or capped - the file contains zero occurrences of max_body_size or MAXFILESIZE, and its full commit history (latest 2026-06-17) shows no response-size work. The same 2.8 MB bomb against the default SimpleAsyncHTTPClient fails cleanly at about 65 MB because the compressed Content-Length, chunked-total and cumulative-decompressed-size gates added by CVE-2026-49855 (http1connection.py lines 620, 676 and 742) are enforced in the http1connection layer that the curl client bypasses entirely, which is why this is tracked as a distinct component from the published _GzipMessageDelegate/SimpleAsyncHTTPClient advisory and from the unrelated curl-client issues GHSA-pw6j-qg29-8w7f (credential handle reuse) and GHSA-w235-7p84-xx57 (header CRLF). The fix introduces a _CurlStreamingBuffer that queues libcurl output, pauses the transfer once 1 MB is waiting (libcurl holds at most one read's worth of decoded expansion internally, capped at 64 MB before CURLE_TOO_LARGE), and enforces a new max_body_size argument measured after decompression; the patch also raises the required libcurl floor from 7.22 to 7.81 (the version shipped in Ubuntu 22.04 LTS) so the pause/resume timer notifications behave correctly. The assessed CVSS:3.1 vector (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H) confirms impact is confined to availability with no confidentiality or integrity loss and no authentication or user interaction required; the supplied CVSS:4.0 base of 8.7 is consistent with that reading.

Know when Tornado gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (VulnCheck) PRIMARY 8.7 HIGH
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
vuln.today AI 7.5 HIGH

Remote server-triggered memory exhaustion with no auth or interaction; availability-only impact (A:H), no confidentiality/integrity loss; AC:L as the bomb reliably triggers once the curl client fetches the attacker URL.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Red Hat 7.5 HIGH

Primary rating from Vendor (VulnCheck).

CVSS VectorVendor: VulnCheck

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
None
Vulnerable system: Availability
High
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

DescriptionCVE.org

Tornado versions before 6.5.9 contain an unbounded memory accumulation vulnerability in CurlAsyncHTTPClient that allows remote attackers to cause denial of service by sending a compressed response. Attackers can send a gzip-encoded decompression bomb that accumulates in memory without size limits, causing the application process to be killed by out-of-memory conditions.

Technical POC Analysis

CWE-409 (improper handling of highly compressed data; the advisory also files CWE-400, uncontrolled resource consumption) in tornado/curlhttpclient.py, class CurlAsyncHTTPClient.

Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.

Executive ViewAI

Why It Matters

Organizations using the Tornado web framework with CurlAsyncHTTPClient enabled are exposed to a high-severity denial-of-service condition that can terminate application processes and disrupt dependent services. Publicly available exploit code exists, and the exposure is conditional on specific client configuration and fetching attacker-influenced URLs. Leadership should prioritize remediation because a successful attack can degrade availability of customer-facing and internal APIs.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.5%
Top 58% exploitable
Prevalence
Medium
popular Python async web framework, but curl client is non-default optional component
Data Quality
5 sources
Confidence: Medium
EUVD NVD CVE.org EPSS Vulnrichment Vendor GitHub VulDB

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.5%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
Yes
Human Impact
High
Technical Impact
Partial

Priority Score

45
Low Medium High Critical
KEV: 0
EPSS: +1
CVSS: +44
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

CVE-2024-42733 CRITICAL POC
9.8 Mar 07

An issue in Docmosis Tornado v.2.9.7 and before allows a remote attacker to execute arbitrary code via a crafted script

CVE-2023-25266 HIGH POC
8.8 Feb 28

An issue was discovered in Docmosis Tornado prior to version 2.9.5. Rated high severity (CVSS 8.8), this vulnerability i

CVE-2025-67726 HIGH POC
7.5

py3-tornado in Alpine Linux received a security fix packaged as version 6.5.4-r0, addressing an unspecified vulnerabilit

CVE-2023-25265 HIGH POC
7.5 Feb 28

Docmosis Tornado <= 2.9.4 is vulnerable to Directory Traversal leading to the disclosure of arbitrary content on the fil

CVE-2023-25264 HIGH POC
7.5 Feb 28

An issue was discovered in Docmosis Tornado prior to version 2.9.5. Rated high severity (CVSS 7.5), this vulnerability i

CVE-2026-31958 HIGH
8.7 Mar 11

In versions of Tornado prior to 6.5.5, the only limit on the number of parts in `multipart/form-data` is the `max_body_s

CVE-2026-91990 HIGH
8.7 Sep 15

Memory amplification denial of service in the Tornado Python web framework before 6.5.8 lets unauthenticated remote atta

CVE-2026-91992 HIGH
8.2 Sep 15

Credential leakage in Tornado's CurlAsyncHTTPClient (all releases through 6.5.6) lets sensitive per-request state — clie

CVE-2026-103263 HIGH
8.2 Oct 01

Unauthenticated local file disclosure in Tornado before 6.5.9 lets remote attackers read files outside a configured stat

CVE-2026-82397 HIGH
7.5 Aug 31

Denial-of-service in Tornado prior to 6.5.8 allows unauthenticated remote attackers to stall the entire server by sendin

CVE-2025-67725 HIGH
7.5

Tornado Python web framework on Alpine Linux received a security fix in package version 6.5.4-r0, addressing an uncharac

CVE-2024-52804 HIGH
7.5 Nov 22

Tornado is a Python web framework and asynchronous networking library. Rated high severity (CVSS 7.5), this vulnerabilit

Vendor StatusVendor

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy