Miggo Logo

CVE-2025-53506: Apache Tomcat Coyote vulnerable to Denial of Service via excessive HTTP/2 streams

7.5

CVSS Score
3.1

Basic Information

EPSS Score
0.11189%
Published
7/10/2025
Updated
7/11/2025
KEV Status
No
Technology
TechnologyJava

Technical Details

CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Package NameEcosystemVulnerable VersionsFirst Patched Version
org.apache.tomcat:tomcat-coyotemaven>= 11.0.0-M1, < 11.0.911.0.9
org.apache.tomcat:tomcat-coyotemaven>= 10.1.0-M1, < 10.1.4310.1.43
org.apache.tomcat:tomcat-coyotemaven>= 9.0.0.M1, < 9.0.1079.0.107

Vulnerability Intelligence
Miggo AIMiggo AI

Miggo AIRoot Cause Analysis

The vulnerability, CVE-2025-53506, allows a remote, unauthenticated attacker to cause a denial of service in Apache Tomcat. The root cause is an uncontrolled resource consumption issue in the Coyote HTTP/2 protocol implementation.

Upon establishing an HTTP/2 connection, the server sends a SETTINGS frame to the client, specifying connection-level parameters, most importantly MAX_CONCURRENT_STREAMS. The vulnerability existed because Tomcat would not enforce this limit until the client acknowledged the settings by sending a SETTINGS frame with the ACK flag. A malicious client could simply refuse to send this acknowledgement and proceed to open an arbitrary number of streams. Each stream consumes server resources (memory and threads), and by opening an excessive number, the client could exhaust these resources, leading to a Denial of Service.

The analysis of the patch commits reveals two key functions involved:

  1. org.apache.coyote.http2.Http2UpgradeHandler.Http2UpgradeHandler(...): This constructor is the entry point for handling a new HTTP/2 connection. It is responsible for configuring the initial settings. The vulnerable code called localSettings.set(...) to establish the stream limit, but this call did not enforce the limit immediately.

  2. org.apache.coyote.http2.ConnectionSettingsLocal.set(...): This method contained the flawed logic. It would place the new setting in a pending map, waiting for client acknowledgement before moving it to the current (enforced) settings map. An attacker could exploit this delay.

The fix involves adding a force parameter to the set methods. The Http2UpgradeHandler now calls set with force=true, which causes ConnectionSettingsLocal.set to apply the MAX_CONCURRENT_STREAMS limit to the current settings immediately, mitigating the DoS risk by ensuring the server enforces the limit regardless of client acknowledgement.

Vulnerable functions

org.apache.coyote.http2.Http2UpgradeHandler.Http2UpgradeHandler
java/org/apache/coyote/http2/Http2UpgradeHandler.java
The constructor for Http2UpgradeHandler is responsible for setting the initial HTTP/2 connection parameters. In the vulnerable version, it called `localSettings.set()` without forcing the application of the settings. This meant the server would not enforce the `MAX_CONCURRENT_STREAMS` limit until the client acknowledged the SETTINGS frame. A malicious client could withhold this acknowledgement and open an unlimited number of streams, leading to a denial of service.
org.apache.coyote.http2.ConnectionSettingsLocal.set
java/org/apache/coyote/http2/ConnectionSettingsLocal.java
This method applies new local settings. The vulnerability lies in the original implementation which only placed new settings into a 'pending' state until a client ACK was received. It did not update the 'current' (enforced) settings. The patch introduces a 'force' parameter which, when true, immediately applies the setting to the 'current' configuration, thus mitigating the vulnerability. The original method signature `set(Setting setting, Long value)` represents the vulnerable logic.

WAF Protection Rules

WAF Rule

Un*ontroll** R*sour** *onsumption vuln*r**ility in *p**** Tom**t i* *n *TTP/* *li*nt *i* not **knowl**** t** initi*l s*ttin*s *r*m* t**t r**u**s t** m*ximum p*rmitt** *on*urr*nt str**ms. T*is issu* *****ts *p**** Tom**t: *rom **.*.*-M* t*rou** **.*.

Reasoning

T** vuln*r**ility, *V*-****-*****, *llows * r*mot*, un*ut**nti**t** *tt**k*r to **us* * **ni*l o* s*rvi** in *p**** Tom**t. T** root **us* is *n un*ontroll** r*sour** *onsumption issu* in t** *oyot* *TTP/* proto*ol impl*m*nt*tion. Upon *st**lis*in*