GHSA-8423-8fgw-73vq: Pip/tornado vulnerability

Published Sep 1, 2026
·
Updated

Description

Summary

parsemultipartformdata (httputil.py:34) calls data.split(b"--"+boundary+b"\r\n") before the maxparts 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

python parts = data[:finalboundaryindex].split(b"--" + boundary + b"\r\n") # :34 huge list first if len(parts) > config.maxparts: # :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.

Affected Software

1 affected componentFixes available
pip/tornado<=6.5.7
6.5.8

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade pip/tornado to a version that resolves this vulnerability.

    Fixed in 6.5.8

Event History

Sep 1, 2026
Advisory Published
via GitHub·08:17 PM
Data Sourced
via GitHub·08:17 PM
DescriptionWeaknessAffected Software

Frequently Asked Questions

1

What does an attacker need to exploit this issue?

An attacker only needs to send a crafted multipart/form-data HTTP request containing a very large number of boundary-separated parts. The issue is pre-authentication, so no valid account or prior access is required.

2

Which deployments are exposed?

Deployments that process attacker-controlled multipart/form-data requests through the affected parser are exposed. The provided data does not identify a configuration that disables the vulnerable behavior by default.

3

What can be done if a code fix cannot be deployed immediately?

Limit or reject multipart/form-data requests with excessive numbers of parts before they reach the parser, where possible. The underlying fix is to count boundary separators without first materializing the full list of parts.

4

How can we recognize exploitation attempts or impact?

Look for small-to-moderate multipart request bodies containing unusually many repeated multipart boundaries, such as 100,000 parts in a roughly 600 KB body. Such requests may be rejected for exceeding max_parts, but only after transient memory amplification has already occurred.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203