Someone left the master key under the doormat and removed the lock
CVE-2026-18963 is a logic flaw in the reset-credentials authentication flow inside the keycloak-services component — the core engine of Keycloak / Red Hat Build of Keycloak (RHBK). An unauthenticated, remote attacker can bypass the email verification step of the password recovery process entirely due to improper state validation. The attacker can force the password reset for any user — including realm admins — and directly set new credentials without the victim ever clicking a link. Affected versions include all Keycloak releases prior to 26.7.2 (upstream), RHBK prior to 26.4-23, and RHBK prior to 26.6-12. Red Hat Single Sign-On 7 is confirmed not affected.
The vendor CVSS of 9.1 CRITICAL is accurate and, if anything, conservative for environments where Keycloak is the sole identity provider. The CVSS vector (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N) correctly reflects that this requires zero authentication, zero user interaction, and delivers high confidentiality and integrity impact. The only reason it isn't a 9.8 is Scope:Unchanged and no Availability impact. For an identity provider — a component whose entire purpose is to gate access to every downstream application — an unauthenticated account takeover is a domain-class event. Red Hat themselves stated no viable mitigation exists. The vendor severity matches reality.
5 steps from start to impact.
Locate target Keycloak instance
/realms/{realm}/protocol/openid-connect/auth or the account console. Shodan indexes over 85,000 internet-exposed Keycloak instances as of mid-2026. Internal instances are also reachable from any authenticated network position.- Network access to the Keycloak host on its HTTP/HTTPS port
- Instances behind a VPN or zero-trust proxy are not directly reachable
http.title:"Sign in to" http.favicon.hash:-1539994614. GreyNoise may tag scanning activity.Initiate reset-credentials flow for target user
/realms/{realm}/login-actions/reset-credentials endpoint. This triggers the server to generate a reset token and send the verification email to the legitimate user. The attacker does not need to intercept this email.- Knowledge of a valid username or email address in the target realm
- Keycloak's default error messages can confirm or deny user existence, making enumeration straightforward
kc.event.type=SEND_RESET_PASSWORD in Keycloak event logs.Bypass email verification via state manipulation
- Ability to send crafted HTTP requests to the Keycloak endpoint
- No known friction — this is a logic bug with no complexity barrier once the technique is known
VERIFY_EMAIL event. Correlate kc.event.type=UPDATE_PASSWORD events that lack a preceding email-click action.Set new credentials for the victim account
- Successful bypass of the email verification step
- If MFA (TOTP/WebAuthn) is configured on the account, the attacker would still need to pass the second factor after login — but MFA does NOT protect the password-reset flow itself in default Keycloak configurations
UPDATE_PASSWORD events followed immediately by login from a new IP/geo. SIEM correlation rule on password change → login from different source.Authenticate as victim and access downstream applications
- Successful credential reset
- Per-account MFA (if enforced) may block the login step, but this is not default and many deployments lack it
The supporting signals.
| In-the-Wild Exploitation | No confirmed in-the-wild exploitation as of 2026-08-20. Not listed in CISA KEV. However, the bug is 2 days old and trivial to exploit once the technique is understood — expect rapid weaponization. |
|---|---|
| Proof-of-Concept | No public PoC identified yet. The vulnerability was reported by James Paremain (Bugzilla 2511595). Given the logic-bug nature (no memory corruption, no special tooling), a working exploit is straightforward to develop from the advisory description alone. |
| EPSS Score | 0.00391 (low percentile). EPSS is lagging — this CVE is only 2 days old and the model has not yet ingested exploitation signals. Do not rely on this score for prioritization. |
| KEV Status | Not listed as of 2026-08-20. Given the severity and attack surface, KEV listing is plausible if exploitation is confirmed. |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N — Network-reachable, low complexity, no privileges, no user interaction. The worst possible attacker-effort profile. |
| Affected Versions | All Keycloak versions prior to 26.7.2 (upstream). RHBK prior to 26.4-23 and 26.6-12. RHSSO 7 is not affected. |
| Fixed Versions | Keycloak 26.7.2 (upstream), RHBK 26.4-23, RHBK 26.6-12, keycloak-operator-bundle 26.4.15-1. Red Hat errata: RHSA-2026:56519, RHSA-2026:56520, RHSA-2026:56523, RHSA-2026:56524. |
| Exposure Data | Shodan indexes 85,000+ internet-facing Keycloak instances as of May 2026, with ~30% lacking forced admin authentication. This is a large, well-enumerated attack surface. |
| Disclosure Date | 2026-08-18. Patch available same day via Keycloak 26.7.2. |
| Reporter | James Paremain, via Red Hat Bugzilla 2511595. |
noisgate verdict.
Keycloak is canonically an identity provider — 100% of its installations serve the high-value IdP role, and unauthenticated account takeover of an IdP admin account ends in fleet-wide compromise of every federated application. The single most decisive factor sustaining CRITICAL is role multiplier: the affected component IS the identity provider, and the chain requires zero authentication, zero user interaction, and zero complexity.
Why this verdict
- Unauthenticated remote attack with zero complexity. The CVSS vector is AV:N/AC:L/PR:N/UI:N — the most dangerous attacker profile. No credentials, no social engineering, no race conditions. Any network-reachable Keycloak instance is exploitable.
- Role multiplier: Keycloak IS the identity provider. This is not a bug in software that *sometimes* runs on an IdP — it IS the IdP. Compromising a realm admin account grants control over every OIDC/SAML client, every user, every federated application. The blast radius is identity-scale → fleet-scale. Per the high-value-role catalog, the verdict floor is CRITICAL.
- Large internet-facing attack surface. Shodan reports 85,000+ exposed Keycloak instances globally. Even internal-only deployments are reachable from any post-initial-access position, and the attack requires only HTTP access to the login page — no admin console needed.
- No vendor-recommended mitigation exists. Red Hat explicitly states that no mitigation meets their deployment criteria. The only remediation is patching. This eliminates the compensating-control safety net that might otherwise buy time.
- EPSS is unreliable at this stage. The CVE is 2 days old. The 0.00391 score reflects data lag, not low risk. Logic bugs in authentication flows are historically weaponized within days of disclosure.
Why not higher?
The CVSS is already 9.1. The only reason it is not 9.8+ is Scope:Unchanged and no Availability impact. The reassessed score stays at 9.1 because the vendor assessment is accurate — the scope boundary is technically correct (Keycloak itself is the vulnerable component), even though real-world blast radius through federation is effectively unbounded.
Why not lower?
Every friction-based downgrade argument fails here. The attack is unauthenticated (no 'requires prior compromise' discount). The attack surface is internet-facing on 85,000+ hosts (no 'limited exposure' discount). The affected component is the identity provider itself (the role-multiplier floor is CRITICAL). No compensating control exists per the vendor. There is no version-range narrowing — all versions before the patch are affected.
What to do — in priority order.
- Deploy WAF rules blocking reset-credentials flow — If you cannot patch within 3 days per noisgate mitigation SLA, place a WAF or reverse proxy rule that returns 403 on all requests to
/realms/*/login-actions/reset-credentials*. This breaks legitimate password reset for all users but eliminates the attack surface entirely. Coordinate with your helpdesk to handle password resets manually via admin console until the patch is applied. - Enable required MFA (TOTP/WebAuthn) on all accounts, especially admins — While MFA does not protect the password-reset flow itself, it adds a second factor at login time. An attacker who resets credentials still cannot authenticate without the second factor. Deploy within 3 days. Note: this is defense-in-depth, not a complete mitigation — the password is still changed and the user is still disrupted.
- Restrict network access to Keycloak endpoints — Move Keycloak behind a VPN, zero-trust proxy, or firewall that limits inbound access to trusted networks only. Internet-exposed instances are the highest-risk targets. Deploy within 3 days.
- Enable and alert on Keycloak event logs — Configure Keycloak to emit events for
SEND_RESET_PASSWORD,UPDATE_PASSWORD, andLOGINto your SIEM. Create a correlation rule that fires whenUPDATE_PASSWORDoccurs without a corresponding email verification event, or when a password reset is followed by login from a new IP. This enables detection but not prevention.
- Rate limiting on the reset endpoint — This is a logic bypass, not a brute-force attack. The attacker needs exactly one request per account. Rate limiting does not help.
- Email domain restrictions — The attacker does not need to receive the email. The bypass skips the email verification step entirely.
- Account lockout policies — Lockout applies to failed *login* attempts, not to password reset flows. The attacker is not brute-forcing passwords; they are resetting them.
- CAPTCHA on login page — The vulnerability is in the reset-credentials flow, not the login form. CAPTCHAs on the login page do not protect the reset endpoint unless separately configured.
Crowdsourced verification payload.
Run this script on any host with curl and network access to the target Keycloak instance. Invoke as: bash check_cve_2026_18963.sh https://keycloak.example.com. No special privileges required — it only checks the Keycloak server version via the public info endpoint.
#!/usr/bin/env bash
# check_cve_2026_18963.sh — Check Keycloak version for CVE-2026-18963
# Usage: bash check_cve_2026_18963.sh <KEYCLOAK_BASE_URL>
# Exit codes: 0=VULNERABLE, 1=PATCHED, 2=UNKNOWN
set -euo pipefail
if [[ $# -lt 1 ]]; then
echo "Usage: $0 <KEYCLOAK_BASE_URL>"
echo "Example: $0 https://keycloak.example.com"
exit 2
fi
BASE_URL="${1%/}"
# Try the serverinfo endpoint (requires no auth on older versions)
# or the well-known endpoint which may leak version
VERSION=""
# Method 1: /auth/admin/serverinfo or /admin/serverinfo (may require auth)
# Method 2: Check the HTML login page for version metadata
# Method 3: Check /realms/master/.well-known/openid-configuration for version hints
# Most reliable: fetch the login page and parse the version from the page source
LOGIN_PAGE=$(curl -sk --max-time 10 "${BASE_URL}/realms/master/account/" 2>/dev/null || true)
if [[ -z "$LOGIN_PAGE" ]]; then
# Try with /auth prefix (older deployments)
LOGIN_PAGE=$(curl -sk --max-time 10 "${BASE_URL}/auth/realms/master/account/" 2>/dev/null || true)
fi
if [[ -z "$LOGIN_PAGE" ]]; then
echo "UNKNOWN — Could not reach Keycloak at ${BASE_URL}"
exit 2
fi
# Try to extract version from page or headers
VERSION=$(echo "$LOGIN_PAGE" | grep -oP '"keycloakVersion"\s*:\s*"\K[^"]+' 2>/dev/null || true)
if [[ -z "$VERSION" ]]; then
# Try server header
VERSION=$(curl -skI --max-time 10 "${BASE_URL}/realms/master/.well-known/openid-configuration" 2>/dev/null | grep -i 'x-keycloak-version' | awk '{print $2}' | tr -d '\r' || true)
fi
if [[ -z "$VERSION" ]]; then
echo "UNKNOWN — Could not determine Keycloak version at ${BASE_URL}"
echo "Manually verify: version must be >= 26.7.2 (upstream) or RHBK >= 26.4-23 / 26.6-12"
exit 2
fi
echo "Detected Keycloak version: ${VERSION}"
# Parse major.minor.patch
IFS='.' read -r MAJOR MINOR PATCH <<< "$(echo "$VERSION" | grep -oP '^[0-9]+\.[0-9]+\.[0-9]+')"
if [[ -z "$MAJOR" || -z "$MINOR" || -z "$PATCH" ]]; then
echo "UNKNOWN — Could not parse version: ${VERSION}"
exit 2
fi
# Fixed in 26.7.2 (upstream)
# Versions < 26.7.2 are vulnerable
if (( MAJOR < 26 )); then
echo "VULNERABLE — Keycloak ${VERSION} is affected by CVE-2026-18963"
echo "Upgrade to 26.7.2 or later immediately."
exit 0
elif (( MAJOR == 26 )); then
if (( MINOR < 7 )); then
echo "VULNERABLE — Keycloak ${VERSION} is affected by CVE-2026-18963"
echo "Upgrade to 26.7.2 or later immediately."
exit 0
elif (( MINOR == 7 && PATCH < 2 )); then
echo "VULNERABLE — Keycloak ${VERSION} is affected by CVE-2026-18963"
echo "Upgrade to 26.7.2 or later immediately."
exit 0
else
echo "PATCHED — Keycloak ${VERSION} includes the fix for CVE-2026-18963"
exit 1
fi
else
echo "PATCHED — Keycloak ${VERSION} includes the fix for CVE-2026-18963"
exit 1
fiIf you remember one thing.
/realms/*/login-actions/reset-credentials* path at your WAF or reverse proxy to disable self-service password reset, and enforce MFA on all realm admin accounts. Coordinate with your helpdesk for manual password resets in the interim. Per the noisgate remediation SLA for CRITICAL, apply the vendor patch (Keycloak 26.7.2, RHBK 26.4-23 or 26.6-12) within 90 days — but given the unauthenticated nature and trivial exploitability of this bug, treat the patch as a same-week emergency for any internet-facing instance. If you run RHBK, apply the errata (RHSA-2026:56519/56520/56523/56524) through your normal Red Hat channels. Do not wait for EPSS to catch up or for KEV listing — the attack surface is large, the exploit is simple, and weaponization is imminent.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.