{"id":"CVE-2026-59218","aliases":["GHSA-7rw5-9f7q-xj36","PYSEC-2026-3594"],"url":"https://o3.security/vulnerability/CVE-2026-59218","summary":"Open WebUI: Account enumeration via observable login timing discrepancy","details":"### Summary\n\nThe `/api/v1/auths/signin` endpoint leaked whether an email address belonged to a registered account through a response-time side channel. Password verification ran bcrypt only when the email was found in the database; for a non-existent email the request returned early without hashing. The expensive bcrypt comparison therefore made valid-account attempts respond significantly slower (~180 ms) than non-existent ones (~5 ms), so an unauthenticated attacker could enumerate valid accounts by measuring response time.\n\n### Details\n\nOn signin the backend looked the user up by email and only performed the bcrypt password comparison if a record existed. A missing email short-circuited before any hashing, producing the timing gap. The built-in brute-force throttling did not prevent it: sending one request at a time with a small delay between requests stays under the rate limit while still exposing the difference.\n\nObserved in the reporter's run (HTTP 400 for every attempt, the response time is the signal):\n\n```\nEmail                Status   Response time\njoe@example.com      400      186 ms   <- valid account\nlarry@example.com    400        9 ms\njose@example.com     400        6 ms\njames@example.com    400        5 ms\n```\n\n### Impact\n\nAn unauthenticated attacker can enumerate which email addresses are registered accounts, which enables targeted password-spraying against confirmed accounts. The impact is amplified by MFA not being enabled by default. No data is read or modified; the disclosure is limited to account existence.\n\n### Patched\n\nThe authentication path now runs a bcrypt verification against a constant placeholder hash whenever the email does not resolve to an active credential, so a real hash comparison executes on every attempt and the response time is the same whether or not the account exists. Fixed in 0.10.0.\n\n### Credits\n\n@dievus","published":"2026-07-09T15:53:54.653Z","modified":"2026-10-21T02:30:34.481754648Z","cvss":{"score":5.3,"severity":"MEDIUM","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N"},"epss":{"score":0.00413,"percentile":0.34821,"asOf":"2026-09-15"},"cisaKev":null,"exploitsKnown":0,"affectedPackages":[{"ecosystem":"PyPI","name":"open-webui","fixedVersion":"0.10.0"}],"fix":{"url":"https://github.com/open-webui/open-webui/commit/993e74912199c66c522f08ec81abe31d76985e39","label":"open-webui/open-webui@993e749"},"references":[{"type":"WEB","url":"https://github.com/open-webui/open-webui/releases/tag/v0.10.0"},{"type":"ADVISORY","url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/59xxx/CVE-2026-59218.json"},{"type":"ADVISORY","url":"https://github.com/open-webui/open-webui/security/advisories/GHSA-7rw5-9f7q-xj36"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-59218"},{"type":"FIX","url":"https://github.com/open-webui/open-webui/commit/993e74912199c66c522f08ec81abe31d76985e39"},{"type":"FIX","url":"https://github.com/open-webui/open-webui/pull/26385"},{"type":"PACKAGE","url":"https://github.com/open-webui/open-webui"}],"provenance":{"sources":["OSV.dev","FIRST.org (EPSS)"],"lastVerified":"2026-10-21T02:30:34.481754648Z"}}