{"id":"CVE-2026-44551","aliases":["GHSA-2r4p-jpmg-48f4","PYSEC-2026-435"],"url":"https://o3.security/vulnerability/CVE-2026-44551","summary":"Open WebUI: LDAP Empty Password Authentication Bypass","details":"# LDAP Empty Password Authentication Bypass\n\n## Affected Component\n\nLDAP authentication endpoint:\n- `backend/open_webui/routers/auths.py` (lines 468-477, user bind with empty password)\n- `backend/open_webui/models/auths.py` (lines 58-60, `LdapForm` model)\n\n## Affected Versions\n\nCurrent main branch (commit `6fdd19bf1`) and likely all versions with LDAP authentication support.\n\n## Description\n\nThe LDAP authentication endpoint does not validate that the submitted password is non-empty before performing a Simple Bind against the LDAP server. Per RFC 4513 Section 5.1.2, a Simple Bind with a valid DN and an empty password constitutes an \"unauthenticated simple authentication\" — many LDAP servers (including OpenLDAP in default configuration and some Active Directory setups) return success (resultCode 0) for this operation.\n\nThe `LdapForm` Pydantic model accepts `password: str` with no minimum length constraint, so an empty string passes validation. The subsequent `Connection.bind()` call succeeds on vulnerable LDAP servers, and the application issues a full session token for the target user.\n\n```python\n# models/auths.py:58-60 — no min_length on password\nclass LdapForm(BaseModel):\n    user: str\n    password: str\n\n# auths.py:469-477 — empty password reaches LDAP bind\nconnection_user = Connection(\n    server,\n    user_dn,\n    form_data.password,    # can be \"\"\n    auto_bind='NONE',\n    authentication='SIMPLE',\n)\nif not await asyncio.to_thread(connection_user.bind):\n    raise HTTPException(400, 'Authentication failed.')\n\n# If bind succeeds (which it does with empty password on many servers),\n# execution continues and a full session token is issued\n```\n\n## CVSS 3.1 Breakdown\n\n| Metric | Value | Rationale |\n|--------|-------|-----------|\n| Attack Vector | Network (N) | Exploited remotely via the LDAP login endpoint |\n| Attack Complexity | Low (L) | Single request with an empty password field |\n| Privileges Required | None (N) | No prior authentication needed |\n| User Interaction | None (N) | No victim interaction required |\n| Scope | Unchanged (U) | Impact within the application's authentication boundary |\n| Confidentiality | High (H) | Full access to victim's account data — chats, files, API keys, settings |\n| Integrity | High (H) | Can modify victim's data, settings, send messages as victim |\n| Availability | None (N) | No direct denial of service |\n\n## Attack Scenario\n\n1. LDAP authentication is enabled on the Open WebUI instance.\n2. The underlying LDAP server accepts unauthenticated simple binds (OpenLDAP default, some AD configs).\n3. Attacker sends:\n   ```\n   POST /api/v1/auths/ldap\n   {\"user\": \"admin_username\", \"password\": \"\"}\n   ```\n4. The app DN bind succeeds normally (line 366), finds the target user via LDAP search.\n5. The user bind (line 469-477) sends a Simple Bind with the target's DN and an empty password.\n6. The LDAP server returns success for the unauthenticated bind.\n7. `authenticate_user_by_email` (line 507) issues a full session token for the target user.\n8. Attacker has complete access to the victim's account.\n\n## Impact\n\n- Complete authentication bypass — any LDAP user account can be taken over without knowing the password\n- Includes admin accounts if they authenticate via LDAP\n- No rate limiting on the LDAP endpoint (unlike the password signin endpoint)\n- Zero interaction required from the victim\n\n## Preconditions\n\n- LDAP must be enabled (`ENABLE_LDAP=True`, disabled by default)\n- The LDAP server must accept unauthenticated simple binds with empty passwords (OpenLDAP default behavior, configurable on AD)\n- Attacker must know a valid LDAP username","published":"2026-05-15T19:59:35.011Z","modified":"2026-08-12T03:51:11.160475123Z","cvss":{"score":9.1,"severity":"CRITICAL","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N"},"epss":{"score":0.01461,"percentile":0.71267,"asOf":"2026-08-14"},"cisaKev":null,"exploitsKnown":0,"affectedPackages":[{"ecosystem":"PyPI","name":"open-webui","fixedVersion":"0.9.0"}],"fix":null,"references":[{"type":"ADVISORY","url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/44xxx/CVE-2026-44551.json"},{"type":"ADVISORY","url":"https://github.com/open-webui/open-webui/security/advisories/GHSA-2r4p-jpmg-48f4"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-44551"},{"type":"PACKAGE","url":"https://github.com/open-webui/open-webui"}],"provenance":{"sources":["OSV.dev","FIRST.org (EPSS)"],"lastVerified":"2026-08-12T03:51:11.160475123Z"}}