A bouncer who checks your face but not your wristband color, installed at a door almost nobody uses
Tenable plugin 323714 bundles six CVEs disclosed 2026-06-23, all fixed in Apache Tomcat 9.0.119. The headliner driving the Critical/9.1 rating is CVE-2026-53434 — invalid CRL configurations silently ignored on the FFM (Foreign Function & Memory) connector, theoretically letting revoked client certificates through. The remaining five are: CVE-2026-55956 (Moderate, CVSS 6.5) — method-scoped security constraints on the default servlet are collapsed, bypassing per-HTTP-method authorization; CVE-2026-55955 (Low) — EncryptInterceptor replay in cluster mode; CVE-2026-53404 (Low) — RewriteValve ornext logic flaw; CVE-2026-55276 (Low) — effective web.xml logging omits special roles (no runtime impact); and CVE-2026-50229 (Low) — reflected XSS in the bundled examples webapp. Affected: Tomcat 9.0.0.M1 through 9.0.118 (and parallel ranges on 10.1.x, 11.0.x; 8.5.x and 7.0.x are EOL with no fix).
The Tenable plugin inherits the CVSS 9.1 from NVD's scoring of CVE-2026-53434, but Apache themselves rate every CVE in this bundle Low except one Moderate (CVE-2026-55956 at 6.5). Tenable's own VPR is 4.3 (Medium), which much better reflects reality. The 9.1 score assumes an attacker can simply walk up to a network-facing FFM connector using mutual TLS with CRL checking — but the FFM connector requires Java 22+ and the Foreign Function API, which is experimental and virtually nonexistent in production Tomcat 9 deployments. The actually-reachable risk is CVE-2026-55956: if you rely on per-method constraints on the default servlet (uncommon), an attacker bypasses them. That is a real but narrow authorization flaw, not a Critical-class vulnerability.
5 steps from start to impact.
Identify an internet-facing Tomcat 9 instance
- Target runs Apache Tomcat 9.0.0.M1–9.0.118
- Instance is network-reachable
- Many production Tomcats sit behind reverse proxies or load balancers that mask the version
- Default error pages and
Serverheaders are frequently stripped in hardened deployments
product:Tomcat queriesDetermine which CVE is exploitable on the target
- Knowledge of target's Tomcat configuration
- Access to probe configuration-dependent behavior
- FFM connector requires Java 22+ — nearly zero Tomcat 9 production deployments use this
- Examples webapp removed in all CIS/STIG-hardened installs
- Clustering with EncryptInterceptor requires attacker on the cluster network segment
- Method-based default servlet constraints are an uncommon configuration pattern
server.xml and web.xmlExploit CVE-2026-55956 — bypass method constraints on default servlet
- Target has security constraints on the default servlet with method-level restrictions
- Default servlet is actively serving static resources that are worth targeting
- Most applications use their own servlets or frameworks (Spring, Struts) rather than the Tomcat default servlet for access-controlled content
- The impact is limited to static file access or modification — no code execution
Exploit CVE-2026-53434 — bypass CRL on FFM connector (theoretical)
- Target uses FFM connector (requires Java 22+ Foreign Function API)
- Mutual TLS with CRL checking is configured
- The CRL configuration is invalid (misconfigured path, malformed file, etc.)
- Attacker possesses a revoked but otherwise valid client certificate
- FFM connector adoption in Tomcat 9 is effectively zero — it targets Java 22+ which most Tomcat 9 shops do not run
- Requires a *specific misconfiguration* (invalid CRL) combined with mTLS — multiple simultaneous conditions
- If CRL is correctly configured, the bug does not trigger
s_client verification testsPost-exploitation — limited impact
- Successful exploitation of one of the preceding steps
- No path to RCE, SYSTEM/root, or domain compromise
- Application-layer access control (Spring Security, container-managed auth) may independently block access
- Network segmentation limits lateral movement from the Tomcat tier
The supporting signals.
| In-the-wild exploitation | No evidence. None of the six CVEs are listed in CISA KEV. No campaigns, ransomware, or APT activity attributed. |
|---|---|
| Proof-of-concept | None public. No PoC repos found on GitHub for any of the six CVEs. No Nuclei templates, Metasploit modules, or ExploitDB entries. |
| EPSS scores | CVE-2026-55956: 0.19% (8th percentile). CVE-2026-53434: 0.17% (≈7th percentile). All six CVEs below 1% — exploitation probability is minimal. |
| CISA KEV status | Not listed. None of the six CVEs appear in the KEV catalog as of 2026-09-21. |
| CVSS vectors | CVE-2026-55956: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N → 6.5. CVE-2026-53434: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N → 9.1 (NVD; Apache rates Low). |
| Vendor severity | Apache Foundation rates 5 of 6 as Low, 1 as Moderate (CVE-2026-55956). Tenable VPR: 4.3 (Medium). The plugin-level CVSS 9.1 is inherited from NVD's inflated scoring of CVE-2026-53434. |
| Affected versions | Tomcat 9.0.0.M1–9.0.118 (all six CVEs). CVE-2026-53434 narrower: 9.0.83–9.0.118. CVE-2026-55955 narrower: 9.0.13–9.0.118. EOL branches 8.5.x and 7.0.x also affected, no fix. |
| Fixed versions | 9.0.119 (Tomcat 9). Also 10.1.56 (Tomcat 10.1) and 11.0.23 (Tomcat 11). Red Hat, SUSE, Amazon Linux backports pending or in progress. |
| Internet exposure | Shodan reports ~100,000 internet-facing Tomcat instances globally. FFM connector subset: effectively zero observable. Examples webapp subset: small but nonzero. |
| Disclosure date | 2026-06-23 (all six CVEs disclosed simultaneously). Fix released same day in 9.0.119. |
Why this verdict
- Inflated CVSS driver: The plugin's 9.1 Critical rating is inherited from CVE-2026-53434 (FFM CRL bypass). The FFM connector requires Java 22+ Foreign Function API — a feature with near-zero adoption in Tomcat 9 production. Apache themselves rate this CVE Low. Removing this inflated score leaves CVE-2026-55956 at 6.5 as the true ceiling.
- Narrow prerequisite chains: CVE-2026-55956 requires method-level security constraints specifically on the default servlet — an uncommon pattern. Most Java apps use framework-level auth (Spring Security) or custom servlets, not the default servlet for access-controlled content. CVE-2026-55955 requires cluster-mode EncryptInterceptor *and* attacker presence on the cluster network. CVE-2026-50229 requires the examples webapp, which CIS/STIG guidance removes.
- No exploitation signal: Zero CISA KEV entries, zero known campaigns, EPSS < 0.2% for all CVEs, no public PoC. Tenable's own VPR (4.3/Medium) already reflects this low exploitability reality.
- No code execution path: None of the six CVEs enable RCE, privilege escalation, or lateral movement. The worst realistic outcome is unauthorized read/write of static files served by the default servlet (CVE-2026-55956) or session with a revoked client cert (CVE-2026-53434, theoretical only).
- Role multiplier: Tomcat occupies the *application tier* role — line-of-business Java app server. It is not a domain controller, hypervisor, identity provider, PAM, backup system, or network edge appliance. Even in production web-facing deployments, these specific CVEs do not enable domain takeover, fleet compromise, or supply-chain pivot. The blast radius is confined to the individual application's static resources or mTLS session scope. No high-value-role floor override applies.
Why not higher?
Upgrading to HIGH would require either active exploitation evidence, a weaponized PoC, or a realistic path to fleet-scale/domain-scale impact. None exist here. The CVEs are configuration-dependent with narrow prerequisite chains, EPSS is bottom-decile, and the worst outcome is application-tier authorization bypass — not RCE or privilege escalation. The CVSS 9.1 is an artifact of NVD scoring a near-zero-adoption connector bug without accounting for real-world deployment prevalence.
Why not lower?
CVE-2026-55956 is a real authorization bypass that is network-reachable without authentication (AV:N/AC:L/PR:N). If an organization *does* rely on method-based default servlet constraints for access control — even if uncommon — the bypass is straightforward. Tomcat's massive installed base (~100K internet-facing instances) means even a small percentage of vulnerable configurations represents thousands of hosts. Dismissing this as LOW would underweight the no-auth network vector.
What to do — in priority order.
- Remove the examples webapp immediately — Delete
$CATALINA_HOME/webapps/examples/to eliminate CVE-2026-50229 (XSS). This is standard CIS Benchmark guidance and should already be done. Takes <1 minute per host, scriptable fleet-wide. No SLA pressure — this is hygiene. - Audit default servlet security constraints — Review all
web.xmlfiles for<security-constraint>elements targeting the default servlet path. If method-based restrictions exist (e.g.,<http-method>PUT</http-method>), understand that these are not enforced as written until 9.0.119. Consider moving access control to a WAF or application framework (Spring Security) as the primary enforcement point. Per the noisgate MEDIUM remediation SLA, patch to 9.0.119 within 365 days. - Verify FFM connector is not in use — Check
server.xmlfor any<Connector>using the FFM protocol handler (org.apache.coyote.http11.Http11Nio2Protocolwith FFM bindings ortomcat-coyote-ffmdependency). If FFM is not configured — which is the case for >99% of Tomcat 9 deployments — CVE-2026-53434 does not apply. Document the finding. - Validate cluster EncryptInterceptor configuration — If Tomcat clustering is enabled with
<Interceptor className="org.apache.catalina.tribes.group.interceptors.EncryptInterceptor"/>, ensure the cluster network is isolated to a dedicated VLAN or network segment. CVE-2026-55955 requires attacker presence on the cluster network to replay encrypted messages. - Upgrade to Tomcat 9.0.119+ within the remediation window — Apply the vendor patch as your remediation action. Per the noisgate MEDIUM remediation SLA, complete the upgrade within 365 days. No mitigation SLA applies — go straight to the remediation window. Prioritize instances with default servlet constraints or cluster configurations.
- WAF virtual patching for CVE-2026-55956 — The bug is in Tomcat's internal constraint matching logic, not in the HTTP request content. A WAF cannot distinguish between a legitimate PUT and one exploiting the collapsed method filter because the request is syntactically identical.
- Upgrading Java to fix CVE-2026-53434 — The bug is in Tomcat's CRL handling code, not in the JDK. Upgrading Java does not fix the FFM connector's failure to abort on invalid CRLs; only Tomcat 9.0.119 fixes it.
- TLS termination at the load balancer — While this prevents direct client certificate presentation to Tomcat, it does not address CVE-2026-55956 (default servlet bypass) or CVE-2026-53404 (RewriteValve logic), which operate at the HTTP/application layer behind any TLS terminator.
Crowdsourced verification payload.
Run this script on each Tomcat host as any user with read access to the Tomcat installation directory. Invoke with: bash check_tomcat_323714.sh /opt/tomcat (pass CATALINA_HOME as the first argument). No root required.
#!/usr/bin/env bash
# check_tomcat_323714.sh — Tenable plugin 323714 verification
# Checks Apache Tomcat 9.x version against the fix threshold (9.0.119)
# Usage: bash check_tomcat_323714.sh /path/to/catalina_home
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
set -euo pipefail
CATALINA_HOME="${1:-${CATALINA_HOME:-}}"
if [[ -z "$CATALINA_HOME" ]]; then
echo "UNKNOWN — CATALINA_HOME not provided. Usage: $0 /path/to/tomcat"
exit 2
fi
# Try version.sh first
if [[ -x "$CATALINA_HOME/bin/version.sh" ]]; then
VERSION_OUTPUT=$("$CATALINA_HOME/bin/version.sh" 2>/dev/null || true)
VERSION=$(echo "$VERSION_OUTPUT" | grep -oP 'Server number:\s*\K[0-9]+\.[0-9]+\.[0-9]+' | head -1)
fi
# Fallback: read from catalina.jar MANIFEST
if [[ -z "${VERSION:-}" && -f "$CATALINA_HOME/lib/catalina.jar" ]]; then
VERSION=$(unzip -p "$CATALINA_HOME/lib/catalina.jar" META-INF/MANIFEST.MF 2>/dev/null \
| grep -oP 'Implementation-Version:\s*\K[0-9]+\.[0-9]+\.[0-9]+' | head -1)
fi
if [[ -z "${VERSION:-}" ]]; then
echo "UNKNOWN — Could not determine Tomcat version from $CATALINA_HOME"
exit 2
fi
echo "Detected Tomcat version: $VERSION"
# Parse major.minor.patch
IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION"
# Only applies to Tomcat 9.x
if [[ "$MAJOR" -ne 9 ]]; then
echo "UNKNOWN — This check targets Tomcat 9.x only (found $MAJOR.x)"
exit 2
fi
# Fixed in 9.0.119
if [[ "$MINOR" -eq 0 && "$PATCH" -ge 119 ]]; then
echo "PATCHED — Tomcat $VERSION >= 9.0.119 (plugin 323714 does not apply)"
exit 0
elif [[ "$MINOR" -gt 0 ]]; then
echo "PATCHED — Tomcat $VERSION > 9.0.x (plugin 323714 does not apply)"
exit 0
else
echo "VULNERABLE — Tomcat $VERSION < 9.0.119 (affected by plugin 323714)"
# Additional context checks
if [[ -d "$CATALINA_HOME/webapps/examples" ]]; then
echo " WARNING: examples webapp present (CVE-2026-50229 XSS risk)"
fi
if grep -qr 'EncryptInterceptor' "$CATALINA_HOME/conf/" 2>/dev/null; then
echo " WARNING: EncryptInterceptor configured (CVE-2026-55955 replay risk)"
fi
if grep -qr 'tomcat-coyote-ffm\|org.apache.tomcat.util.net.openssl.panama' "$CATALINA_HOME/conf/" "$CATALINA_HOME/lib/" 2>/dev/null; then
echo " WARNING: FFM connector artifacts detected (CVE-2026-53434 CRL risk)"
fi
exit 1
fiWhat defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.