A door that checks your ID card but forgets to check whether the card is actually yours
Apache Tomcat's JNDIRealm is the plumbing that lets a webapp defer authentication to an LDAP directory. When configured for GSSAPI authenticated bind (Kerberos-based service account binding to LDAP), the realm accepts a user as authenticated even when the supplied password is wrong — the critical *did the bind actually succeed with the user's credentials* check was missing. Any attacker who can reach the Tomcat auth endpoint and knows (or guesses) a valid username walks in as that user. Affected: 11.0.0-M1 → 11.0.4, 10.1.0-M1 → 10.1.36, 9.0.0-M1 → 9.0.100, and legacy 8.5.0 → 8.5.100 / 7.0.0 → 7.0.109. Fixed in 11.0.5, 10.1.37, 9.0.101.
Vendor called this Important / HIGH (7.3). That rating assumes the vulnerable configuration is in play. In reality, JNDIRealm with authentication="GSSAPI" on the connection user is a *minority* configuration — most Tomcat deployments either use no realm, use a simpler LDAP simple-bind, or front auth with SSO/reverse proxy. For the fraction that *is* configured this way, HIGH is fair; for the fleet at large, MEDIUM better reflects the exposure population.
4 steps from start to impact.
Locate a Tomcat instance with JNDIRealm+GSSAPI
/manager banner) and probes auth-protected paths. The vulnerable config requires <Realm className="org.apache.catalina.realm.JNDIRealm" authentication="GSSAPI" ...> in server.xml or context config, which is not the default.- Network reachability to the Tomcat HTTP(S) listener
- JNDIRealm configured with GSSAPI authenticated bind
- A protected resource that triggers realm auth (BASIC/FORM)
- Default Tomcat installs do NOT use JNDIRealm
- GSSAPI bind is an enterprise/Kerberos pattern, not the common LDAP simple-bind
- Many enterprises front Tomcat with SSO (SAML/OIDC via reverse proxy) — the JNDIRealm code path is never exercised
Enumerate a valid username
first.last@corp). No password is needed; the realm bypass fires on the username alone.- Knowledge of any valid directory username
- Non-obvious sAMAccountName schemes slow enumeration slightly
- Account lockout policies do not apply because no wrong-password attempt is being counted
Submit auth request with any password
- The realm is invoked (protected URL requested)
- Username is valid in the directory
- mTLS or reverse-proxy pre-auth in front of Tomcat blocks unauthenticated attempts
- WAFs with credential-stuffing analytics may flag odd BASIC patterns
200/successful auth for the user — indistinguishable from a legitimate login without correlating LDAP bind logs (which won't exist for the bypassed request).Escalate within the webapp
<security-role>. If the webapp is /manager or /host-manager with a privileged user, this becomes RCE via WAR deploy.- Target account has meaningful roles/permissions in the app
- Well-segmented apps limit blast radius per user
/manageris typically not exposed externally
The supporting signals.
| In-the-wild exploitation | None observed as of 2026-07-02. No public campaigns tied to CVE-2026-55957. |
|---|---|
| Public PoC | No standalone weaponized PoC in GitHub/ExploitDB at time of writing. Root cause is a missing check — trivial to reproduce with a lab LDAP + Kerberos KDC. |
| EPSS | 0.00213 (~0.2%) — bottom quartile of exploitation probability |
| KEV status | Not listed by CISA |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:L → network, no auth, no UI, partial CIA — vendor score 7.3 HIGH |
| Affected versions | Tomcat 11.0.0-M1 → 11.0.4, 10.1.0-M1 → 10.1.36, 9.0.0-M1 → 9.0.100, 8.5.0 → 8.5.100, 7.0.0 → 7.0.109 |
| Fixed versions | 11.0.5, 10.1.37, 9.0.101 — commit c32bbd37. 8.5.x and 7.0.x are EOL; upgrade path is 9.0.101+. |
| Exposure population | Shodan shows ~800K internet-facing Tomcat banners, but the vulnerable subset — those using JNDIRealm+GSSAPI — is a small single-digit percent based on typical enterprise auth patterns. |
| Disclosure | Reported 2026-06-14, public 2026-06-29 via Apache Tomcat security list |
| Reporter | Apache Tomcat security team; credit per ASF advisory |
noisgate verdict.
The decisive factor is the narrow vulnerable configuration — the flaw only fires when JNDIRealm is configured with GSSAPI authenticated bind, a minority pattern well under 10% of Tomcat deployments. Where that config *is* present the impact is real (auth bypass to any known username), but fleet-wide exposure is far below what a HIGH severity implies.
Why this verdict
- Config-gated, not code-gated: the vulnerability requires an opt-in realm configuration (
authentication="GSSAPI"on JNDIRealm). Default and most-common Tomcat deployments never touch this code path. - Username-only bypass, not full compromise: the attacker still needs a valid directory username, and the resulting privilege is capped at that user's assigned roles — CVSS shows only *partial* C/I/A, not the full-impact profile of a typical HIGH.
- Role multiplier — enterprise SSO gateway: where a Tomcat instance IS the auth broker for a downstream app on an intranet (portal, HR, finance webapp), the chain ends in impersonation of arbitrary users including admins → role floor is HIGH for that subset. But this role represents well under 10% of the installed base, so the overall verdict floor is MEDIUM, not CRITICAL.
- Role multiplier — public-facing webapps: typical (b) role. Impact is one-user-at-a-time impersonation; not fleet-scale.
- No KEV, low EPSS, no PoC in the wild: exploitation probability is quantitatively low; attacker interest lags disclosure.
- Silent to LDAP-side monitoring: the bypass avoids the LDAP bind entirely, so directory audit logs won't catch it — a real *detection* penalty that keeps this above LOW.
Why not higher?
HIGH would require the vulnerable configuration to be the norm, or the bypass to yield unbounded privilege. Neither holds: JNDIRealm+GSSAPI is a minority pattern, and the attacker inherits only the impersonated user's roles. No KEV listing, no active exploitation, and no public weaponized PoC further pull it off HIGH.
Why not lower?
LOW/IGNORE is wrong because for the shops that *do* run this config — typically enterprises with Kerberos-backed AD auth — the bypass is unauthenticated and requires only a valid username, which is trivial to obtain. The blast radius in enterprise portals (admin impersonation) is non-trivial, and LDAP-side detection is blind to the bypass.
What to do — in priority order.
- Inventory JNDIRealm+GSSAPI usage across the Tomcat fleet — Grep every
server.xml,context.xml, and per-app context config forJNDIRealmwithauthentication="GSSAPI"orconnectionURLreferencing a KDC. Hosts without this config are NOT vulnerable and should be deprioritized. Complete inventory within 7 days so the 365-day remediation window is scoped correctly. - Switch vulnerable realms to simple-bind or reverse-proxy SSO — If you can tolerate it, reconfigure JNDIRealm to use
authentication="simple"with proper credentials, or better, offload auth to a reverse-proxy SSO (nginx+OIDC, mod_auth_openidc, Kong, oauth2-proxy) that pre-authenticates before Tomcat sees the request. This kills the code path entirely. No mitigation SLA at MEDIUM — go straight to the 365-day remediation window, but do this before then if you can. - Front Tomcat with mTLS or IP allowlist while patching — For internet-exposed Tomcat, put a WAF/reverse proxy in front that requires client certs or restricts to known corporate IPs. This shrinks the attackable population to insiders while you plan the upgrade.
- Correlate Tomcat access logs against LDAP bind logs — A successful Tomcat auth event with no corresponding LDAP bind is the bypass fingerprint. Build a SIEM rule that joins Tomcat access logs (200 on protected paths with
Authorization: Basic) against your directory's bind audit — mismatches are your alert.
- Account lockout policies — the bypass never submits a wrong password to LDAP, so lockout counters never increment.
- Password rotation / MFA at the directory — the credential is never actually checked; rotating it changes nothing. MFA at the LDAP tier is bypassed by the same code path.
- WAFs with generic credential-stuffing rules — the requests look like a single valid login, not a stuffing pattern, so they won't fire.
- Network IDS signatures — there is no distinctive packet shape; the exploit is a well-formed BASIC/FORM auth request.
Crowdsourced verification payload.
Run this on each Tomcat host as a user that can read $CATALINA_HOME (usually the tomcat service account or root). Invoke as ./check-cve-2026-55957.sh /opt/tomcat — argument is the Tomcat install directory. It checks the version string AND greps for the vulnerable JNDIRealm+GSSAPI configuration; a host is only truly vulnerable if BOTH are true.
#!/usr/bin/env bash
# check-cve-2026-55957.sh — Apache Tomcat JNDIRealm GSSAPI auth bypass
# Usage: ./check-cve-2026-55957.sh /path/to/tomcat
set -u
CATALINA_HOME="${1:-/opt/tomcat}"
if [[ ! -d "$CATALINA_HOME" ]]; then
echo "UNKNOWN: $CATALINA_HOME not found"
exit 2
fi
# 1. Version detection
VER_RAW="$("$CATALINA_HOME/bin/version.sh" 2>/dev/null | grep -E 'Server number' | awk '{print $NF}')"
if [[ -z "$VER_RAW" ]]; then
VER_RAW="$(find "$CATALINA_HOME/lib" -name 'catalina.jar' -exec unzip -p {} META-INF/MANIFEST.MF \; 2>/dev/null | awk -F': ' '/Implementation-Version/ {print $2}' | tr -d '\r')"
fi
if [[ -z "$VER_RAW" ]]; then
echo "UNKNOWN: could not determine Tomcat version"
exit 2
fi
VER_VULN=0
IFS='.' read -r MAJ MIN PATCH <<< "$VER_RAW"
case "$MAJ" in
11) [[ "$MIN" -eq 0 && "$PATCH" -lt 5 ]] && VER_VULN=1 ;;
10) [[ "$MIN" -eq 1 && "$PATCH" -lt 37 ]] && VER_VULN=1 ;;
9) [[ "$MIN" -eq 0 && "$PATCH" -lt 101 ]] && VER_VULN=1 ;;
8) [[ "$MIN" -eq 5 ]] && VER_VULN=1 ;;
7) VER_VULN=1 ;;
esac
# 2. Config detection: JNDIRealm with authentication="GSSAPI"
CFG_VULN=0
MATCHES="$(grep -riIlE 'JNDIRealm' "$CATALINA_HOME/conf" "$CATALINA_HOME/webapps" 2>/dev/null || true)"
for f in $MATCHES; do
if grep -qE 'authentication[[:space:]]*=[[:space:]]*"GSSAPI"' "$f"; then
CFG_VULN=1
echo " vulnerable config in: $f"
fi
done
echo "Tomcat version: $VER_RAW (version-vulnerable=$VER_VULN)"
echo "JNDIRealm+GSSAPI configured: $CFG_VULN"
if [[ $VER_VULN -eq 1 && $CFG_VULN -eq 1 ]]; then
echo "VULNERABLE"
exit 1
elif [[ $VER_VULN -eq 1 && $CFG_VULN -eq 0 ]]; then
echo "PATCHED (version vulnerable but config not present — not exploitable)"
exit 0
else
echo "PATCHED"
exit 0
fi
If you remember one thing.
JNDIRealm authentication="GSSAPI". That intersection is your real vulnerable set — likely a small minority. Under the noisgate mitigation SLA for MEDIUM there is no mitigation deadline (go straight to the 365-day remediation window), but if you find any internet-exposed hosts in the vulnerable intersection, put a reverse-proxy SSO or mTLS gate in front within 30 days as pragmatic risk reduction. The noisgate remediation SLA gives you 365 days to upgrade to 11.0.5 / 10.1.37 / 9.0.101, but bundle this with your quarterly Tomcat patch cycle — the fix is a simple version bump with no config changes required. EOL 8.5.x and 7.0.x hosts should be migrated to 9.0.101+ regardless.Sources
- Apache Tomcat 11 security advisories
- Apache Tomcat 10 security advisories
- Apache Tomcat 9 security advisories
- Tenable Nessus plugin 323709 — Tomcat 11 vulnerability check
- CyberSecurityNews — Multiple Apache Tomcat auth bypass CVEs
- GBHackers — Tomcat vulnerabilities let attackers bypass authentication
- HeroDevs — Apache Tomcat CVE round-up April 2026
- Cryptika — Apache Tomcat auth bypass writeup
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.