Like someone hogging all the checkout lanes at a grocery store but never actually stealing anything
This Tenable plugin bundles two denial-of-service vulnerabilities in Apache Tomcat 9.0.0-M1 through 9.0.85, both fixed in 9.0.86. CVE-2024-24549 (CVSS 7.5) allows an unauthenticated attacker to send HTTP/2 requests with oversized headers; Tomcat fails to reset the stream until *after* processing all headers, consuming excessive CPU and memory. CVE-2024-23672 (CVSS ~6.3) lets a WebSocket client hold connections open indefinitely, exhausting server resources. Both were discovered by or reported to the Tomcat Security Team in January 2024 and publicly disclosed on March 13, 2024. Affected branches include Tomcat 8.x (<8.5.99), 9.x (<9.0.86), 10.x (<10.1.19), and 11.x (<11.0.0-M17).
The vendor (Apache) rates both as Important, and the highest NVD CVSS base score is 7.5 — placing it at the top of the MEDIUM / bottom of HIGH range. Tenable's own VPR score of 3.0 (Low) already signals that the real-world risk is lower than the CVSS face value. That's the right instinct: these are availability-only impacts with zero confidentiality or integrity consequences. An attacker can make your Tomcat instance sluggish or unresponsive, but they cannot execute code, read data, or pivot deeper into your network. For most enterprises, a Tomcat restart resolves the condition.
4 steps from start to impact.
Identify exposed Tomcat with HTTP/2 or WebSocket
h2 protocol in server.xml) or expose WebSocket endpoints. Shodan and FOFA can fingerprint Tomcat version banners, though many production deployments strip or obscure them. The attacker needs network-level access to the Tomcat HTTP port (typically 8080/8443).- Target Tomcat is version 9.0.0-M1 through 9.0.85
- HTTP/2 connector or WebSocket endpoint is reachable
- Many production Tomcats sit behind a reverse proxy (nginx, HAProxy, F5) that terminates HTTP/2 before it reaches Tomcat — the vulnerable code path is never hit
- WebSocket endpoints require the application to have implemented them — not all Tomcat deployments use WebSockets
Send oversized HTTP/2 headers (CVE-2024-24549)
maxHeaderCount or maxHeaderSize limits. Because Tomcat processes *all* headers before resetting the stream, each malicious request consumes CPU cycles and memory during parsing. Repeated requests amplify the effect. No authentication or valid session is required.- HTTP/2 is enabled on the Tomcat connector directly (not terminated upstream)
- Attacker can send multiple concurrent HTTP/2 streams
- Rate limiting or connection limits at load balancer / WAF layer will throttle inbound streams
- Tomcat's
maxConcurrentStreamssetting (default 200) bounds parallelism per connection - Cloud WAFs (Cloudflare, AWS WAF) often normalize or reject oversized headers before they reach origin
Hold WebSocket connections open (CVE-2024-23672)
- Application exposes at least one WebSocket endpoint
- No connection-count or idle-timeout enforcement upstream
- Many applications don't expose WebSocket endpoints at all
- Reverse proxies typically enforce idle timeouts (e.g., nginx
proxy_read_timeout) that close stale WebSocket connections - Thread pool exhaustion triggers Tomcat health-check failures, and orchestrators (K8s, ECS) will restart the pod automatically
currentThreadsBusy JMX metric). Alert when active threads approach maxThreads. Connection tracking at the load balancer shows abnormal long-lived connections.Temporary service degradation or outage
- Attack traffic was not filtered by upstream controls
- Load-balanced deployments with health checks will route traffic to healthy instances
- Auto-scaling groups will spin up replacement instances
- On-call teams typically restore Tomcat within minutes
The supporting signals.
| In-the-wild exploitation | No known active exploitation. Neither CVE appears in CISA KEV or in tracked ransomware/APT campaigns. No incident reports reference these CVEs as an initial access or lateral movement vector. |
|---|---|
| Proof-of-concept | PoC scripts exist in public CVE aggregator repos (e.g., yrekx/cve, 0xMarcio/pocindex) for CVE-2024-24549. These are straightforward HTTP/2 header-flooding scripts in Python. No weaponized exploit frameworks (Metasploit, Nuclei templates with significant adoption) confirmed. |
| EPSS | CVE-2024-24549: 0.2307 (97.64th percentile) — high probability of exploitation attempt, consistent with easy-to-trigger network DoS. CVE-2024-23672: 0.0231 (82.54th percentile) — moderate. |
| KEV status | Not listed in CISA KEV as of 2026-09-17. |
| CVSS vectors | CVE-2024-24549: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H = 7.5. Key: network-reachable, no auth, but impact is availability-only (C:N/I:N). CVE-2024-23672: CVSS v3 base ~6.3, also availability-only. |
| Affected versions | Tomcat 9.0.0-M1 through 9.0.85. Also affects: 8.5.0–8.5.98, 10.1.0-M1–10.1.18, 11.0.0-M1–11.0.0-M16. |
| Fixed versions | 9.0.86, 8.5.99, 10.1.19, 11.0.0-M17. Distro backports: RHEL/CentOS packages tomcat-9.0.87+, Ubuntu tomcat9 via USN-6943-1, SUSE via SUSE-SU-2024:1205-1. |
| Scanning / exposure | Tenable VPR: 3.0 (Low). Apache Tomcat is the world's most deployed Java servlet container, but the majority of production instances sit behind reverse proxies that terminate HTTP/2, significantly reducing the reachable attack surface for CVE-2024-24549. |
| Disclosure date | Reported to Apache January 2024. Public disclosure 2024-03-13. |
| Credit | CVE-2024-24549 reported externally to the Tomcat Security Team (2024-01-24). CVE-2024-23672 identified internally by the Tomcat Security Team (2024-01-17). |
noisgate verdict.
Both vulnerabilities are availability-only denial-of-service with zero confidentiality or integrity impact — the single most decisive downgrade factor. Even with CVE-2024-24549's unauthenticated network vector, the attack ceiling is a temporary, recoverable service disruption on a single Tomcat instance, with no path to code execution, data access, or lateral movement.
Why this verdict
- Impact ceiling is availability-only. Both CVEs have C:N/I:N in their CVSS vectors. No code execution, no data exfiltration, no credential theft. The worst outcome is a temporary outage on the targeted Tomcat instance, recoverable by restart.
- Tenable's own VPR confirms low real-world risk. Tenable's Vulnerability Priority Rating is 3.0 (Low), despite the CVSS 7.5 base score. VPR factors in exploit maturity and threat context — both agree this is not an urgent risk.
- Reverse proxy friction reduces reachable population. CVE-2024-24549 requires HTTP/2 to reach Tomcat directly. In most enterprise deployments, a reverse proxy (nginx, HAProxy, F5, cloud ALB) terminates HTTP/2 before it hits Tomcat, meaning the vulnerable code path is never exercised. This narrows the exposed population significantly.
- No active exploitation or KEV listing. Neither CVE is in CISA KEV. No ransomware campaigns, APT groups, or incident reports reference these vulnerabilities. The high EPSS for CVE-2024-24549 (23%) reflects ease of triggering, not observed exploitation.
- Role multiplier: Tomcat as application server. Tomcat's canonical role is a line-of-business application tier — not an identity provider, domain controller, hypervisor, or backup server. Even in high-value deployments (e.g., Tomcat hosting a payment gateway), DoS impact is bounded to service disruption, not data breach or fleet compromise. Load-balanced and auto-scaled deployments further limit blast radius. The DoS-only impact means no high-value-role floor applies — even on a critical Tomcat instance, the chain never reaches domain takeover, data exfiltration, or supply-chain pivot.
Why not higher?
A HIGH rating would require either active exploitation evidence, a path to code execution / data compromise, or a blast radius beyond a single service. None of these conditions are met. The attack is a recoverable DoS with no persistence, no lateral movement capability, and no confidentiality/integrity impact. The high EPSS score reflects exploit simplicity, not severity of outcome.
Why not lower?
A LOW or IGNORE rating would undercount the unauthenticated, network-reachable attack vector of CVE-2024-24549 and its high EPSS (97th percentile). While the impact is limited to availability, an unmitigated internet-facing Tomcat with HTTP/2 directly exposed could experience real service disruption. The breadth of affected versions (every 9.x milestone release) also argues against dismissing it entirely.
What to do — in priority order.
- Terminate HTTP/2 at the reverse proxy, not at Tomcat — Configure your load balancer or reverse proxy (nginx, HAProxy, F5, AWS ALB) to accept HTTP/2 from clients and proxy to Tomcat over HTTP/1.1. This eliminates CVE-2024-24549's attack surface entirely. Most enterprise deployments already do this. Verify within the noisgate 365-day remediation window.
- Enforce WebSocket idle timeouts upstream — Set
proxy_read_timeout(nginx) or equivalent to 300s or less for WebSocket connections. This prevents CVE-2024-23672's slow-drain resource exhaustion. The reverse proxy will close idle connections before they can accumulate. - Tune Tomcat connector limits — In
server.xml, setmaxHeaderCount="100",maxHeaderSize="8192", andmaxConcurrentStreams="100"on the HTTP/2 connector. Also setmaxConnectionsandconnectionTimeoutto bound total resource consumption. These don't fix the bug but reduce the amplification factor. - Enable health-check-based auto-restart — If running in Kubernetes, ECS, or behind a load balancer, ensure HTTP health probes will detect unresponsive Tomcat instances and trigger automatic restart/replacement. This limits DoS impact to seconds rather than minutes.
- WAF rules targeting specific payloads — these are protocol-level abuses (oversized HTTP/2 headers, long-lived WebSocket), not application-layer exploits with a signature. Generic WAF rules won't reliably distinguish attack traffic from legitimate large-header requests.
- IP-based rate limiting alone — a distributed botnet can source the DoS from thousands of IPs, bypassing per-IP rate limits. Connection-count limits are more effective than request-rate limits for these vulns.
- Disabling HTTP/2 at the Tomcat level without updating — while this mitigates CVE-2024-24549, it doesn't address CVE-2024-23672 (WebSocket), and you lose HTTP/2 performance benefits. Patching is the complete fix.
Crowdsourced verification payload.
Run this on each Tomcat host (or from a central auditor workstation with SSH access). Invoke with: bash check_tomcat_cve.sh /opt/tomcat (pass the Tomcat installation directory as the first argument). Requires read access to the Tomcat lib/ directory. No root required.
#!/usr/bin/env bash
# check_tomcat_cve.sh — Verify Apache Tomcat against CVE-2024-24549 / CVE-2024-23672
# Usage: bash check_tomcat_cve.sh /path/to/tomcat
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
set -euo pipefail
TOMCAT_HOME="${1:-}"
if [[ -z "$TOMCAT_HOME" ]]; then
echo "Usage: $0 /path/to/tomcat"
exit 2
fi
# Try catalina.jar for version info
CATALINA_JAR="$TOMCAT_HOME/lib/catalina.jar"
if [[ ! -f "$CATALINA_JAR" ]]; then
# Try alternate locations
CATALINA_JAR="$TOMCAT_HOME/server/lib/catalina.jar"
fi
if [[ ! -f "$CATALINA_JAR" ]]; then
echo "UNKNOWN — Cannot find catalina.jar in $TOMCAT_HOME"
exit 2
fi
# Extract version from MANIFEST.MF or ServerInfo.properties
VERSION=$(unzip -p "$CATALINA_JAR" org/apache/catalina/util/ServerInfo.properties 2>/dev/null \
| grep 'server.number' | cut -d'=' -f2 | tr -d '[:space:]')
if [[ -z "$VERSION" ]]; then
echo "UNKNOWN — Could not determine Tomcat version from $CATALINA_JAR"
exit 2
fi
echo "Detected Tomcat version: $VERSION"
# Parse major.minor.patch
IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION"
# Check Tomcat 9.x branch: vulnerable if < 9.0.86
if [[ "$MAJOR" -eq 9 ]]; then
if [[ "$MINOR" -eq 0 && "$PATCH" -lt 86 ]]; then
echo "VULNERABLE — Tomcat $VERSION is affected by CVE-2024-24549 and CVE-2024-23672 (fixed in 9.0.86)"
exit 1
else
echo "PATCHED — Tomcat $VERSION is >= 9.0.86"
exit 0
fi
# Check Tomcat 8.5.x branch: vulnerable if < 8.5.99
elif [[ "$MAJOR" -eq 8 && "$MINOR" -eq 5 ]]; then
if [[ "$PATCH" -lt 99 ]]; then
echo "VULNERABLE — Tomcat $VERSION is affected (fixed in 8.5.99)"
exit 1
else
echo "PATCHED — Tomcat $VERSION is >= 8.5.99"
exit 0
fi
# Check Tomcat 10.1.x branch: vulnerable if < 10.1.19
elif [[ "$MAJOR" -eq 10 && "$MINOR" -eq 1 ]]; then
if [[ "$PATCH" -lt 19 ]]; then
echo "VULNERABLE — Tomcat $VERSION is affected (fixed in 10.1.19)"
exit 1
else
echo "PATCHED — Tomcat $VERSION is >= 10.1.19"
exit 0
fi
# Check Tomcat 11.x: vulnerable if < 11.0.0-M17 (simplified: any 11.0.0 milestone)
elif [[ "$MAJOR" -eq 11 ]]; then
echo "UNKNOWN — Tomcat 11.x detected ($VERSION). Manually verify >= 11.0.0-M17."
exit 2
else
echo "UNKNOWN — Unexpected Tomcat version: $VERSION"
exit 2
fiIf you remember one thing.
Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.