CVE-2026-23906: Verified Repro With Script Download
CVE-2026-23906: Apache Druid basic security LDAP authenticator can be bypassed when the LDAP server allows anonymous binds, permitting login with any existing username and an empty password.
CVE-2026-23906 is verified against org.apache.druid.extensions:druid-basic-security · Maven. Affected versions: 0.17.0 through 35.x (<36.0.0). Fixed in 36.0.0. This critical reproduction includes runnable sandbox proof, artifacts, and a plain-text agent view under REPRO-2026-00087.
What Is CVE-2026-23906?
CVE-2026-23906 is a critical authentication bypass in Apache Druid's basic-security extension: the LDAP authenticator can be bypassed when the backing LDAP server allows anonymous binds, letting an attacker log in as any existing username with an empty password. Pruva reproduced it (reproduction REPRO-2026-00087).
CVE-2026-23906 Severity & CVSS Score
CVE-2026-23906 is rated critical severity, with a CVSS base score of 9.8 out of 10.
Critical — the most severe class — typically remotely exploitable with severe impact. Treat as an emergency.
Affected org.apache.druid.extensions:druid-basic-security Versions
org.apache.druid.extensions:druid-basic-security · Maven versions 0.17.0 through 35.x (<36.0.0) are affected.
How to Reproduce CVE-2026-23906
pruva-verify REPRO-2026-00087 curl -O https://pruva.dev/api/v1/reproductions/REPRO-2026-00087/artifacts/reproduction_steps.sh && chmod +x reproduction_steps.sh && ./reproduction_steps.sh Proof of Reproduction for CVE-2026-23906
Reproduced by Pruva's autonomous agents — 340 tool calls over 49 min. Full root-cause analysis and the complete transcript are below.
How the agent worked
Root Cause and Exploit Chain for CVE-2026-23906
Summary
Apache Druid’s druid-basic-security LDAP authenticator accepts a successful LDAP bind as proof of authentication without verifying that a password was actually supplied. If the backing LDAP server allows simple binds with an empty password (anonymous bind with DN), any existing username can be authenticated by providing an empty password.
Impact
- Package/component affected: org.apache.druid.extensions:druid-basic-security (LDAPCredentialsValidator)
- Affected versions: >= 0.17.0, < 36.0.0 (verified on 35.0.0)
- Risk level: High – attackers can authenticate as any existing LDAP user with an empty password when the LDAP server allows anonymous bind, leading to unauthorized access to Druid APIs and data.
Root Cause
LDAPCredentialsValidator#validateCredentials looks up the user DN using the configured bind user, then calls validatePassword() which performs a simple LDAP bind with the supplied password. The code treats any successful bind as valid credentials, but does not explicitly reject empty passwords. On LDAP servers configured to accept simple binds with an empty password (anonymous bind with DN), the bind succeeds and authentication is granted. The patched release (36.0.0) adds explicit checks to reject empty passwords before attempting LDAP bind.
Reproduction Steps
- Run
repro/reproduction_steps.sh. - The script builds Druid 35.0.0, launches an in-memory LDAP server that accepts empty-password binds, then runs a Java PoC calling LDAPCredentialsValidator with username
aliceand an empty password. - Expected evidence: the script prints
AUTH_SUCCEEDED: aliceandVulnerability reproduced: LDAP anonymous bind accepted empty password.
Evidence
- Log file:
logs/poc_output.txt - Key excerpt:
AUTH_SUCCEEDED: aliceVulnerability reproduced: LDAP anonymous bind accepted empty password
- Environment: OpenJDK 17, Maven build of Druid 35.0.0 with UnboundID in-memory LDAP server.
Recommendations / Next Steps
- Add explicit validation to reject empty passwords before attempting LDAP bind (as done in 36.0.0).
- Upgrade to Apache Druid 36.0.0 or later.
- Add regression tests to ensure empty passwords are rejected even if LDAP accepts anonymous binds.
Additional Notes
- The reproduction script is idempotent and verified to pass twice consecutively.
- The PoC uses a real LDAP server (UnboundID in-memory) configured to allow empty-password binds, matching the vulnerable behavior scenario.
CVE-2026-23906 Reproduction Transcript
The agent's step-by-step process — every tool call, every handoff, the moment the exploit fired.
Full session Replay every step — scrub the timeline or play it back.
git clone --depth 1 --branch 35.0.0 https://github.com/apache/druid.git /data/pruva/runs/71ed9bcc-5230-44e4-895f-c399267f95e2/druidCloning into '/data/pruva/runs/71ed9bcc-5230-44e4-895f-c399267f95e2/druid'...
Artifacts and Evidence for CVE-2026-23906
Scripts, logs, diffs, and output captured during the reproduction.
No artifacts available
How to Fix CVE-2026-23906
Upgrade org.apache.druid.extensions:druid-basic-security · Maven to 36.0.0 or later.
FAQ: CVE-2026-23906
How does the Druid LDAP authentication-bypass attack work?
Which Apache Druid versions are affected by CVE-2026-23906, and where is it fixed?
How severe is CVE-2026-23906?
How can I reproduce CVE-2026-23906?
References for CVE-2026-23906
Authoritative sources for CVE-2026-23906 — official vulnerability databases and the upstream advisory. Pruva's reproduction verifies the issue firsthand; these are the primary records to corroborate it.