← Back to Feed CACHED · 2026-09-17 07:31:02 · CACHE_KEY tenable:235034
tenable:235034 · CWE-116 · Disclosed 2025-04-28

Apache Tomcat 9.0.0.M1 < 9.0.104 multiple vulnerabilities

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

Like a fire alarm triggered by someone who left a very specific brand of candle in a room most buildings don't have

This Tenable plugin (235034) bundles two CVEs fixed in Apache Tomcat 9.0.104. CVE-2025-31651 is a RewriteValve bypass (CWE-116) affecting versions 9.0.0.M1 through 9.0.102 — but it only works when the RewriteValve is configured with a *subset of unlikely rewrite rule configurations* that also happen to enforce security constraints. Most Tomcat deployments do not use the RewriteValve at all (preferring mod_rewrite in Apache httpd or nginx upstream). CVE-2025-31650 is an unauthenticated DoS via malformed HTTP/2 priority headers that causes a memory leak leading to OutOfMemoryException, affecting the narrower range of 9.0.76–9.0.102.

The vendor severity is wildly misaligned with reality. Tenable's plugin inherits a CVSS 3.0 base of 9.8 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) for CVE-2025-31651, implying full CIA impact — which is flatly wrong for a rewrite-rule bypass that cannot achieve code execution. Apache themselves rate CVE-2025-31651 as Low severity. Even Tenable's own VPR model disagrees with the CRITICAL label, scoring the plugin at 4.9 (Medium). The more realistic threat here is CVE-2025-31650 at CVSS 7.5, but that's availability-only and recoverable with a service restart. Labeling this bundle CRITICAL will burn credibility with your patching teams.

"Tenable CRITICAL driven by a 9.8 the vendor themselves scored Low — real risk is a recoverable DoS"
02 · The Attack Path

4 steps from start to impact.

STEP 01

Identify exposed Tomcat instance

Attacker scans for internet-facing or internal Tomcat instances. Shodan reports ~100,000+ internet-facing Tomcat servers globally. The attacker needs to confirm the target runs a vulnerable version (9.0.76–9.0.102 for CVE-2025-31650, or 9.0.0.M1–9.0.102 for CVE-2025-31651).
Conditions required:
  • Network access to Tomcat HTTP/HTTPS port
  • Target runs vulnerable Tomcat version
Where this breaks in practice:
  • Many production Tomcat instances sit behind reverse proxies (nginx, Apache httpd, F5) that may absorb or reject malformed headers
  • Version fingerprinting is often suppressed in hardened deployments
Detection/coverage: Nessus plugin 235034 detects vulnerable versions. Shodan/Censys can identify exposed instances.
STEP 02

CVE-2025-31650: Send malformed HTTP/2 priority headers

Attacker sends a high volume of HTTP/2 requests with invalid priority headers. Each malformed request triggers incomplete cleanup, leaking memory. Sustained traffic eventually causes an OutOfMemoryException and Tomcat crashes. Public Python PoC scripts exist for this attack.
Conditions required:
  • HTTP/2 enabled on the Tomcat connector (not always the case)
  • Sustained network access to send many requests
Where this breaks in practice:
  • WAF or L7 load balancer may reject malformed HTTP/2 frames before they reach Tomcat
  • Rate limiting or connection throttling reduces effectiveness
  • Impact is DoS only — no data exfiltration, no code execution, and service recovers on restart
  • JVM heap limits and monitoring may trigger alerts before full OOM
Detection/coverage: HTTP/2 flood patterns are detectable by WAF, IDS, and access log anomaly detection. JVM heap monitoring (Prometheus, Datadog) will show the leak.
STEP 03

CVE-2025-31651: Craft request to bypass RewriteValve rules

If the target uses Tomcat's RewriteValve with specific 'unlikely' rule configurations that enforce security constraints, the attacker crafts a request with special escape/meta sequences to bypass those rules. This could grant access to paths that should be restricted. The PoC from gregk4sec documents the exact request format.
Conditions required:
  • RewriteValve must be configured (non-default)
  • Rewrite rules must use a specific pattern that is vulnerable
  • Those rewrite rules must be the *primary* security enforcement mechanism (not backed by web.xml security constraints)
Where this breaks in practice:
  • Apache themselves call this configuration subset 'unlikely' — most deployments don't use RewriteValve at all
  • Even among RewriteValve users, only a subset of rule patterns are vulnerable
  • Well-architected apps enforce authorization in the application layer or web.xml, not solely via rewrite rules
  • The bypass grants path access, not code execution — the attacker still needs a vulnerability behind the protected path to escalate
Detection/coverage: Access logs will show requests to paths that should be blocked. WAF rules inspecting URL encoding anomalies may catch crafted requests.
STEP 04

Post-bypass exploitation (CVE-2025-31651 only)

If the rewrite bypass exposes an admin console, status page, or deployment endpoint, the attacker may attempt further exploitation. However, these endpoints typically require additional authentication (Tomcat Manager requires credentials). Without a chained vulnerability behind the bypassed path, impact is limited to information disclosure of the protected resource.
Conditions required:
  • A valuable resource exists behind the bypassed rewrite rule
  • That resource lacks its own authentication/authorization
Where this breaks in practice:
  • Tomcat Manager and Host Manager have their own authentication layer independent of rewrite rules
  • Modern deployments use Spring Security or container-managed auth, not rewrite rules for access control
Detection/coverage: Failed or unexpected authentication attempts to admin endpoints are logged and alertable.
03 · Intelligence Metadata

The supporting signals.

In-the-Wild ExploitationNo confirmed active exploitation. Neither CVE is listed in CISA KEV. No campaigns reported by Mandiant, CrowdStrike, or Recorded Future as of September 2026.
Proof-of-ConceptCVE-2025-31651: Documentation-based PoC by gregk4sec on GitHub — describes vulnerable rewrite configs and crafted requests, no automated exploit tool. CVE-2025-31650: Python PoC scripts exist publicly that send malformed HTTP/2 priority headers.
EPSSCVE-2025-31651: 4.18% probability of exploitation in 30 days, 90th percentile. CVE-2025-31650: Score not prominently published but expected lower given DoS-only impact.
KEV StatusNot listed in CISA Known Exploited Vulnerabilities catalog as of 2026-09-17.
CVSS VectorsCVE-2025-31651: NVD/Tenable CVSS 3.0 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 9.8 — misleading, implies full RCE. CVSS 4.0 = 8.7. Apache rates it Low. CVE-2025-31650: CVSS 3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H = 7.5 — fair for unauthenticated remote DoS.
Affected VersionsCVE-2025-31651: 9.0.0.M1 – 9.0.102 (also 10.1.0-M1 – 10.1.39, 11.0.0-M1 – 11.0.5). CVE-2025-31650: 9.0.76 – 9.0.102 (narrower range; also 10.1.10 – 10.1.39, 11.0.0-M2 – 11.0.5).
Fixed Version9.0.104 (9.0.103 was built but the release vote failed). Also 10.1.40 and 11.0.6.
Scanning / ExposureShodan indexes ~100,000+ internet-facing Tomcat instances globally. However, many production Tomcat deployments are behind reverse proxies and not directly exposed.
Disclosure DateBoth CVEs publicly disclosed 2025-04-28. CVE-2025-31650 was reported via public bug tracker on 2025-03-13 (not responsibly disclosed). CVE-2025-31651 discovered 2025-02-28.
ReporterCVE-2025-31651: gregk4sec. CVE-2025-31650: Reported via Apache Tomcat public Bugzilla.
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to MEDIUM (5.5/10)

The single most decisive factor is that the CRITICAL-driving CVE (CVE-2025-31651, CVSS 9.8) requires a non-default, vendor-described-as-'unlikely' RewriteValve configuration and cannot achieve code execution — Apache themselves rate it Low. The remaining CVE (CVE-2025-31650) is a legitimate but recoverable unauthenticated DoS at CVSS 7.5, which alone does not justify CRITICAL or HIGH when the impact is availability-only with no data compromise.

HIGH CVE-2025-31651 severity is overstated by NVD/Tenable
HIGH CVE-2025-31650 is a real but availability-only DoS
MEDIUM Fraction of deployments using vulnerable RewriteValve configs

Why this verdict

  • CVSS 9.8 is fabricated severity. The NVD-assigned vector for CVE-2025-31651 claims C:H/I:H/A:H, implying full system compromise. In reality, the flaw bypasses rewrite rules — it cannot execute code, read arbitrary files, or crash the server. Apache's own advisory rates it Low. Tenable's VPR (4.9) quietly agrees.
  • Configuration prerequisite severely narrows exposure. CVE-2025-31651 requires (a) RewriteValve enabled (non-default), (b) a specific subset of 'unlikely' rule patterns, and (c) those rules being the sole security enforcement. Each condition compounds downward — the exploitable population is a small fraction of all Tomcat installs.
  • CVE-2025-31650 is the real threat but ceiling is availability-only. Unauthenticated remote DoS via HTTP/2 malformed headers is legitimate and has public PoC. However, impact is bounded to service interruption with recovery on restart. No confidentiality or integrity impact.
  • Role multiplier: Tomcat is a general-purpose application server. It is *not* canonically a high-value-role component (not a DC, hypervisor, IdP, CA, or network edge). Some instances host critical apps, but neither CVE enables domain takeover, fleet compromise, or supply-chain pivot. The DoS impact on a production Tomcat is real but bounded to that application tier — it does not cascade to identity or infrastructure control planes. No floor elevation triggered.
  • No exploitation pressure. Neither CVE is in CISA KEV, no campaigns reported, and the EPSS 90th percentile for CVE-2025-31651 reflects the inflated CVSS anchor rather than real-world weaponization signals.

Why not higher?

A HIGH rating would be warranted if CVE-2025-31651 worked on default configurations or could chain to code execution, or if CVE-2025-31650 caused persistent data loss rather than recoverable DoS. Neither condition holds. The rewrite bypass requires an unlikely non-default configuration that Apache themselves dismiss as Low, and the DoS is recoverable with a restart. No active exploitation or KEV listing provides upward pressure.

Why not lower?

A LOW or IGNORE rating would undercount CVE-2025-31650, which is a genuinely unauthenticated, low-complexity remote DoS with public PoC scripts targeting HTTP/2. For internet-facing Tomcat instances without upstream WAF protection, this is a real availability risk. The 7.5 CVSS for the DoS component is fair and prevents dropping below MEDIUM.

05 · Compensating Control

What to do — in priority order.

  1. Deploy WAF rules to reject malformed HTTP/2 priority headers — This directly mitigates CVE-2025-31650 by blocking the DoS vector at the edge before it reaches Tomcat. Most modern WAFs (Cloudflare, AWS WAF, F5 ASM, ModSecurity) can inspect HTTP/2 frame validity. No mitigation SLA applies at MEDIUM — go straight to the 365-day remediation window.
  2. Disable HTTP/2 on Tomcat connectors if not required — CVE-2025-31650 specifically targets HTTP/2 priority header handling. If your Tomcat instances only serve HTTP/1.1 (common when behind a reverse proxy that terminates HTTP/2), the DoS vector is eliminated entirely.
  3. Audit and remove RewriteValve usage — CVE-2025-31651 only affects deployments using Tomcat's RewriteValve. If your team uses nginx or Apache httpd for URL rewriting (the common pattern), you are not affected. If you do use RewriteValve for security enforcement, migrate those rules to web.xml security constraints or application-layer authorization.
  4. Enable JVM heap monitoring and auto-restart — For CVE-2025-31650, configure heap usage alerts (e.g., at 80% of -Xmx) and automated service restart via systemd or your orchestrator. This limits DoS window to minutes rather than hours.
What doesn't work
  • Network-level rate limiting alone — CVE-2025-31650 leaks memory per malformed request, so even moderate request rates can accumulate over time. Rate limiting slows the attack but doesn't prevent it if the attacker is patient.
  • Upgrading only the Tomcat native library — both CVEs are in the core Tomcat Java codebase (tomcat-catalina and tomcat-coyote), not in the native/APR connector. You must upgrade the full Tomcat distribution.
  • Application-layer firewalls inspecting only HTTP/1.1 — CVE-2025-31650 targets HTTP/2 frame handling. A WAF that only inspects HTTP/1.1 traffic will miss the malformed priority headers entirely.
06 · Verification

Crowdsourced verification payload.

Run this script on each target Tomcat host as any user with read access to the Tomcat installation directory. Example: bash check_tomcat_cve.sh /opt/tomcat or bash check_tomcat_cve.sh /usr/share/tomcat. No root required.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/bin/bash
# Check for Apache Tomcat CVE-2025-31651 / CVE-2025-31650
# Usage: bash check_tomcat_cve.sh <CATALINA_HOME>
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN

set -euo pipefail

CATALINA_HOME="${1:-}"

if [ -z "$CATALINA_HOME" ]; then
  echo "Usage: $0 <CATALINA_HOME>"
  echo "UNKNOWN - no Tomcat path provided"
  exit 2
fi

# Try to get version from version.sh or catalina.jar MANIFEST
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 ' ')
elif [ -f "$CATALINA_HOME/lib/catalina.jar" ]; then
  VERSION=$(unzip -p "$CATALINA_HOME/lib/catalina.jar" META-INF/MANIFEST.MF 2>/dev/null | grep 'Implementation-Version' | awk -F: '{print $2}' | tr -d ' \r')
else
  echo "UNKNOWN - cannot determine Tomcat version at $CATALINA_HOME"
  exit 2
fi

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

echo "Detected Tomcat version: $VERSION"

# Parse major.minor.patch
IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION"

# CVE-2025-31651: 9.0.0.M1 - 9.0.102
# CVE-2025-31650: 9.0.76 - 9.0.102
# Fixed in: 9.0.104

if [ "$MAJOR" -eq 9 ] && [ "$MINOR" -eq 0 ]; then
  if [ "$PATCH" -le 102 ]; then
    echo "VULNERABLE - Tomcat $VERSION is affected by CVE-2025-31651 and CVE-2025-31650"
    echo "  CVE-2025-31651 (Rewrite bypass): affects 9.0.0.M1 - 9.0.102"
    if [ "$PATCH" -ge 76 ]; then
      echo "  CVE-2025-31650 (HTTP/2 DoS):    affects 9.0.76 - 9.0.102"
    else
      echo "  CVE-2025-31650 (HTTP/2 DoS):    NOT affected (requires >= 9.0.76)"
    fi
    echo "  Fix: upgrade to 9.0.104 or later"
    exit 1
  else
    echo "PATCHED - Tomcat $VERSION is >= 9.0.104"
    exit 0
  fi
else
  echo "UNKNOWN - this script checks Tomcat 9.0.x only (detected $VERSION)"
  exit 2
fi
07 · Bottom Line

If you remember one thing.

TL;DR
This Tenable CRITICAL is a false alarm driven by a grotesquely inflated CVSS 9.8 that even the vendor (Apache) dismisses as Low severity. The real risk in this plugin is CVE-2025-31650, a legitimate unauthenticated HTTP/2 DoS — serious but not CRITICAL. At a noisgate-reassessed MEDIUM, there is no mitigation SLA — go straight to the 365-day noisgate remediation SLA and schedule the upgrade to 9.0.104 in your next regular patching cycle. If you have internet-facing Tomcat instances serving HTTP/2 without an upstream WAF, prioritize those for earlier patching or disable HTTP/2 on the Tomcat connector. Do not let this plugin jump the queue ahead of genuinely critical vulnerabilities — that's exactly the kind of alert fatigue that gets real threats missed.

Sources

  1. Tenable Plugin 235034
  2. Apache Tomcat 9 Security Advisories
  3. CVE-2025-31651 PoC (gregk4sec)
  4. CVE-2025-31650 GitHub Advisory
  5. CVE-2025-31651 Red Hat Advisory
  6. CVE-2025-31650 Red Hat Bugzilla
  7. CVE-2025-31651 MITRE Record
  8. CVE-2025-31650 Wiz Analysis
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.