CVE-2026-11748
Central Dogma: LDAP injection in SearchFirstActiveDirectoryRealm enables authentication confusion and audit log evasion
A vulnerability has been identified in centraldogma-server-auth-shiro versions prior to 0.84.0, where the SearchFirstActiveDirectoryRealm substitutes the login username into an LDAP search filter without neutralizing LDAP filter metacharacters, allowing an unauthenticated attacker to manipulate the filter to cause authentication confusion and enumerate the directory structure.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- Low
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
6.9
A vulnerability has been identified in centraldogma-server-auth-shiro versions prior to 0.84.0, where the SearchFirstActiveDirectoryRealm substitutes the login username into an LDAP search filter without neutralizing LDAP filter metacharacters, allowing an unauthenticated attacker to manipulate the filter to cause authentication confusion and enumerate the directory structure.
- Record
CVE-2026-11748- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:N/SC:L/SI:N/SA:N - Weakness
- CWE-90
- Updated
- 2026-11-02
EUVDEUVD-2026-38208
6.9
A vulnerability has been identified in centraldogma-server-auth-shiro versions prior to 0.84.0, where the SearchFirstActiveDirectoryRealm substitutes the login username into an LDAP search filter without neutralizing LDAP filter metacharacters, allowing an unauthenticated attacker to manipulate the filter to cause authentication confusion and enumerate the directory structure.
- Record
EUVD-2026-38208- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:N/SC:L/SI:N/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-98q5-5qh2-7w75
6.9
Central Dogma: LDAP injection in SearchFirstActiveDirectoryRealm enables authentication confusion and audit log evasion
Vulnerability
SearchFirstActiveDirectoryRealm.findUserDn() substitutes the user-supplied username from the login form into an LDAP search filter template (default cn={0}) without escaping RFC 4515 filter metacharacters (*, (, ), \, NUL). Combined with SearchControls.setCountLimit(1) on the same call site, this allows three distinct attack primitives:
- Authentication confusion — typing username
*causes the realm to construct filtercn=*, return the first directory entry (typically a privileged account in AD ordering), and attempt bind against that DN with the attacker's password. - Audit log evasion — payload
bob)(uid=aliceis recorded verbatim in audit logs while the realm searches with the malformed filter, breaking accountability/compliance (SOX, PCI-DSS, ISO 27001). - Directory enumeration — wildcards and timing differences allow reconnaissance of OU structure and admin group membership.
A repo-wide search for any LDAP escape helper (escapeLdap, encodeFilter, escapeFilter, ldapEscape) returns zero hits — the defense is not just missing, it was never added.
Applicability note: This realm is opt-in. The shipped default LDAP example (
dist/src/conf/shiro.example.ldap.ini) uses Shiro'sDefaultLdapRealmwithuserDnTemplateand is NOT affected. However, the realm exists precisely to support Active Directory environments where users log in viasAMAccountNameand the realm must search for the DN first — the canonical LINE corporate AD-backed SSO scenario. Internal deployments using AD-backed login almost certainly select this realm.
Evidence
File: server-auth/shiro/src/main/java/com/linecorp/centraldogma/server/auth/shiro/realm/SearchFirstActiveDirectoryRealm.java
Lines 148–176 on branch main @ commit d64a5151:
@Nullable
protected String findUserDn(LdapContextFactory ldapContextFactory, String username)
throws NamingException {
LdapContext ctx = null;
try {
ctx = ldapContextFactory.getSystemLdapContext();
final SearchControls ctrl = new SearchControls();
ctrl.setCountLimit(1); // line 156 — returns FIRST match only
ctrl.setSearchScope(SearchControls.SUBTREE_SCOPE);
ctrl.setTimeLimit(searchTimeoutMillis);
final String filter =
searchFilter != null ? USERNAME_PLACEHOLDER.matcher(searchFilter)
.replaceAll(username) // line 162 — RAW SUBSTITUTION
: username; // line 163
final NamingEnumeration result = ctx.search(searchBase, filter, ctrl);
...
USERNAME_PLACEHOLDER = Pattern.compile("\\{0}"). Default searchFilter = "cn={0}".
Data flow from HTTP login to vulnerable substitution
| Step | Component |
|------|-----------|
| HTTP login form | POST /api/v1/login form field username |
| ShiroLoginService.usernamePassword() (lines 198–223) | applies loginNameNormalizer (Unicode lowercase only — NOT LDAP escape) |
| Subject.login(new UsernamePasswordToken(username, password)) | Shiro hand-off |
| ActiveDirectoryRealm.doGetAuthenticationInfo (Shiro core) | calls queryForAuthenticationInfo0 |
| SearchFirstActiveDirectoryRealm.findUserDn(factory, upToken.getUsername()) | username flows in verbatim |
Repository-wide escape helper grep
| Search term | Hits |
|-------------|------|
| escapeLdap | 0 |
| encodeFilter | 0 |
| escapeFilter | 0 |
| ldapEscape | 0 |
PoC
Self-contained JUnit 5 test using UnboundID InMemoryDirectoryServer (in-process, no external LDAP required). Drop into server-auth/shiro/src/test/java/com/linecorp/centraldogma/server/auth/shiro/realm/LdapInjectionPoCTest.java and add com.unboundid:unboundid-ldapsdk:7.0.0 as a test dependency.
The PoC works by subclassing the realm…
- Record
GHSA-98q5-5qh2-7w75- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:N/SC:L/SI:N/SA:N - Weakness
- CWE-90
- Updated
- 2026-11-02
NVD
6.9
A vulnerability has been identified in centraldogma-server-auth-shiro versions prior to 0.84.0, where the SearchFirstActiveDirectoryRealm substitutes the login username into an LDAP search filter without neutralizing LDAP filter metacharacters, allowing an unauthenticated attacker to manipulate the filter to cause authentication confusion and enumerate the directory structure.
- Record
CVE-2026-11748- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:N/SC:L/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - Weakness
- CWE-90
- Updated
- 2026-11-02
OSVGHSA-98q5-5qh2-7w75
6.9
Central Dogma: LDAP injection in SearchFirstActiveDirectoryRealm enables authentication confusion and audit log evasion
Vulnerability
SearchFirstActiveDirectoryRealm.findUserDn() substitutes the user-supplied username from the login form into an LDAP search filter template (default cn={0}) without escaping RFC 4515 filter metacharacters (*, (, ), \, NUL). Combined with SearchControls.setCountLimit(1) on the same call site, this allows three distinct attack primitives:
- Authentication confusion — typing username
*causes the realm to construct filtercn=*, return the first directory entry (typically a privileged account in AD ordering), and attempt bind against that DN with the attacker's password. - Audit log evasion — payload
bob)(uid=aliceis recorded verbatim in audit logs while the realm searches with the malformed filter, breaking accountability/compliance (SOX, PCI-DSS, ISO 27001). - Directory enumeration — wildcards and timing differences allow reconnaissance of OU structure and admin group membership.
A repo-wide search for any LDAP escape helper (escapeLdap, encodeFilter, escapeFilter, ldapEscape) returns zero hits — the defense is not just missing, it was never added.
Applicability note: This realm is opt-in. The shipped default LDAP example (
dist/src/conf/shiro.example.ldap.ini) uses Shiro'sDefaultLdapRealmwithuserDnTemplateand is NOT affected. However, the realm exists precisely to support Active Directory environments where users log in viasAMAccountNameand the realm must search for the DN first — the canonical LINE corporate AD-backed SSO scenario. Internal deployments using AD-backed login almost certainly select this realm.
Evidence
File: server-auth/shiro/src/main/java/com/linecorp/centraldogma/server/auth/shiro/realm/SearchFirstActiveDirectoryRealm.java
Lines 148–176 on branch main @ commit d64a5151:
@Nullable
protected String findUserDn(LdapContextFactory ldapContextFactory, String username)
throws NamingException {
LdapContext ctx = null;
try {
ctx = ldapContextFactory.getSystemLdapContext();
final SearchControls ctrl = new SearchControls();
ctrl.setCountLimit(1); // line 156 — returns FIRST match only
ctrl.setSearchScope(SearchControls.SUBTREE_SCOPE);
ctrl.setTimeLimit(searchTimeoutMillis);
final String filter =
searchFilter != null ? USERNAME_PLACEHOLDER.matcher(searchFilter)
.replaceAll(username) // line 162 — RAW SUBSTITUTION
: username; // line 163
final NamingEnumeration result = ctx.search(searchBase, filter, ctrl);
...
USERNAME_PLACEHOLDER = Pattern.compile("\\{0}"). Default searchFilter = "cn={0}".
Data flow from HTTP login to vulnerable substitution
| Step | Component |
|------|-----------|
| HTTP login form | POST /api/v1/login form field username |
| ShiroLoginService.usernamePassword() (lines 198–223) | applies loginNameNormalizer (Unicode lowercase only — NOT LDAP escape) |
| Subject.login(new UsernamePasswordToken(username, password)) | Shiro hand-off |
| ActiveDirectoryRealm.doGetAuthenticationInfo (Shiro core) | calls queryForAuthenticationInfo0 |
| SearchFirstActiveDirectoryRealm.findUserDn(factory, upToken.getUsername()) | username flows in verbatim |
Repository-wide escape helper grep
| Search term | Hits |
|-------------|------|
| escapeLdap | 0 |
| encodeFilter | 0 |
| escapeFilter | 0 |
| ldapEscape | 0 |
PoC
Self-contained JUnit 5 test using UnboundID InMemoryDirectoryServer (in-process, no external LDAP required). Drop into server-auth/shiro/src/test/java/com/linecorp/centraldogma/server/auth/shiro/realm/LdapInjectionPoCTest.java and add com.unboundid:unboundid-ldapsdk:7.0.0 as a test dependency.
The PoC works by subclassing the realm…
- Record
GHSA-98q5-5qh2-7w75- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:L/VA:N/SC:L/SI:N/SA:N - Weakness
- CWE-90
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
com.linecorp.centraldogma:centraldogma-server-auth-shiroMaven |
before 0.84.0 | 0.84.0 |
com.linecorp.centraldogma:centraldogma-server-auth-shiroMaven |
before 0.84.0, plus listed versions 0.33.00.34.00.35.00.35.10.36.0 Show 45 moreShow less0.37.00.38.00.39.00.39.10.39.20.40.00.40.10.41.00.41.10.41.20.41.30.41.40.42.00.43.00.43.10.43.20.43.30.43.40.44.00.44.10.44.100.44.110.44.120.44.130.44.140.44.20.44.30.44.40.44.50.44.60.44.70.44.80.44.90.45.00.45.10.46.00.46.10.47.00.47.10.48.00.49.00.49.10.50.00.51.00.51.1 |
0.84.0 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-11748 is a medium vulnerability (CVSS 6.9) in Line Corporation Central Dogma, published June 22, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.48%, the 41st percentile. Fixed in com.linecorp.centraldogma:centraldogma-server-auth-shiro 0.84.0.
References
Left out here: 75 versions and the rest of 2 source descriptions. The JSON record has them.