Every CVE Search/ Get API key

CVE-2026-82397

Tornado: Urlencoded body parsing omits max_num_fields, so one request can stall the event loop

7.5 HighFix available

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.

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
High

Exploit likelihood

0.35%Unchanged since Sep 1, 2026
90%50%10%1%

What each source reports

CVE List Score used 7.5

Tornado: Urlencoded body parsing omits max_num_fields, so one request can stall the event loop

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.

Record
CVE-2026-82397
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-400, CWE-1284
Updated
2026-11-02
EUVDEUVD-2026-68892 7.5

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.

Record
EUVD-2026-68892
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Updated
2026-11-02
GitHub AdvisoriesGHSA-8423-8fgw-73vq 6.9

tornado: multipart split() creates huge temp list before max_parts check -> memory amplification DoS (httputil.py:34)

Description

Summary

parse_multipart_form_data (httputil.py:34) calls data.split(b"--"+boundary+b"\r\n") before the max_parts check (:35). A 600KB body with 100k parts creates a 100k-element transient list first, then rejects transient memory amplification (each split element is a copy). Pre-auth HTTP DoS.

Root cause

parts = data[:final_boundary_index].split(b"--" + boundary + b"\r\n")  # :34  huge list first
if len(parts) > config.max_parts:                                       # :35  check after
    raise HTTPInputError("multipart/form-data has too many parts")

PoC

gist: https://gist.github.com/afldl/649861f25d39b53b7edbe0298e171617 poc.py + output.txt (100k parts from 600KB transient list).

Fix

Count separators without materializing the list (e.g. data.count(b"--"+boundary) first).

Credit

Reported by afldl, 2026-07.

Record
GHSA-8423-8fgw-73vq
CVSS 4.0
6.9 MediumCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
Weakness
CWE-770
Updated
2026-11-02
GitHub AdvisoriesGHSA-mpf4-983q-p7j4 7.5

Tornado: Urlencoded body parsing omits max_num_fields, so one request can stall the event loop

Summary

Tornado parses application/x-www-form-urlencoded bodies with urllib.parse.parse_qs and does not pass max_num_fields. A body made almost entirely of separators produces tens of millions of fields, and the parse happens on the event loop before the handler runs, so a single request stalls the whole server.

Where it is

tornado/escape.py, at HEAD e530031405e2154654dedc4c84d5656b557ea310:

result = urllib.parse.parse_qs(
    qs, keep_blank_values, strict_parsing, encoding="latin1", errors="strict"
)

max_num_fields is the parameter CPython added for exactly this, and it is absent.

The path to it is entirely server-side and pre-dispatch. RequestHandler._execute parses the body at tornado/web.py:1821, which reaches HTTPServerRequest._parse_body at tornado/httputil.py:636, and the urlencoded branch of parse_body_arguments calls parse_qs_bytes at tornado/httputil.py:1030.

The size that reaches it is bounded only by the body cap, which defaults to the stream's max_buffer_size of 104857600 at tornado/iostream.py:239, applied as the request body default at tornado/http1connection.py:136-140. A 100 MB body of separators is around fifty million fields.

Impact

Denial of service against the whole process, not one request. Tornado is single-threaded and the parse is synchronous on the event loop, so every other connection waits. No authentication is needed if any route accepts a form post, which is the normal case.

Suggested fix

Pass a bound:

result = urllib.parse.parse_qs(
    qs, keep_blank_values, strict_parsing, encoding="latin1", errors="strict",
    max_num_fields=max_num_fields,
)

with a conservative default and a way for applications to raise it. CPython raises ValueError when the limit is exceeded, which maps cleanly onto a 400.

Lowering the default body cap for urlencoded specifically would help too, since 100 MB of form fields is not a shape any real client sends.

Why I do not think this is a duplicate

The published tornado advisories cover out-of-bounds access in the C extension, unbounded accumulation of decompressed chunks in AsyncHTTPClient, the Authorization header surviving cross-origin redirects, credential leakage on curl handle reuse, and cookie attribute validation. The decompression one is the nearest in spirit and is on the client side; this is the server parsing a request body. The call is unchanged at HEAD.

Record
GHSA-mpf4-983q-p7j4
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-400, CWE-1284
Updated
2026-11-02
NVD 7.5

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.

Record
CVE-2026-82397
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-400, CWE-1284
Updated
2026-11-02
OSVBELL-CVE-2026-82397 7.5
Record
BELL-CVE-2026-82397
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Updated
2026-11-02
Show 30 moreShow less
OSV 7.5

Tornado: Urlencoded body parsing omits max_num_fields, so one request can stall the event loop

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.

Record
CVE-2026-82397
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-1284, CWE-400
Updated
2026-11-02
OSVDEBIAN-CVE-2026-82397 7.5

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.

Record
DEBIAN-CVE-2026-82397
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Updated
2026-11-02
OSVGHSA-8423-8fgw-73vq 6.9

tornado: multipart split() creates huge temp list before max_parts check -> memory amplification DoS (httputil.py:34)

Description

Summary

parse_multipart_form_data (httputil.py:34) calls data.split(b"--"+boundary+b"\r\n") before the max_parts check (:35). A 600KB body with 100k parts creates a 100k-element transient list first, then rejects transient memory amplification (each split element is a copy). Pre-auth HTTP DoS.

Root cause

parts = data[:final_boundary_index].split(b"--" + boundary + b"\r\n")  # :34  huge list first
if len(parts) > config.max_parts:                                       # :35  check after
    raise HTTPInputError("multipart/form-data has too many parts")

PoC

gist: https://gist.github.com/afldl/649861f25d39b53b7edbe0298e171617 poc.py + output.txt (100k parts from 600KB transient list).

Fix

Count separators without materializing the list (e.g. data.count(b"--"+boundary) first).

Credit

Reported by afldl, 2026-07.

Record
GHSA-8423-8fgw-73vq
CVSS 4.0
6.9 MediumCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
Weakness
CWE-770
Updated
2026-11-02
OSVGHSA-mpf4-983q-p7j4 7.5

Tornado: Urlencoded body parsing omits max_num_fields, so one request can stall the event loop

Summary

Tornado parses application/x-www-form-urlencoded bodies with urllib.parse.parse_qs and does not pass max_num_fields. A body made almost entirely of separators produces tens of millions of fields, and the parse happens on the event loop before the handler runs, so a single request stalls the whole server.

Where it is

tornado/escape.py, at HEAD e530031405e2154654dedc4c84d5656b557ea310:

result = urllib.parse.parse_qs(
    qs, keep_blank_values, strict_parsing, encoding="latin1", errors="strict"
)

max_num_fields is the parameter CPython added for exactly this, and it is absent.

The path to it is entirely server-side and pre-dispatch. RequestHandler._execute parses the body at tornado/web.py:1821, which reaches HTTPServerRequest._parse_body at tornado/httputil.py:636, and the urlencoded branch of parse_body_arguments calls parse_qs_bytes at tornado/httputil.py:1030.

The size that reaches it is bounded only by the body cap, which defaults to the stream's max_buffer_size of 104857600 at tornado/iostream.py:239, applied as the request body default at tornado/http1connection.py:136-140. A 100 MB body of separators is around fifty million fields.

Impact

Denial of service against the whole process, not one request. Tornado is single-threaded and the parse is synchronous on the event loop, so every other connection waits. No authentication is needed if any route accepts a form post, which is the normal case.

Suggested fix

Pass a bound:

result = urllib.parse.parse_qs(
    qs, keep_blank_values, strict_parsing, encoding="latin1", errors="strict",
    max_num_fields=max_num_fields,
)

with a conservative default and a way for applications to raise it. CPython raises ValueError when the limit is exceeded, which maps cleanly onto a 400.

Lowering the default body cap for urlencoded specifically would help too, since 100 MB of form fields is not a shape any real client sends.

Why I do not think this is a duplicate

The published tornado advisories cover out-of-bounds access in the C extension, unbounded accumulation of decompressed chunks in AsyncHTTPClient, the Authorization header surviving cross-origin redirects, credential leakage on curl handle reuse, and cookie attribute validation. The decompression one is the nearest in spirit and is on the client side; this is the server parsing a request body. The call is unchanged at HEAD.

Record
GHSA-mpf4-983q-p7j4
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-1284, CWE-400
Updated
2026-11-02
OSVOESA-2026-3971 7.5

python-tornado security update

Tornado is an open source version of the scalable, non-blocking web server and tools.

Security Fix(es):

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.(CVE-2026-82397)

Record
OESA-2026-3971
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Updated
2026-11-02
OSVOESA-2026-3972 7.5

python-tornado security update

Tornado is an open source version of the scalable, non-blocking web server and tools.

Security Fix(es):

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.(CVE-2026-82397)

Record
OESA-2026-3972
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Updated
2026-11-02
OSVOESA-2026-3973 7.5

python-tornado security update

Tornado is an open source version of the scalable, non-blocking web server and tools.

Security Fix(es):

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.(CVE-2026-82397)

Record
OESA-2026-3973
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Updated
2026-11-02
OSVOESA-2026-4037 7.7

python-tornado security update

Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. By using non-blocking network I/O, Tornado can scale to tens of thousands of open connections, making it ideal for long polling, WebSockets, and other applications that require a long-lived connection to each user.

Security Fix(es):

Tornado before 6.3.3 contains an HTTP request smuggling vulnerability due to improper parsing of Content-Length headers accepting non-standard characters. Attackers can send crafted HTTP requests with these characters to bypass proxy validation and smuggle requests when deployed behind certain proxies.(CVE-2023-54397)

Tornado before 6.4.1 ignores duplicate Transfer-Encoding: chunked headers, treating requests as having no message body and parsing the chunked body as a subsequent request. Attackers can exploit this inconsistency when Tornado is deployed behind proxies to perform HTTP request smuggling, enabling access control bypass, cache poisoning, or connection desynchronization.(CVE-2024-14029)

Tornado before 6.4.1 contains a CRLF injection vulnerability in CurlAsyncHTTPClient that fails to reject carriage return and line feed characters in request headers. Attackers can inject CRLF sequences into header values to inject arbitrary headers or construct entirely new HTTP requests.(CVE-2024-58384)

When SimpleAsyncHTTPClient follows a 3xx redirect, it shallow-copies the original HTTPRequest, rewrites the URL, decrements max_redirects, and removes only the Host header. It does not clear Authorization, auth_username, auth_password, or auth_mode when the redirect target changes origin. As a result, credentials intended for one origin can be forwarded to a different origin when follow_redirects=True, which is the default. Beginning in Tornado 6.5.6, SimpleAsyncHTTPClient matches the default behavior of libcurl (and therefore CurlAsyncHTTPClient): When a redirect changes the scheme, host, or port of the url, the Authorization and Cookie headers will be removed when following the redirect.(CVE-2026-49853)

SummaryTornado's optional native extension tornado.speedups implements websocket_mask without validating that the mask argument is exactly four bytes long. The C function reads four bytes from mask unconditionally, even when Python passes a shorter byte string. This can read beyond the provided buffer, exposing up to 3 bytes of uninitialized memory.The behavior is reachable from Tornado's XSRF token decoder when xsrf_cookies=True and the native extension is active. ### MitigationsThis bug is fixed in Tornado 6.5.6. Prior to upgrading to this version, setting the environment variable TORNADO_EXTENSION=0 will disable the vulnerable code (at the expense of reducing websocket performance).(CVE-2026-49854)

Tornado's gzip decompression routines work in limited-size chunks, but have no overall limit for the total size of decompressed chunks that they will accumulate (There has always been a limit for the total compressed size). This allows a malicious server to consume effectively unlimited amounts of memory if it is accessed via SimpleAsyncHTTPClient in its default configuration. HTTPServer is not affected in its default configuration, but it is if decompress_request=True is set. This bug is fixed in Tornado 6.5.6. max_body_size is now checked both for the compressed and cumulative decompressed size of the response.(CVE-2026-49855)

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…

Record
OESA-2026-4037
CVSS 3.1
7.7 HighCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N
Updated
2026-11-02
OSVPYSEC-2026-3928 7.5

Tornado: Urlencoded body parsing omits max_num_fields, so one request can stall the event loop

Summary

Tornado parses application/x-www-form-urlencoded bodies with urllib.parse.parse_qs and does not pass max_num_fields. A body made almost entirely of separators produces tens of millions of fields, and the parse happens on the event loop before the handler runs, so a single request stalls the whole server.

Where it is

tornado/escape.py, at HEAD e530031405e2154654dedc4c84d5656b557ea310:

result = urllib.parse.parse_qs(
    qs, keep_blank_values, strict_parsing, encoding="latin1", errors="strict"
)

max_num_fields is the parameter CPython added for exactly this, and it is absent.

The path to it is entirely server-side and pre-dispatch. RequestHandler._execute parses the body at tornado/web.py:1821, which reaches HTTPServerRequest._parse_body at tornado/httputil.py:636, and the urlencoded branch of parse_body_arguments calls parse_qs_bytes at tornado/httputil.py:1030.

The size that reaches it is bounded only by the body cap, which defaults to the stream's max_buffer_size of 104857600 at tornado/iostream.py:239, applied as the request body default at tornado/http1connection.py:136-140. A 100 MB body of separators is around fifty million fields.

Impact

Denial of service against the whole process, not one request. Tornado is single-threaded and the parse is synchronous on the event loop, so every other connection waits. No authentication is needed if any route accepts a form post, which is the normal case.

Suggested fix

Pass a bound:

result = urllib.parse.parse_qs(
    qs, keep_blank_values, strict_parsing, encoding="latin1", errors="strict",
    max_num_fields=max_num_fields,
)

with a conservative default and a way for applications to raise it. CPython raises ValueError when the limit is exceeded, which maps cleanly onto a 400.

Lowering the default body cap for urlencoded specifically would help too, since 100 MB of form fields is not a shape any real client sends.

Why I do not think this is a duplicate

The published tornado advisories cover out-of-bounds access in the C extension, unbounded accumulation of decompressed chunks in AsyncHTTPClient, the Authorization header surviving cross-origin redirects, credential leakage on curl handle reuse, and cookie attribute validation. The decompression one is the nearest in spirit and is on the client side; this is the server parsing a request body. The call is unchanged at HEAD.

Record
PYSEC-2026-3928
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Updated
2026-11-02
OSVRHSA-2026:67146 7.7

Red Hat Security Advisory: python-tornado security update

Record
RHSA-2026:67146
CVSS 3.1
7.7 HighCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N
Updated
2026-11-02
OSVRHSA-2026:67147 7.7

Red Hat Security Advisory: python-tornado security update

Record
RHSA-2026:67147
CVSS 3.1
7.7 HighCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N
Updated
2026-11-02
OSVRHSA-2026:84798 7.5

Red Hat Security Advisory: pcs security update

Record
RHSA-2026:84798
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Updated
2026-11-02
OSVRHSA-2026:84843 7.5

Red Hat Security Advisory: pcs security update

Record
RHSA-2026:84843
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Updated
2026-11-02
OSVRHSA-2026:84844 7.5

Red Hat Security Advisory: pcs security update

Record
RHSA-2026:84844
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Updated
2026-11-02
OSVRHSA-2026:85135 7.5

Red Hat Security Advisory: pcs security update

Record
RHSA-2026:85135
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Updated
2026-11-02
OSVRLSA-2026:84798 7.5

Important: pcs security update

The pcs packages provide a command-line configuration system for the Pacemaker and Corosync utilities.

Security Fix(es):

  • python-tornado: Tornado: Denial of Service via excessive URL-encoded body fields (CVE-2026-82397)

  • python-tornado: Tornado before 6.4.1 HTTP Request Smuggling via Transfer-Encoding (CVE-2024-14029)

For more details about the security issue(s), including the impact, a CVSS score, acknowledgments, and other related information, refer to the CVE page(s) listed in the References section.

Record
RLSA-2026:84798
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:L/I:H/A:N
Updated
2026-11-02
OSVUBUNTU-CVE-2026-82397 7.5

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.

Record
UBUNTU-CVE-2026-82397
CVSS 3.1
7.5 HighCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Updated
2026-11-06
OSVALSA-2026:67146 No score

Important: python-tornado security update

Python is an interpreted, interactive, object-oriented programming language, which includes modules, classes, exceptions, very high level dynamic data types and dynamic typing. Python supports interfaces to many system calls and libraries, as well as to various windowing systems.

Security Fix(es):

  • tornado: Tornado: Information disclosure via improper handling of credentials during HTTP redirects (CVE-2026-49853)
  • tornado: Tornado: Denial of Service via uncontrolled gzip decompression memory consumption (CVE-2026-49855)

For more details about the security issue(s), including the impact, a CVSS score, acknowledgments, and other related information, refer to the CVE page(s) listed in the References section.

Record
ALSA-2026:67146
Updated
2026-11-02
OSVALSA-2026:67147 No score

Important: python-tornado security update

Python is an interpreted, interactive, object-oriented programming language, which includes modules, classes, exceptions, very high level dynamic data types and dynamic typing. Python supports interfaces to many system calls and libraries, as well as to various windowing systems.

Security Fix(es):

  • tornado: Tornado: Information disclosure via improper handling of credentials during HTTP redirects (CVE-2026-49853)
  • tornado: Tornado: Denial of Service via uncontrolled gzip decompression memory consumption (CVE-2026-49855)

For more details about the security issue(s), including the impact, a CVSS score, acknowledgments, and other related information, refer to the CVE page(s) listed in the References section.

Record
ALSA-2026:67147
Updated
2026-11-02
OSVALSA-2026:84798 No score

Important: pcs security update

The pcs packages provide a command-line configuration system for the Pacemaker and Corosync utilities.

Security Fix(es):

  • python-tornado: Tornado: Denial of Service via excessive URL-encoded body fields (CVE-2026-82397)
  • python-tornado: Tornado before 6.4.1 HTTP Request Smuggling via Transfer-Encoding (CVE-2024-14029)

For more details about the security issue(s), including the impact, a CVSS score, acknowledgments, and other related information, refer to the CVE page(s) listed in the References section.

Record
ALSA-2026:84798
Updated
2026-11-02
OSVAZL-98544 No score

CVE-2026-82397 affecting package python-tornado 6.3.3-11

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.

Record
AZL-98544
Updated
2026-11-05
OSVCLSA-2026-1789369095 No score

TuxCare security update for tornado (2 CVEs)

TuxCare rebuilt tornado to address 2 CVEs. Fixed in 6.1.0.post8+tuxcare.

Record
CLSA-2026-1789369095
Updated
2026-11-02
OSVCLSA-2026-1790675116 No score

TuxCare security update for tornado (15 CVEs)

TuxCare rebuilt tornado to address 15 CVEs. Fixed in 5.1.1.post4+tuxcare.

Record
CLSA-2026-1790675116
Updated
2026-11-02
OSVopenSUSE-SU-2026:22059-1 No score

Security update for python-tornado6

This update for python-tornado6 fixes the following issues:

  • CVE-2026-82397: an unauthenticated request body containing millions of separator-delimited fields can synchronously stall the single-threaded event loop and delay every connection (bsc#1277725).
  • CVE-2026-91990: splitting of multipart data before validation of the max_parts limit allows for resource exhaustion and a denial of service (bsc#1281439).
  • CVE-2026-91991: incomplete fix for cookie attribute injection allows for cookie validation bypass via semicolon- delimited data in capitalized parameters (bsc#1281440).
Record
openSUSE-SU-2026:22059-1
Updated
2026-11-02
OSVROOT-APP-PYPI-CVE-2026-82397 No score

CVE-2026-82397 in tornado - Patched by Root

Root has patched CVE-2026-82397 in the tornado package for Root:PyPI. Multiple fixed versions available.

Record
ROOT-APP-PYPI-CVE-2026-82397
Updated
2026-11-02
OSVSUSE-SU-2026:23523-1 No score

Security update for python-tornado6

This update for python-tornado6 fixes the following issue:

  • CVE-2026-82397: an unauthenticated request body containing millions of separator-delimited fields can synchronously stall the single-threaded event loop and delay every connection (bsc#1277725).
Record
SUSE-SU-2026:23523-1
Updated
2026-11-02
OSVSUSE-SU-2026:24121-1 No score

Security update for python-tornado6

This update for python-tornado6 fixes the following issues:

  • CVE-2026-82397: an unauthenticated request body containing millions of separator-delimited fields can synchronously stall the single-threaded event loop and delay every connection (bsc#1277725).
  • CVE-2026-91990: splitting of multipart data before validation of the max_parts limit allows for resource exhaustion and a denial of service (bsc#1281439).
  • CVE-2026-91991: incomplete fix for cookie attribute injection allows for cookie validation bypass via semicolon- delimited data in capitalized parameters (bsc#1281440).
Record
SUSE-SU-2026:24121-1
Updated
2026-11-02
OSVSUSE-SU-2026:24207-1 No score

Security update for python-tornado6

This update for python-tornado6 fixes the following issues:

  • CVE-2026-82397: an unauthenticated request body containing millions of separator-delimited fields can synchronously stall the single-threaded event loop and delay every connection (bsc#1277725).
  • CVE-2026-91990: splitting of multipart data before validation of the max_parts limit allows for resource exhaustion and a denial of service (bsc#1281439).
  • CVE-2026-91991: incomplete fix for cookie attribute injection allows for cookie validation bypass via semicolon- delimited data in capitalized parameters (bsc#1281440).
Record
SUSE-SU-2026:24207-1
Updated
2026-11-02
OSVSUSE-SU-2026:4073-1 No score

Security update for python-tornado

This update for python-tornado fixes the following issue:

  • CVE-2026-82397: an unauthenticated request body containing millions of separator-delimited fields can synchronously stall the single-threaded event loop and delay every connection (bsc#1277725).
Record
SUSE-SU-2026:4073-1
Updated
2026-11-02
OSVSUSE-SU-2026:4076-1 No score

Security update for python-tornado6

This update for python-tornado6 fixes the following issue

  • CVE-2026-82397: an unauthenticated request body containing millions of separator-delimited fields can synchronously stall the single-threaded event loop and delay every connection (bsc#1277725).
Record
SUSE-SU-2026:4076-1
Updated
2026-11-02

Affected products

Affected packages

Affected packages
PackageAffectedFixed
tornado
PyPI
through 6.5.7
6.5.8
python3-tornado
AlmaLinux:9
From an advisory covering 4 CVEs
before 6.5.8-0.el9_8.1
6.5.8-0.el9_8.1
python3-tornado
AlmaLinux:10
From an advisory covering 4 CVEs
before 6.5.8-0.el10_2.1
6.5.8-0.el10_2.1
pcs
AlmaLinux:8
From an advisory covering 2 CVEs
before 0.10.18-2.el8_10.10.alma.1
0.10.18-2.el8_10.10.alma.1
pcs-snmp
AlmaLinux:8
From an advisory covering 2 CVEs
before 0.10.18-2.el8_10.10.alma.1
0.10.18-2.el8_10.10.alma.1
python-tornado
Azure Linux:3
through 6.3.3-11 None known
py3-tornado
Alpaquita:25
6.5.1-r0 up to 6.5.5-r1
6.5.5-r1
py3-tornado
Alpaquita:stream
6.3.3-r0 up to 6.5.6-r1
6.5.6-r1
tornado
TuxCare:PyPI
6.1 up to 6.1.0.post8+tuxcare, plus listed versions
6.1.0.post1+tuxcare6.1.0.post2+tuxcare6.1.0.post3+tuxcare6.1.0.post4+tuxcare6.1.0.post5+tuxcare6.1.0.post6+tuxcare6.1.0.post7+tuxcare
6.1.0.post8+tuxcare
tornado
TuxCare:PyPI
From an advisory covering 9 CVEs
5.1.1 up to 5.1.1.post4+tuxcare, plus listed versions
5.1.1.post1+tuxcare5.1.1.post2+tuxcare5.1.1.post3+tuxcare
5.1.1.post4+tuxcare
Show 69 moreShow less
Affected packages
PackageAffectedFixed
python-tornado
Debian: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 less
6.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-tornado
Debian: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 less
6.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-tornado
Debian: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 less
6.5.4-16.5.5-16.5.5-26.5.5-36.5.5-46.5.5-5
None known
tornado
PyPI
before 6.5.8, plus listed versions
0.21.01.11.1.11.2
Show 45 moreShow less
1.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.5.8
python-tornado
openEuler:24.03-LTS-SP3
before 6.5-6.oe2403sp3
6.5-6.oe2403sp3
python-tornado
openEuler:24.03-LTS-SP4
before 6.5-6.oe2403sp4
6.5-6.oe2403sp4
python-tornado
openEuler:24.03-LTS-SP1
before 6.5-6.oe2403sp1
6.5-6.oe2403sp1
python-tornado
openEuler:22.03-LTS-SP4
From an advisory covering 10 CVEs
before 6.5.10-1.oe2203sp4
6.5.10-1.oe2203sp4
python-tornado
Red Hat:enterprise_linux:9::appstream
From an advisory covering 4 CVEs
before 0:6.5.8-0.el9_8.1
0:6.5.8-0.el9_8.1
python-tornado-debugsource
Red Hat:enterprise_linux:9::appstream
From an advisory covering 4 CVEs
before 0:6.5.8-0.el9_8.1
0:6.5.8-0.el9_8.1
python3-tornado
Red Hat:enterprise_linux:9::appstream
From an advisory covering 4 CVEs
before 0:6.5.8-0.el9_8.1
0:6.5.8-0.el9_8.1
python3-tornado-debuginfo
Red Hat:enterprise_linux:9::appstream
From an advisory covering 4 CVEs
before 0:6.5.8-0.el9_8.1
0:6.5.8-0.el9_8.1
python-tornado
Red Hat:enterprise_linux:10.2
From an advisory covering 4 CVEs
before 0:6.5.8-0.el10_2.1
0:6.5.8-0.el10_2.1
python-tornado-debugsource
Red Hat:enterprise_linux:10.2
From an advisory covering 4 CVEs
before 0:6.5.8-0.el10_2.1
0:6.5.8-0.el10_2.1
python3-tornado
Red Hat:enterprise_linux:10.2
From an advisory covering 4 CVEs
before 0:6.5.8-0.el10_2.1
0:6.5.8-0.el10_2.1
python3-tornado-debuginfo
Red Hat:enterprise_linux:10.2
From an advisory covering 4 CVEs
before 0:6.5.8-0.el10_2.1
0:6.5.8-0.el10_2.1
pcs
Red Hat:enterprise_linux:8::highavailability
From an advisory covering 2 CVEs
before 0:0.10.18-2.el8_10.10
0:0.10.18-2.el8_10.10
pcs-snmp
Red Hat:enterprise_linux:8::highavailability
From an advisory covering 2 CVEs
before 0:0.10.18-2.el8_10.10
0:0.10.18-2.el8_10.10
pcs
Red Hat:enterprise_linux:8::resilientstorage
From an advisory covering 2 CVEs
before 0:0.10.18-2.el8_10.10
0:0.10.18-2.el8_10.10
pcs-snmp
Red Hat:enterprise_linux:8::resilientstorage
From an advisory covering 2 CVEs
before 0:0.10.18-2.el8_10.10
0:0.10.18-2.el8_10.10
pcs
Red Hat:rhel_aus:8.4::highavailability
From an advisory covering 2 CVEs
before 0:0.10.8-1.el8_4.12
0:0.10.8-1.el8_4.12
pcs-snmp
Red Hat:rhel_aus:8.4::highavailability
From an advisory covering 2 CVEs
before 0:0.10.8-1.el8_4.12
0:0.10.8-1.el8_4.12
pcs
Red Hat:rhel_eus_long_life:8.4::highavailability
From an advisory covering 2 CVEs
before 0:0.10.8-1.el8_4.12
0:0.10.8-1.el8_4.12
pcs-snmp
Red Hat:rhel_eus_long_life:8.4::highavailability
From an advisory covering 2 CVEs
before 0:0.10.8-1.el8_4.12
0:0.10.8-1.el8_4.12
pcs
Red Hat:rhel_e4s:8.8::highavailability
From an advisory covering 2 CVEs
before 0:0.10.15-4.el8_8.12
0:0.10.15-4.el8_8.12
pcs-snmp
Red Hat:rhel_e4s:8.8::highavailability
From an advisory covering 2 CVEs
before 0:0.10.15-4.el8_8.12
0:0.10.15-4.el8_8.12
pcs
Red Hat:rhel_tus:8.8::highavailability
From an advisory covering 2 CVEs
before 0:0.10.15-4.el8_8.12
0:0.10.15-4.el8_8.12
pcs-snmp
Red Hat:rhel_tus:8.8::highavailability
From an advisory covering 2 CVEs
before 0:0.10.15-4.el8_8.12
0:0.10.15-4.el8_8.12
pcs
Red Hat:rhel_eus_long_life:8.6::highavailability
From an advisory covering 2 CVEs
before 0:0.10.12-6.el8_6.14
0:0.10.12-6.el8_6.14
pcs-snmp
Red Hat:rhel_eus_long_life:8.6::highavailability
From an advisory covering 2 CVEs
before 0:0.10.12-6.el8_6.14
0:0.10.12-6.el8_6.14
pcs
Rocky Linux:8
From an advisory covering 2 CVEs
before 0:0.10.18-2.el8_10.10
0:0.10.18-2.el8_10.10
tornado
Root:PyPI
before 6.2+aikido.10
6.2+aikido.106.5.3+aikido.36.5.3+aikido.46.5.3+aikido.76.5.3+aikido.56.2+aikido.116.2+aikido.126.5.3+aikido.6
python-tornado6
SUSE:Linux Micro 6.1
before 6.4-slfo.1.1_7.1
6.4-slfo.1.1_7.1
python-tornado6
SUSE:Linux Micro 6.2
From an advisory covering 3 CVEs
before 6.5-160000.7.1
6.5-160000.7.1
python-tornado6
SUSE:Linux Enterprise Server 16.0
From an advisory covering 3 CVEs
before 6.5-160000.7.1
6.5-160000.7.1
python-tornado6
SUSE:Linux Enterprise Server for SAP applications 16.0
From an advisory covering 3 CVEs
before 6.5-160000.7.1
6.5-160000.7.1
python-tornado
SUSE:Linux Enterprise Micro 5.3
before 4.5.3-150000.3.28.1
4.5.3-150000.3.28.1
python-tornado
SUSE:Linux Enterprise Micro 5.4
before 4.5.3-150000.3.28.1
4.5.3-150000.3.28.1
python-tornado
SUSE:Linux Enterprise Micro 5.5
before 4.5.3-150000.3.28.1
4.5.3-150000.3.28.1
python-tornado
SUSE:Linux Enterprise Module for Basesystem 15 SP7
before 4.5.3-150000.3.28.1
4.5.3-150000.3.28.1
python-tornado
SUSE:Linux Enterprise High Performance Computing 15 SP4-ESPOS
before 4.5.3-150000.3.28.1
4.5.3-150000.3.28.1
python-tornado
SUSE:Linux Enterprise High Performance Computing 15 SP4-LTSS
before 4.5.3-150000.3.28.1
4.5.3-150000.3.28.1
python-tornado
SUSE:Linux Enterprise High Performance Computing 15 SP5-ESPOS
before 4.5.3-150000.3.28.1
4.5.3-150000.3.28.1
python-tornado
SUSE:Linux Enterprise High Performance Computing 15 SP5-LTSS
before 4.5.3-150000.3.28.1
4.5.3-150000.3.28.1
python-tornado
SUSE:Linux Enterprise Server 15 SP4-LTSS
before 4.5.3-150000.3.28.1
4.5.3-150000.3.28.1
python-tornado
SUSE:Linux Enterprise Server 15 SP5-LTSS
before 4.5.3-150000.3.28.1
4.5.3-150000.3.28.1
python-tornado
SUSE:Linux Enterprise Server 15 SP6-LTSS
before 4.5.3-150000.3.28.1
4.5.3-150000.3.28.1
python-tornado
SUSE:Linux Enterprise Server for SAP Applications 15 SP4
before 4.5.3-150000.3.28.1
4.5.3-150000.3.28.1
python-tornado
SUSE:Linux Enterprise Server for SAP Applications 15 SP5
before 4.5.3-150000.3.28.1
4.5.3-150000.3.28.1
python-tornado
SUSE:Linux Enterprise Server for SAP Applications 15 SP6
before 4.5.3-150000.3.28.1
4.5.3-150000.3.28.1
python-tornado6
SUSE:Linux Enterprise Module for Python 3 15 SP7
before 6.3.2-150400.9.24.1
6.3.2-150400.9.24.1
python-tornado6
SUSE:Linux Enterprise High Performance Computing 15 SP4-ESPOS
before 6.3.2-150400.9.24.1
6.3.2-150400.9.24.1
python-tornado6
SUSE:Linux Enterprise High Performance Computing 15 SP4-LTSS
before 6.3.2-150400.9.24.1
6.3.2-150400.9.24.1
python-tornado6
SUSE:Linux Enterprise High Performance Computing 15 SP5-ESPOS
before 6.3.2-150400.9.24.1
6.3.2-150400.9.24.1
python-tornado6
SUSE:Linux Enterprise High Performance Computing 15 SP5-LTSS
before 6.3.2-150400.9.24.1
6.3.2-150400.9.24.1
python-tornado6
SUSE:Linux Enterprise Server 15 SP4-LTSS
before 6.3.2-150400.9.24.1
6.3.2-150400.9.24.1
python-tornado6
SUSE:Linux Enterprise Server 15 SP5-LTSS
before 6.3.2-150400.9.24.1
6.3.2-150400.9.24.1
python-tornado6
SUSE:Linux Enterprise Server 15 SP6-LTSS
before 6.3.2-150400.9.24.1
6.3.2-150400.9.24.1
python-tornado6
SUSE:Linux Enterprise Server for SAP Applications 15 SP4
before 6.3.2-150400.9.24.1
6.3.2-150400.9.24.1
python-tornado6
SUSE:Linux Enterprise Server for SAP Applications 15 SP5
before 6.3.2-150400.9.24.1
6.3.2-150400.9.24.1
python-tornado6
SUSE:Linux Enterprise Server for SAP Applications 15 SP6
before 6.3.2-150400.9.24.1
6.3.2-150400.9.24.1
python-tornado
Ubuntu: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-tornado
Ubuntu: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 less
4.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-tornado
Ubuntu: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 less
6.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
python-tornado
Ubuntu: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 less
6.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-tornado
Ubuntu: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 less
6.4.0-1ubuntu0.26.4.0-1ubuntu0.46.4.0-1ubuntu0.56.4.0-1ubuntu0.66.4.0-1ubuntu0.7
None known
python-tornado
Ubuntu: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-tornado
Ubuntu: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-tornado6
openSUSE:Leap 16.0
From an advisory covering 3 CVEs
before 6.5-160000.7.1
6.5-160000.7.1

History

History
RecordedChangedSources
affectedOSV
affected
factsOSV
first indexedCVE List, EUVD, GitHub Advisories, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2026-82397 is a high vulnerability (CVSS 7.5) in Tornadoweb Tornado, published August 31, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.35%, the 28th percentile. Fixed in tornado 6.5.8.

References

Show 80 moreShow less
This page doesn't list everything

Left out here: 33 versions and the rest of 1 source description. The JSON record has them.

MoveEnter Open