Cloudanix VulnDB

CVE-2025-47287

High · 7.5

Tornado vulnerable to excessive logging caused by malformed multipart form data

CVSS

7.5

EPSS

0.7%

Published

May 16, 2025

CISA due date

—

Cloudanix analysis

Next patch cycle SSVC: Track

Attackers can send bad form-upload requests that make affected web applications waste resources writing excessive logs, potentially slowing or taking the service offline.

Exploitation
Remote Unauthenticated
Attacker needs
None
Complexity
Low
Impact
Denial Of Service
Component
Web Framework
Class
Denial of service
Remediation
Upgrade
Effort
Medium
Patch risk
Low

What it actually does

The flaw is in Tornado's multipart/form-data request parser. When the parser encounters certain malformed multipart body conditions, it emits warning log entries but continues parsing the remaining request data instead of stopping early. A remote unauthenticated client that can send HTTP requests to an endpoint accepting multipart/form-data can repeatedly submit crafted malformed multipart bodies and cause the application to generate very large volumes of synchronous log output. Because the logging path is synchronous, excessive warning generation can block request handling, consume CPU and disk I/O, fill log storage, and degrade or deny service.

Why it matters to the business

Publicly reachable Tornado applications that accept file uploads or form submissions may be disrupted by relatively simple malformed HTTP requests. The main risk is availability loss: slow or failed application responses, saturated logging infrastructure, increased observability costs, disk exhaustion, noisy alerts, and potential cascading impact on services that depend on the affected application. This issue is not known to be in CISA KEV, has low EPSS, and has no reported public exploit maturity in the provided data, but the CVSS 7.5 availability impact warrants patching for internet-facing upload or form-processing services.

How an attack unfolds

An attacker first identifies a Tornado-powered endpoint that accepts multipart/form-data, commonly an upload or form submission route. The attacker sends malformed multipart requests designed to trigger parser warning paths repeatedly. Instead of rejecting the malformed request and stopping parsing immediately, vulnerable Tornado versions continue processing additional malformed parts and log warnings for each error encountered. By repeating these requests or embedding many malformed parts in request bodies, the attacker forces the application to perform synchronous logging at high volume. This can tie up application workers or the event loop, increase CPU and disk I/O, overwhelm log pipelines, and potentially fill disks, resulting in degraded performance or denial of service. No authentication, code execution, or data access is implied by the provided vulnerability details; the impact is availability-focused.

How to fix it

Upgrade Tornado to a version that includes the upstream fix. For source builds from tornadoweb/tornado Git, ensure the code includes commit ab5f35431242f95a5ef0a2ac228e54e89ab511f0 or a later commit. If consuming Tornado through a package manager, update to the first released package version that contains this fix or a newer supported release. As compensating controls until patching is complete, restrict access to upload/form endpoints where possible, enforce request body size limits, configure reverse proxies or WAFs to rate-limit malformed multipart requests, limit per-client request rates, ensure log rotation and disk quotas are enforced, and avoid synchronous high-volume warning logging where application architecture permits.

How to confirm the fix worked

Confirm the deployed Tornado dependency or source checkout includes commit ab5f35431242f95a5ef0a2ac228e54e89ab511f0 or a later fixed release. Review software bills of materials, lockfiles, container images, and runtime package inventories for Tornado versions or Git commits. In a staging environment, send malformed multipart/form-data requests to a representative endpoint and verify that parsing fails quickly without producing excessive repeated warning logs or causing measurable latency, CPU, or disk I/O spikes. Validate that upload endpoints have request-size limits, rate limits, and log rotation configured. For internet-facing services, scan exposed routes for multipart/form-data handlers and prioritize those for upgrade verification.

Typical attack path

  1. Discover a Tornado-based web application endpoint that accepts multipart/form-data requests.
  2. Send malformed multipart/form-data bodies that trigger parser warning conditions.
  3. Include repeated malformed sections or send requests at volume to amplify warning generation.
  4. Cause the vulnerable parser to continue processing and synchronously logging errors instead of failing fast.
  5. Exhaust application, disk I/O, or logging pipeline capacity, resulting in slow responses, failed requests, or service outage.

How to detect it

Look for evidence of log-amplification behavior around endpoints that accept multipart/form-data. Useful sources include Tornado application logs, Python process logs, reverse proxy logs, web access logs, WAF logs, load balancer telemetry, container stdout/stderr, log aggregation metrics, disk utilization alerts, and APM traces. Investigate spikes in warning logs containing Tornado multipart parser messages, especially if correlated with repeated HTTP POST requests using Content-Type: multipart/form-data, malformed or missing boundary parameters, elevated 400/413/499/500 responses, increased request latency, or sudden disk/log pipeline saturation. Group events by source IP, user agent, URI path, and time window. Exploitation is more likely when a small set of clients generates disproportionate multipart parser warnings, many malformed POSTs, or repeated uploads that do not complete successfully. Because this is a denial-of-service issue, forensic evidence may be limited to logs and performance telemetry rather than persistent files or malware artifacts.

  • Invalid multipart/form-data
  • Invalid multipart/form-data: no final boundary
  • multipart/form-data missing headers
  • multipart/form-data value missing name
  • Content-Type: multipart/form-data
  • boundary=

What your security team should do

  • Prioritize patching internet-facing Tornado applications that accept file uploads or multipart form submissions.
  • Update Tornado to a release or source revision containing commit ab5f35431242f95a5ef0a2ac228e54e89ab511f0 or later.
  • Inventory applications, containers, and build artifacts for Tornado usage, including transitive Python dependencies.
  • Apply reverse proxy, load balancer, or WAF rate limits on multipart/form-data requests, especially requests with malformed boundaries or unusually high error rates.
  • Set conservative maximum request body sizes and multipart upload limits for endpoints that do not require large uploads.
  • Monitor warning-log volume, application latency, disk utilization, and log pipeline throughput for sudden spikes tied to multipart/form-data requests.
  • Ensure log rotation, retention limits, and disk space alerts are in place so log amplification cannot exhaust storage.
  • Create SIEM detections for bursts of Tornado multipart parser warnings from the same source IP, user agent, or endpoint.
  • If suspicious activity is observed, preserve web access logs, application logs, reverse proxy logs, and relevant request metadata for incident review.

The record

When Tornado's ``multipart/form-data`` parser encounters certain errors, it logs a warning but continues trying to parse the remainder of the data. This allows remote attackers to generate an extremely high volume of logs, constituting a DoS attack. This DoS is compounded by the fact that the logging subsystem is synchronous.

Affected packages

Ecosystem Package Introduced Fixed
PyPI tornado 0 6.5
AlmaLinux:10 python3-tornado 0 6.4.2-1.el10_0.1
AlmaLinux:9 python3-tornado 0 6.4.2-2.el9_6.2
Chainguard airflow 0 2.10.5-r44
Chainguard airflow-3 0 3.0.1-r1
Chainguard airflow-3-bitnami-compat 0 3.0.1-r1
Chainguard airflow-3-compat 0 3.0.1-r1
Chainguard airflow-3-iamguarded-compat 0 3.0.1-r1
Chainguard airflow-bitnami-compat 0 2.10.5-r44
Chainguard airflow-compat 0 2.10.5-r44
Chainguard airflow-core 0 2.11.0-r0
Chainguard airflow-core-compat 0 2.11.0-r0
Chainguard airflow-core-oci-entrypoint 0 2.11.0-r0
Chainguard dask-kubernetes 0 2025.4.3-r1
Chainguard grafana-oncall 0 1.16.3-r0
Chainguard grafana-oncall-compat 0 1.16.3-r0
Chainguard jupyter-base-notebook 0 7.4.2-r2
Chainguard jupyter-base-notebook-oci-entrypoint 0 0.0.0_git20251013-r0
Chainguard kubeflow-pipelines-visualization-server 0 2.5.0-r1
Chainguard tensorflow-cpu-jupyter 0 2.19.0-r2
Debian:11 python-tornado 0 No fix
Debian:12 python-tornado 0 No fix
Debian:13 python-tornado 0 6.4.2-2
Mageia:9 python-tornado 0 6.3.2-1.2.mga9
SUSE:Linux Enterprise High Performance Computing 15 SP4-ESPOS python-tornado6 0 6.3.2-150400.9.9.1
SUSE:Linux Enterprise High Performance Computing 15 SP4-LTSS python-tornado6 0 6.3.2-150400.9.9.1
SUSE:Linux Enterprise High Performance Computing 15 SP5-ESPOS python-tornado6 0 6.3.2-150400.9.9.1
SUSE:Linux Enterprise High Performance Computing 15 SP5-ESPOS salt 0 3006.0-150500.4.55.1
SUSE:Linux Enterprise High Performance Computing 15 SP5-LTSS python-tornado6 0 6.3.2-150400.9.9.1
SUSE:Linux Enterprise High Performance Computing 15 SP5-LTSS salt 0 3006.0-150500.4.55.1
SUSE:Linux Enterprise Micro 5.5 salt 0 3006.0-150500.4.55.1
SUSE:Linux Enterprise Module for Basesystem 15 SP6 salt 0 3006.0-150500.4.55.1
SUSE:Linux Enterprise Module for Python 3 15 SP6 python-tornado6 0 6.3.2-150400.9.9.1
SUSE:Linux Enterprise Module for Server Applications 15 SP6 salt 0 3006.0-150500.4.55.1
SUSE:Linux Enterprise Module for Transactional Server 15 SP6 salt 0 3006.0-150500.4.55.1
SUSE:Linux Enterprise Server 15 SP4-LTSS python-tornado6 0 6.3.2-150400.9.9.1
SUSE:Linux Enterprise Server 15 SP5-LTSS python-tornado6 0 6.3.2-150400.9.9.1
SUSE:Linux Enterprise Server 15 SP5-LTSS salt 0 3006.0-150500.4.55.1
SUSE:Linux Enterprise Server for SAP Applications 15 SP4 python-tornado6 0 6.3.2-150400.9.9.1
SUSE:Linux Enterprise Server for SAP Applications 15 SP5 python-tornado6 0 6.3.2-150400.9.9.1
SUSE:Linux Enterprise Server for SAP Applications 15 SP5 salt 0 3006.0-150500.4.55.1
SUSE:Manager Client Tools 12 python-tornado 0 4.2.1-17.10.1
Wolfi airflow 0 2.10.5-r44
Wolfi airflow-3 0 3.0.1-r1
Wolfi airflow-3-bitnami-compat 0 3.0.1-r1
Wolfi airflow-3-compat 0 3.0.1-r1
Wolfi airflow-3-iamguarded-compat 0 3.0.1-r1
Wolfi airflow-bitnami-compat 0 2.10.5-r44
Wolfi airflow-compat 0 2.10.5-r44
Wolfi dask-kubernetes 0 2025.4.3-r1
Wolfi grafana-oncall 0 1.16.3-r0
Wolfi grafana-oncall-compat 0 1.16.3-r0
Wolfi jupyter-base-notebook 0 7.4.2-r2
Wolfi jupyter-base-notebook-oci-entrypoint 0 0.0.0_git20251013-r0
Wolfi kubeflow-pipelines-visualization-server 0 2.5.0-r1
Wolfi tensorflow-cpu-jupyter 0 2.19.0-r2
openSUSE:Leap 15.6 python-tornado6 0 6.3.2-150400.9.9.1
openSUSE:Leap 15.6 salt 0 3006.0-150500.4.55.1
openSUSE:Leap 15.6 salt-test 0 3006.0-150500.4.55.1
openSUSE:Tumbleweed python-tornado6 0 6.5-1.1
openSUSE:Tumbleweed salt 0 3006.0-41.1

Related vulnerabilities