← Back to Feed CACHED · 2026-08-20 07:53:15 · CACHE_KEY CVE-2026-18963
CVE-2026-18963 · CWE-640 · Disclosed 2026-08-18

A flaw was found in the reset-credentials flow of the keycloak-services component

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

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.

"Unauthenticated account takeover in a core identity provider — this is as bad as it sounds."
02 · The Attack Path

5 steps from start to impact.

STEP 01

Locate target Keycloak instance

The attacker identifies a Keycloak login page, typically at /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.
Conditions required:
  • Network access to the Keycloak host on its HTTP/HTTPS port
Where this breaks in practice:
  • Instances behind a VPN or zero-trust proxy are not directly reachable
Detection/coverage: Shodan/Censys dorks: http.title:"Sign in to" http.favicon.hash:-1539994614. GreyNoise may tag scanning activity.
STEP 02

Initiate reset-credentials flow for target user

The attacker begins the standard password reset flow by submitting a target username or email address to the /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.
Conditions required:
  • Knowledge of a valid username or email address in the target realm
Where this breaks in practice:
  • Keycloak's default error messages can confirm or deny user existence, making enumeration straightforward
Detection/coverage: Anomalous spikes in password-reset email generation; monitor kc.event.type=SEND_RESET_PASSWORD in Keycloak event logs.
STEP 03

Bypass email verification via state manipulation

Due to improper state validation in the reset-credentials authentication flow, the attacker manipulates the flow state to skip the email-verification-required step. The server fails to enforce that the verification link was actually clicked. The exact mechanism involves replaying or tampering with the session/action token state to advance the flow to the credential-setting stage.
Conditions required:
  • Ability to send crafted HTTP requests to the Keycloak endpoint
Where this breaks in practice:
  • No known friction — this is a logic bug with no complexity barrier once the technique is known
Detection/coverage: Look for reset-credentials flow completions without a corresponding VERIFY_EMAIL event. Correlate kc.event.type=UPDATE_PASSWORD events that lack a preceding email-click action.
STEP 04

Set new credentials for the victim account

With the flow advanced past verification, the attacker directly sets a new password for the target account. The legitimate user is locked out. The attacker now possesses valid credentials for the victim's account.
Conditions required:
  • Successful bypass of the email verification step
Where this breaks in practice:
  • 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
Detection/coverage: Monitor for UPDATE_PASSWORD events followed immediately by login from a new IP/geo. SIEM correlation rule on password change → login from different source.
STEP 05

Authenticate as victim and access downstream applications

The attacker logs in as the compromised user. If the victim is a realm admin, the attacker gains full administrative control over the Keycloak realm — including the ability to create new admin accounts, modify client configurations, extract secrets, and pivot to every application federated through this Keycloak instance. Even non-admin account takeover grants access to all OIDC/SAML-federated applications the user is authorized for.
Conditions required:
  • Successful credential reset
Where this breaks in practice:
  • Per-account MFA (if enforced) may block the login step, but this is not default and many deployments lack it
Detection/coverage: Impossible-travel alerts, new device/IP login alerts, session anomaly detection in downstream apps.
03 · Intelligence Metadata

The supporting signals.

In-the-Wild ExploitationNo 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-ConceptNo 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 Score0.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 StatusNot listed as of 2026-08-20. Given the severity and attack surface, KEV listing is plausible if exploitation is confirmed.
CVSS VectorCVSS: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 VersionsAll Keycloak versions prior to 26.7.2 (upstream). RHBK prior to 26.4-23 and 26.6-12. RHSSO 7 is not affected.
Fixed VersionsKeycloak 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 DataShodan 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 Date2026-08-18. Patch available same day via Keycloak 26.7.2.
ReporterJames Paremain, via Red Hat Bugzilla 2511595.
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to CRITICAL (9.1/10)

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.

HIGH Vulnerability existence and severity
HIGH Attack path feasibility (unauthenticated, logic bug, no complexity)
MEDIUM Exact exploitation technique (no public PoC yet, but advisory details are sufficient)
LOW Active in-the-wild exploitation (too early to confirm, CVE is 2 days old)

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.

05 · Compensating Control

What to do — in priority order.

  1. 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.
  2. 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.
  3. 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.
  4. Enable and alert on Keycloak event logs — Configure Keycloak to emit events for SEND_RESET_PASSWORD, UPDATE_PASSWORD, and LOGIN to your SIEM. Create a correlation rule that fires when UPDATE_PASSWORD occurs 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.
What doesn't work
  • 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.
06 · Verification

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.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/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
fi
07 · Bottom Line

If you remember one thing.

TL;DR
This is an emergency-grade vulnerability in a core identity provider with no vendor-recommended mitigation. Monday morning action plan: Immediately identify all Keycloak instances (internet-facing and internal) using your asset inventory and Shodan/Censys sweeps. Per the noisgate mitigation SLA for CRITICAL, deploy compensating controls within 3 days — at minimum, block the /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

  1. Red Hat CVE Advisory
  2. NVD Entry
  3. Keycloak 26.7.2 Release Notes
  4. Keycloak Market Share — 6sense
  5. Keycloak Market Share — Enlyft
  6. Keycloak Exposure Data — Shodan/Censys via ayinedjimi-consultants.fr
  7. Red Hat Errata for RHBK
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.