CVE-2026-115927
Tornado: Event loop blocking and excess memory use from chunked bodies with many small chunks
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.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- None
- Integrity
- None
- Availability
- Low
Exploit likelihood
What each source reports
CVE List Score used
5.3
Tornado: Event loop blocking and excess memory use from chunked bodies with many small chunks
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.
- Record
CVE-2026-115927- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-400, CWE-770
- Updated
- 2026-11-02
EUVDEUVD-2026-110077
5.3
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.
- Record
EUVD-2026-110077- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-r4j5-9xpp-3985
5.3
Tornado: Event loop blocking and excess memory use from chunked bodies with many small chunks
Summary
When Tornado reads an HTTP/1.1 body that uses chunked transfer encoding, it processes all chunks that have already arrived without yielding to the event loop. A client can send a body made of millions of 1-byte chunks, which blocks the event loop (and therefore every other connection served by that process) for the entire time it takes to parse the body. A body near the default max_body_size of 100 MB can block the process for close to a minute, and the attacker can repeat or parallelize these requests.
Bodies made of tiny chunks also consumed far more memory than their size: a handler that does not use @stream_request_body stored each chunk as a separate object, using roughly 20 times as much memory as the bytes received.
Impact
All Tornado HTTP servers are affected when they receive a request body for a handler that reads it, which includes any handler that does not reject the request before the body is read. No authentication is required. Lowering max_body_size reduces the maximum blocking time and memory use for each request but does not remove the issue.
SimpleAsyncHTTPClient is affected in the same way when it reads a response from a malicious server.
Patches
Fixed in Tornado 6.6. Tornado now yields to the event loop periodically while reading any body, combines small chunks before passing them to data_received, and stores non-streaming bodies more compactly.
Applications using @stream_request_body should note that the pieces passed to data_received no longer correspond to HTTP chunk boundaries.
Workarounds
- Run Tornado behind a reverse proxy that buffers request bodies and forwards them with a
Content-Lengthheader instead of chunked encoding. - Lower
max_body_size(for the whole server or for individual handlers) to limit the impact of each request.
Credit
Reported by uttej-badwane.
- Record
GHSA-r4j5-9xpp-3985- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-400, CWE-770
- Updated
- 2026-11-02
NVD
5.3
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.
- Record
CVE-2026-115927- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-400, CWE-770
- Updated
- 2026-11-02
OSV
5.3
Tornado: Event loop blocking and excess memory use from chunked bodies with many small chunks
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.
- Record
CVE-2026-115927- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-400, CWE-770
- Updated
- 2026-11-06
OSVDEBIAN-CVE-2026-115927
5.3
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.
- Record
DEBIAN-CVE-2026-115927- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Updated
- 2026-11-02
Show 5 moreShow less
OSVGHSA-r4j5-9xpp-3985
5.3
Tornado: Event loop blocking and excess memory use from chunked bodies with many small chunks
Summary
When Tornado reads an HTTP/1.1 body that uses chunked transfer encoding, it processes all chunks that have already arrived without yielding to the event loop. A client can send a body made of millions of 1-byte chunks, which blocks the event loop (and therefore every other connection served by that process) for the entire time it takes to parse the body. A body near the default max_body_size of 100 MB can block the process for close to a minute, and the attacker can repeat or parallelize these requests.
Bodies made of tiny chunks also consumed far more memory than their size: a handler that does not use @stream_request_body stored each chunk as a separate object, using roughly 20 times as much memory as the bytes received.
Impact
All Tornado HTTP servers are affected when they receive a request body for a handler that reads it, which includes any handler that does not reject the request before the body is read. No authentication is required. Lowering max_body_size reduces the maximum blocking time and memory use for each request but does not remove the issue.
SimpleAsyncHTTPClient is affected in the same way when it reads a response from a malicious server.
Patches
Fixed in Tornado 6.6. Tornado now yields to the event loop periodically while reading any body, combines small chunks before passing them to data_received, and stores non-streaming bodies more compactly.
Applications using @stream_request_body should note that the pieces passed to data_received no longer correspond to HTTP chunk boundaries.
Workarounds
- Run Tornado behind a reverse proxy that buffers request bodies and forwards them with a
Content-Lengthheader instead of chunked encoding. - Lower
max_body_size(for the whole server or for individual handlers) to limit the impact of each request.
Credit
Reported by uttej-badwane.
- Record
GHSA-r4j5-9xpp-3985- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-400, CWE-770
- Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-115927
5.3
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.
- Record
UBUNTU-CVE-2026-115927- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Updated
- 2026-11-06
OSVAZL-111733 No score
CVE-2026-115927 affecting package python-tornado 6.3.3-11
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.
- Record
AZL-111733- Updated
- 2026-11-05
OSVCLSA-2026-1793872514 No score
TuxCare security update for tornado (3 CVEs)
TuxCare rebuilt tornado to address 3 CVEs. Fixed in 6.1.0.post11+tuxcare.
- Record
CLSA-2026-1793872514- Updated
- 2026-11-05
OSVopenSUSE-SU-2026:12440-1 No score
python313-tornado6-6.6-1.1 on GA media
These are all security issues fixed in the python313-tornado6-6.6-1.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2026:12440-1- Updated
- 2026-11-06
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
tornadoPyPI |
before 6.6 | 6.6 |
python-tornadoAzure Linux:3 |
through 6.3.3-11 | None known |
tornadoTuxCare:PyPI From an advisory covering 3 CVEs |
6.1 up to 6.1.0.post11+tuxcare, plus listed versions 6.1.0.post1+tuxcare6.1.0.post10+tuxcare6.1.0.post2+tuxcare6.1.0.post3+tuxcare6.1.0.post4+tuxcare Show 5 moreShow less6.1.0.post5+tuxcare6.1.0.post6+tuxcare6.1.0.post7+tuxcare6.1.0.post8+tuxcare6.1.0.post9+tuxcare |
6.1.0.post11+tuxcare |
python-tornadoDebian:12 |
All versions, plus listed versions 6.2.0-36.2.0-3+deb12u16.2.0-3+deb12u26.2.0-3+deb12u36.2.0-3+deb12u4 Show 19 moreShow less6.3.2-16.4.0-16.4.0-26.4.1-16.4.1-26.4.1-36.4.2-16.4.2-26.4.2-36.5.2-16.5.2-26.5.2-36.5.4-0.16.5.4-16.5.5-16.5.5-26.5.5-36.5.5-46.5.5-5 |
None known |
python-tornadoDebian:13 |
All versions, plus listed versions 6.4.2-36.4.2-3+deb13u16.4.2-3+deb13u26.5.2-16.5.2-2 Show 8 moreShow less6.5.2-36.5.4-0.16.5.4-16.5.5-16.5.5-26.5.5-36.5.5-46.5.5-5 |
None known |
python-tornadoDebian:14 |
All versions, plus listed versions 6.4.2-36.5.2-16.5.2-26.5.2-36.5.4-0.1 Show 6 moreShow less6.5.4-16.5.5-16.5.5-26.5.5-36.5.5-46.5.5-5 |
None known |
tornadoPyPI |
before 6.6, plus listed versions 0.21.01.11.1.11.2 Show 45 moreShow less1.2.12.02.12.1.12.22.2.12.32.42.4.13.03.0.13.0.23.13.1.13.23.2.13.2.24.04.0.14.0.24.14.1b24.24.2.14.2b14.34.3b14.3b24.44.4.14.4.24.4.34.4b14.54.5.14.5.24.5.34.5b14.5b25.05.0.15.0.25.0a15.0b15.1 |
6.6 |
python-tornadoUbuntu:Pro:16.04:LTS |
All versions, plus listed versions 4.2.1-1ubuntu24.2.1-1ubuntu34.2.1-1ubuntu3.14.2.1-1ubuntu3.1+esm14.2.1-1ubuntu3.1+esm24.2.1-1ubuntu3.1+esm34.2.1-1ubuntu3.1+esm44.2.1-1ubuntu3.1+esm5 |
None known |
python-tornadoUbuntu:Pro:18.04:LTS |
All versions, plus listed versions 4.5.1-2.1~build24.5.2-14.5.3-14.5.3-1ubuntu0.14.5.3-1ubuntu0.2 Show 5 moreShow less4.5.3-1ubuntu0.2+esm14.5.3-1ubuntu0.2+esm24.5.3-1ubuntu0.2+esm34.5.3-1ubuntu0.2+esm44.5.3-1ubuntu0.2+esm5 |
None known |
python-tornadoUbuntu:Pro:20.04:LTS |
All versions, plus listed versions 5.1.1-4ubuntu15.1.1-4ubuntu56.0.3+really5.1.1-26.0.3+really5.1.1-2build16.0.3+really5.1.1-2build2 Show 6 moreShow less6.0.3+really5.1.1-36.0.3+really5.1.1-3ubuntu0.1~esm16.0.3+really5.1.1-3ubuntu0.1~esm36.0.3+really5.1.1-3ubuntu0.1~esm56.0.3+really5.1.1-3ubuntu0.1~esm76.0.3+really5.1.1-3ubuntu0.1~esm8 |
None known |
Show 5 moreShow less
| Package | Affected | Fixed |
|---|---|---|
python-tornadoUbuntu:Pro:22.04:LTS |
All versions, plus listed versions 6.1.0-1build16.1.0-26.1.0-36.1.0-3build16.1.0-3ubuntu0.1~esm1 Show 5 moreShow less6.1.0-3ubuntu0.1~esm26.1.0-3ubuntu0.1~esm46.1.0-3ubuntu0.1~esm56.1.0-3ubuntu0.1~esm66.1.0-3ubuntu0.1~esm7 |
None known |
python-tornadoUbuntu:24.04:LTS |
All versions, plus listed versions 6.3.2-16.4.0-0ubuntu16.4.0-16.4.0-1build16.4.0-1ubuntu0.1 Show 5 moreShow less6.4.0-1ubuntu0.26.4.0-1ubuntu0.46.4.0-1ubuntu0.56.4.0-1ubuntu0.66.4.0-1ubuntu0.7 |
None known |
python-tornadoUbuntu:26.10 |
All versions, plus listed versions 6.5.4-0.16.5.5-26.5.5-46.5.5-56.5.5-5ubuntu1.16.5.5-5ubuntu1.2 |
None known |
python-tornadoUbuntu:26.04:LTS |
All versions, plus listed versions 6.4.2-36.5.2-36.5.4-0.16.5.4-0.1ubuntu0.16.5.4-0.1ubuntu0.26.5.4-0.1ubuntu0.3 |
None known |
python-tornado6openSUSE:Tumbleweed From an advisory covering 3 CVEs |
before 6.6-1.1 | 6.6-1.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected | OSV | |
| affected, aliases, references | OSV | |
| affected | ||
| affected, aliases, facts | OSV | |
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-115927 is a medium vulnerability (CVSS 5.3) in Tornadoweb Tornado, published October 26, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.38%, the 32nd percentile. Fixed in tornado 6.6.
References
github.com/tornadoweb/tornado/security/advisories/GHSA-r4j5-9xpp-3985
github.com/tornadoweb/tornado/pull/3773
github.com/tornadoweb/tornado/commit/ceab33581489751a66fba8566ad6d5960d4b01c8
github.com/tornadoweb/tornado/releases/tag/v6.6.0
nvd.nist.gov/vuln/detail/CVE-2026-115927
github.com/advisories/GHSA-r4j5-9xpp-3985
Show 8 moreShow less
github.com/CVEProject/cvelistV5/tree/main/cves/2026/115xxx/CVE-2026-115927.json
security-tracker.debian.org/tracker/CVE-2026-115927
github.com/tornadoweb/tornado
ubuntu.com/security/CVE-2026-115927
cve.org/CVERecord?id=CVE-2026-115927
suse.com/security/cve/CVE-2026-115927
suse.com/security/cve/CVE-2026-116577
suse.com/security/cve/CVE-2026-116578
Left out here: 39 versions. The JSON record has them.