Every CVE Search/ Get API key

CVE-2026-11748

Central Dogma: LDAP injection in SearchFirstActiveDirectoryRealm enables authentication confusion and audit log evasion

6.9 MediumFix available

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

0.48%Up 0.1 points since Jun 23, 2026
90%50%10%1%

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 MediumCVSS: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 MediumCVSS: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:

  1. Authentication confusion — typing username * causes the realm to construct filter cn=*, return the first directory entry (typically a privileged account in AD ordering), and attempt bind against that DN with the attacker's password.
  2. Audit log evasion — payload bob)(uid=alice is recorded verbatim in audit logs while the realm searches with the malformed filter, breaking accountability/compliance (SOX, PCI-DSS, ISO 27001).
  3. 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's DefaultLdapRealm with userDnTemplate and is NOT affected. However, the realm exists precisely to support Active Directory environments where users log in via sAMAccountName and 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 MediumCVSS: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 MediumCVSS: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:

  1. Authentication confusion — typing username * causes the realm to construct filter cn=*, return the first directory entry (typically a privileged account in AD ordering), and attempt bind against that DN with the attacker's password.
  2. Audit log evasion — payload bob)(uid=alice is recorded verbatim in audit logs while the realm searches with the malformed filter, breaking accountability/compliance (SOX, PCI-DSS, ISO 27001).
  3. 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's DefaultLdapRealm with userDnTemplate and is NOT affected. However, the realm exists precisely to support Active Directory environments where users log in via sAMAccountName and 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 MediumCVSS: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

Affected packages
PackageAffectedFixed
com.linecorp.centraldogma:centraldogma-server-auth-shiro
Maven
before 0.84.0
0.84.0
com.linecorp.centraldogma:centraldogma-server-auth-shiro
Maven
before 0.84.0, plus listed versions
0.33.00.34.00.35.00.35.10.36.0
Show 45 moreShow less
0.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

History
RecordedChangedSources
first indexedCVE 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

This page doesn't list everything

Left out here: 75 versions and the rest of 2 source descriptions. The JSON record has them.

MoveEnter Open