← Back to Feed CACHED · 2026-09-17 09:28:29 · CACHE_KEY tenable:249235
tenable:249235 · CWE-404 · Disclosed 2025-08-13

Apache Tomcat HTTP/2 MadeYouReset Denial of Service

ASSESSED — NOISGATE
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

Like leaving a garden hose running — it floods your yard but doesn't break into your house

CVE-2025-48989 is a denial-of-service vulnerability in Apache Tomcat's HTTP/2 implementation, exploiting the "Made You Reset" attack pattern (CWE-404). An unauthenticated remote attacker can open HTTP/2 streams and trick the server into resetting them on the client's behalf, bypassing concurrency limits and causing unbounded memory allocation that ends in an OutOfMemoryError. Affected versions span 9.0.0.M1–9.0.107, 10.1.0.M1–10.1.43, and 11.0.0-M1–11.0.9. Fixed in 9.0.108, 10.1.44, and 11.0.10 respectively.

The Apache CNA rated this Important with a CVSS 3.1 base of 7.5 (HIGH). That score is technically accurate for the raw vector — unauthenticated, network-accessible, low-complexity, full availability impact. But it overstates real-world risk for enterprise deployments because (a) this is DoS-only with zero confidentiality or integrity impact, (b) it requires the target to be serving HTTP/2 directly rather than behind a reverse proxy like nginx or Apache HTTPD that terminates HTTP/2 before Tomcat sees it, and (c) Tenable's own VPR score is just 3.0 (Low), reflecting the absence of exploitation activity, weaponized PoC, and meaningful blast radius beyond temporary service disruption.

"HTTP/2 DoS in Tomcat is real but most instances sit behind reverse proxies that absorb the blow"
02 · The Attack Path

3 steps from start to impact.

STEP 01

Identify Internet-facing Tomcat with HTTP/2

The attacker scans for Tomcat instances that accept HTTP/2 connections directly (h2 or h2c). This requires the Tomcat HTTP/2 upgrade protocol to be configured in server.xml with the Http2Protocol UpgradeProtocol element, and the instance must be reachable without an intervening reverse proxy that terminates HTTP/2.
Conditions required:
  • Target Tomcat instance exposes HTTP/2 directly to the attacker's network
  • Tomcat version is in the affected range (pre-9.0.108 / 10.1.44 / 11.0.10)
Where this breaks in practice:
  • Enterprise Tomcat deployments overwhelmingly sit behind nginx, Apache HTTPD, HAProxy, or cloud load balancers that terminate HTTP/2 before it reaches Tomcat
  • HTTP/2 support in Tomcat requires explicit connector configuration — it is not enabled by default in many deployment templates
  • Shodan data shows ~100K internet-facing Tomcat instances, but a fraction expose HTTP/2 directly
Detection/coverage: Nessus plugin 249235 detects via version fingerprinting. Qualys and Rapid7 have equivalent checks.
STEP 02

Open HTTP/2 streams and trigger server-side resets

The attacker sends crafted HTTP/2 frames — such as malformed frames or flow-control errors — that trick Tomcat into resetting streams on the client's behalf. This bypasses the server's concurrent stream limit because the server counts the streams as closed, while internally continuing to allocate resources for each reset operation.
Conditions required:
  • Active HTTP/2 connection to vulnerable Tomcat instance
  • Ability to send raw HTTP/2 frames (any h2 client library suffices)
Where this breaks in practice:
  • WAFs and HTTP/2-aware load balancers may rate-limit or reject anomalous reset patterns
  • No public weaponized PoC tool exists for this specific CVE as of September 2026
Detection/coverage: Anomalous HTTP/2 RST_STREAM volume can be detected via access logs or WAF rules. Look for high reset-to-request ratios per connection.
STEP 03

Exhaust server memory → OutOfMemoryError

As the server processes unbounded concurrent streams per connection, heap memory grows until the JVM throws an OutOfMemoryError. The Tomcat process becomes unresponsive or crashes entirely, denying service to all users of that instance. Recovery requires a process restart.
Conditions required:
  • Sustained stream of malicious HTTP/2 frames
  • No JVM memory guardrails or connection-level rate limiting in place
Where this breaks in practice:
  • JVM -Xmx limits and garbage collection may slow the attack
  • Container orchestration (Kubernetes) will restart the pod, reducing outage duration to seconds
  • Health checks from load balancers will route traffic away from the crashed instance
Detection/coverage: JVM heap monitoring (Prometheus JMX exporter, Datadog APM) will show anomalous memory growth. Application health checks will trigger alerts on crash.
03 · Intelligence Metadata

The supporting signals.

In-the-Wild ExploitationNone observed. Not listed in CISA KEV. No reports of active campaigns as of September 2026.
Proof-of-ConceptNo public weaponized PoC. Feedly reports 1 GitHub reference but no working exploit code. The related CVE-2023-44487 (Rapid Reset) has mature tooling, but this variant's stream-accounting trick requires a different approach.
EPSS Score3.5% (89th percentile) per GitHub Advisory; Feedly reports 0.18%. Low-to-moderate exploitation probability within 30 days.
KEV StatusNot listed in CISA Known Exploited Vulnerabilities catalog.
CVSS VectorCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H — 7.5 HIGH. Note: zero confidentiality and integrity impact; this is pure availability.
Affected VersionsTomcat 9.0.0.M1–9.0.107, 10.1.0.M1–10.1.43, 11.0.0-M1–11.0.9
Fixed Versions9.0.108, 10.1.44, 11.0.10. Distro backports: check RHEL, Ubuntu, SUSE, Oracle Linux advisories.
Scanning / ExposureShodan indexes ~100K internet-facing Tomcat instances globally. Fraction exposing HTTP/2 directly (without reverse proxy) is substantially smaller. Tenable VPR score of 3.0 (Low) reflects minimal real-world risk signal.
Disclosure TimelineReported to ASF: 2025-05-29. Public disclosure: 2025-08-13. Patch available same day.
Researcher / OriginReported to the Apache Software Foundation security team. Related to the broader MadeYouReset HTTP/2 class (see also CVE-2025-8671, CVE-2025-55163, CVE-2025-54500).
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to MEDIUM (5.5/10)

The single most decisive factor is that this is an availability-only impact (DoS) with no path to code execution, data exfiltration, or privilege escalation — the blast radius ceiling is temporary service disruption of one Tomcat instance. The HTTP/2 direct-exposure prerequisite further narrows the reachable population to a fraction of the installed base, as most enterprise Tomcat deployments terminate HTTP/2 at a reverse proxy layer.

HIGH Vulnerability mechanics and affected version range
HIGH Absence of in-the-wild exploitation and KEV listing
MEDIUM Fraction of Tomcat instances directly exposing HTTP/2 (estimated, not measured)

Why this verdict

  • DoS-only impact ceiling: CVSS vector shows C:N/I:N/A:H — this vulnerability cannot lead to code execution, lateral movement, credential theft, or data breach under any deployment topology. The worst outcome is a temporary service outage requiring a process restart.
  • HTTP/2 direct-exposure friction: Tomcat must be configured with the Http2Protocol UpgradeProtocol AND be reachable without an intervening HTTP/2-terminating reverse proxy. In enterprise environments, nginx, Apache HTTPD, HAProxy, AWS ALB, or cloud load balancers typically sit in front of Tomcat, absorbing this attack class before it reaches the application server.
  • No exploitation evidence: Zero KEV listing, no known campaigns, no weaponized PoC, and EPSS in the low single digits. Tenable's own VPR of 3.0 (Low) confirms minimal threat signal.
  • Role multiplier: Tomcat is an application-tier component. In *typical* deployments (line-of-business web apps), DoS of one instance causes localized service disruption — usually mitigated by horizontal scaling and orchestration restarts. In *high-value* roles (e.g., Tomcat fronting a critical API gateway or identity broker), the DoS impact is more significant but still bounded to availability — no domain takeover, no fleet compromise, no supply-chain pivot. The blast radius is host-level availability at worst, not identity-scale or fleet-scale. This does not trigger the HIGH floor because even the high-value role outcome is temporary availability loss, not the catastrophic outcomes listed in the floor criteria.
  • Container/orchestration resilience: Modern Kubernetes or Docker deployments auto-restart crashed pods within seconds, further compressing the real-world outage window.

Why not higher?

Upgrading to HIGH would require either a path to code execution / data compromise, active exploitation in the wild, or a scenario where DoS of a single Tomcat instance causes cascading fleet-wide failure. None of these conditions are met. The vulnerability is DoS-only with no confidentiality or integrity impact, has no KEV listing, no PoC, and the HTTP/2 prerequisite significantly narrows the exposed population.

Why not lower?

Dropping to LOW would understate the fact that the attack is unauthenticated, network-accessible, and low-complexity for the subset of Tomcat instances that do expose HTTP/2 directly. The CVSS vector is objectively clean from an attacker's perspective (no auth, no user interaction), and Apache Tomcat is one of the most widely deployed application servers in the world. Even a DoS-only bug in such a ubiquitous component warrants scheduled remediation.

05 · Compensating Control

What to do — in priority order.

  1. Terminate HTTP/2 at your reverse proxy, not at Tomcat — Configure nginx, Apache HTTPD, HAProxy, or your cloud load balancer to handle HTTP/2 and proxy to Tomcat over HTTP/1.1. This completely eliminates the attack surface. Most enterprises already do this — verify it. No mitigation SLA applies at MEDIUM severity; go straight to the 365-day remediation window for the actual patch.
  2. Rate-limit HTTP/2 RST_STREAM frames at the edge — If Tomcat must serve HTTP/2 directly, configure your WAF or load balancer to cap RST_STREAM frames per connection per second. Cloudflare, AWS WAF, and F5 all support HTTP/2 frame-level rate limiting.
  3. Set JVM heap limits and enable GC logging — Ensure -Xmx is set to a reasonable ceiling and enable GC logging to detect abnormal allocation pressure before OOM. This limits blast radius but does not prevent the DoS.
  4. Deploy health-check-driven failover — Ensure load balancers have active health checks with short intervals (5-10s) so traffic is rerouted away from a crashed Tomcat instance within seconds. Kubernetes liveness probes serve the same function.
What doesn't work
  • IP-based rate limiting alone — the attack can be effective from a single connection with a single IP, making simple IP throttling insufficient. You need HTTP/2 frame-level inspection.
  • Increasing JVM heap — a larger heap just delays the OOM; the attacker can sustain the stream flood indefinitely. It does not fix the root cause.
  • Disabling HTTP/2 entirely in Tomcat — while this eliminates the attack surface, it may break applications that depend on HTTP/2 features like server push or multiplexing. Prefer terminating HTTP/2 at the reverse proxy instead.
06 · Verification

Crowdsourced verification payload.

Run this script on each Tomcat host (or from a central auditor with SSH access) to check the installed Tomcat version against the fix. Requires read access to the Tomcat installation directory. Example: bash check_cve_2025_48989.sh /opt/tomcat

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/bin/bash
# check_cve_2025_48989.sh — Detect CVE-2025-48989 (HTTP/2 MadeYouReset DoS)
# Usage: bash check_cve_2025_48989.sh /path/to/tomcat
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN

set -euo pipefail

CATALINA_HOME="${1:-/opt/tomcat}"
VERSION_FILE="$CATALINA_HOME/lib/catalina.jar"

if [ ! -f "$VERSION_FILE" ]; then
  echo "UNKNOWN — catalina.jar not found at $CATALINA_HOME/lib/catalina.jar"
  exit 2
fi

# Extract version from catalina.jar MANIFEST
VERSION=$(unzip -p "$VERSION_FILE" META-INF/MANIFEST.MF 2>/dev/null | grep 'Implementation-Version' | awk '{print $2}' | tr -d '\r')

if [ -z "$VERSION" ]; then
  # Try alternative: version.sh
  if [ -x "$CATALINA_HOME/bin/version.sh" ]; then
    VERSION=$("$CATALINA_HOME/bin/version.sh" 2>/dev/null | grep 'Server number' | awk -F: '{print $2}' | tr -d ' ')
  fi
fi

if [ -z "$VERSION" ]; then
  echo "UNKNOWN — could not determine Tomcat version"
  exit 2
fi

echo "Detected Tomcat version: $VERSION"

# Parse major.minor.patch
MAJOR=$(echo "$VERSION" | cut -d. -f1)
MINOR=$(echo "$VERSION" | cut -d. -f2)
PATCH=$(echo "$VERSION" | cut -d. -f3)

# Determine if vulnerable
case "$MAJOR" in
  9)
    if [ "$MINOR" -eq 0 ] && [ "$PATCH" -lt 108 ]; then
      echo "VULNERABLE — Tomcat $VERSION is affected by CVE-2025-48989 (fixed in 9.0.108)"
      exit 1
    else
      echo "PATCHED — Tomcat $VERSION is not affected"
      exit 0
    fi
    ;;
  10)
    if [ "$MINOR" -eq 1 ] && [ "$PATCH" -lt 44 ]; then
      echo "VULNERABLE — Tomcat $VERSION is affected by CVE-2025-48989 (fixed in 10.1.44)"
      exit 1
    else
      echo "PATCHED — Tomcat $VERSION is not affected"
      exit 0
    fi
    ;;
  11)
    if [ "$MINOR" -eq 0 ] && [ "$PATCH" -lt 10 ]; then
      echo "VULNERABLE — Tomcat $VERSION is affected by CVE-2025-48989 (fixed in 11.0.10)"
      exit 1
    else
      echo "PATCHED — Tomcat $VERSION is not affected"
      exit 0
    fi
    ;;
  *)
    echo "UNKNOWN — Tomcat major version $MAJOR is outside the affected range for this CVE"
    exit 2
    ;;
esac
07 · Bottom Line

If you remember one thing.

TL;DR
This is a DoS-only vulnerability with no path to code execution or data compromise, no active exploitation, and no public PoC. Most enterprise Tomcat instances already terminate HTTP/2 at a reverse proxy, making them unexposed. Monday morning action: First, verify that your Tomcat fleet is behind reverse proxies that terminate HTTP/2 — if so, you have near-zero exposure and can schedule the patch at your convenience. For any Tomcat instances directly serving HTTP/2, add frame-level rate limiting at your edge immediately. At MEDIUM severity, there is no noisgate mitigation SLA — go straight to the noisgate remediation SLA of 365 days to upgrade to Tomcat 9.0.108, 10.1.44, or 11.0.10. Fold this into your next quarterly Tomcat upgrade cycle rather than treating it as an emergency. If your org is already planning a Tomcat refresh, bundle this fix in.

Sources

  1. Tenable Plugin 249235
  2. Apache Tomcat 9 Security Advisories
  3. GitHub Advisory GHSA-gqp3-2cvr-x8m3
  4. Feedly CVE-2025-48989 Intelligence
  5. The Register — MadeYouReset HTTP/2 Flaw
  6. Tempesta Tech — Made You Reset Analysis
  7. Wind River — MadeYouReset Advisory
  8. NVD — CVE-2025-48989
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.