Tornado: Quadratic CPU usage when parsing HTTP headers with line folding
Impact
Tornado's HTTP header parser takes quadratic time (O(n²)) when a header value is continued across many "obsolete line folding" (obs-fold) lines. An unauthenticated attacker can send a request whose header block is mostly short continuation lines. Parsing it uses a large amount of CPU on the IOLoop thread and blocks every other connection that process is serving.
Source excerpt · OSVAffected packages
Start with the recorded fix for your release branch. Check your installed version and test compatibility before upgrading. Fixing this advisory does not rule out other vulnerabilities in the release.
| Affected range | Recorded fix |
|---|---|
| Earlier releases before 6.6Ecosystem versions | 6.6 |
Version evidence: OSV · GHSA-pcg2-g6cj-q92c
View original version evidence (89 explicit versions)
Affected products
Vendor version evidence. Product records are separate from automatic dependency matching.
tornadoweb · tornado
| Version / range | Source status |
|---|---|
| < 6.6 | affected |
Original source description
Summary
Tornado's HTTP header parser takes quadratic time (O(n²)) when a header value is continued across many "obsolete line folding" (obs-fold) lines. An unauthenticated attacker can send a request whose header block is mostly short continuation lines. Parsing it uses a large amount of CPU on the IOLoop thread and blocks every other connection that process is serving.
This issue is closely related to CVE-2025-67725 (GHSA-c98p-7wgm-6p64). The fix for that advisory covered repeated headers but not line-folded continuations.
Impact
All Tornado HTTP servers are affected. Header parsing runs before any application code, so no authentication or particular handler is required.
How bad it gets depends on max_header_size:
- Default (64 KB): each malicious request blocks the event loop for tens of milliseconds. Repeated requests can degrade service.
- Raised
max_header_size: the cost grows with the square of the header size. A single 1 MB request can block the process for several seconds.
Only availability is affected. Confidentiality and integrity are not.
Patches
Fixed in Tornado 6.6 by removing support for obsolete line folding completely; header lines that begin with whitespace are now rejected.
Workarounds
- Keep
max_header_sizeat its default value or lower it. This limits the impact but doesn't remove it. - Run Tornado behind a reverse proxy that rejects or normalizes obsolete line folding before forwarding requests.
Credit
Reported by @manus-pi.
References
- Security advisory github.com/tornadoweb/tornado/security/advisories/GHSA-pcg2-g6cj-q92c
- Patch github.com/tornadoweb/tornado/pull/3765
- Patch github.com/tornadoweb/tornado/commit/1b7a1dc9f340f52de929852e8125aa12f25297c9
- Release notes github.com/tornadoweb/tornado/releases/tag/v6.6.0
- Security advisory nvd.nist.gov/vuln/detail/CVE-2026-116577
- Source reference github.com/tornadoweb/tornado