Read the docs
TI-2023-30788 Aliases GHSA-qppv-j76h-2rpx

Tornado vulnerable to HTTP request smuggling via improper parsing of `Content-Length` fields and chunk lengths

Priority LOW 38CWE-444Published · Updated

Key facts

Attack vector
—
Privileges required
—
User interaction
—
Attack complexity
—
Impact type
—
Confidentiality · integrity · availability
—
Fix status
Fixed

No CVSS vector from any source. Fix status from GitHub.

Summary

## Summary Tornado interprets `-`, `+`, and `_` in chunk length and `Content-Length` values, which are not allowed by the HTTP RFCs. This can result in request smuggling when Tornado is deployed behind certain proxies that interpret those non-standard characters differently. This is known to apply to older versions of haproxy, although the current release is not affected. ## Details Tornado uses the `int` constructor to parse the values of `Content-Length` headers and chunk lengths in the following locations: ### `tornado/http1connection.py:445` ```python3 self._expected_content_remaining = int(headers["Content-Length"]) ``` ### `tornado/http1connection.py:621` ```python3 content_length = int(headers["Content-Length"]) # type: Optional[int] ``` ### `tornado/http1connection.py:671` ```python3 chunk_len = int(chunk_len_str.strip(), 16) ``` Because `int("0_0") == int("+0") == int("-0") == int("0")`, using the `int` constructor to parse and validate strings that should contain only ASCII digits is not a good strategy.

Why it matters now

Fix Fixed tornado (PyPI): 6.3.3

SSVC decision points

Not available: CISA has not published SSVC decision points for this record.

Affected products

VendorProductAffected versionsFixed inStatusSource
—tornado (PyPI)before 6.3.36.3.3Patch availableGHSA-qppv-j76h-2rpx
  • tornado (PyPI) Vendor— Affected before 6.3.3 Fixed in 6.3.3 Patch available GHSA-qppv-j76h-2rpx

Remediation

  • Fix · GHSA-qppv-j76h-2rpx tornado (PyPI) Fixed in 6.3.3 Advisory →

Timeline

  1. 2026-10-03 Threatist record created from GHSA-qppv-j76h-2rpx

References

Sources

This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences