{"id":"GHSA-8fxq-53rx-ph5f","revision":"bcbd903638714c699af2307252f9bbc4","records":[{"revision":"bcbd903638714c699af2307252f9bbc4","observedAt":"2026-10-24T13:19:41.952+00:00","statement":{"source":"osv","id":"GHSA-8fxq-53rx-ph5f","aliases":["CVE-2026-111933","GO-2026-6265"],"title":"Coder: Login endpoint user enumeration via timing-defense placeholder in password comparison","description":"### Summary\n\n`userpassword.Compare()` substituted a placeholder hash derived from the well-known string `\"hunter2\"` when the stored hash was empty. Submitting `\"hunter2\"` therefore matched accounts with no password hash (nonexistent users and SSO-only users) and a subsequent login-type check returned an HTTP 403 that disclosed the account's login type, versus 401 for password users.\n\n> **Note:** Practical exploitation is limited because the timing side channel is noisy and only reveals whether an account exists.\n\n### Impact\n\nAn unauthenticated attacker could enumerate valid accounts and their authentication provider by submitting logins with the password `\"hunter2\"`, distinguishing nonexistent users, SSO users (provider revealed) and password users from the response. This aids credential-stuffing and targeted phishing. No authentication bypass or data access resulted.\n\n### Patches\n\nThe fix derives the timing-defense placeholder from a secure random value that no supplied password can match.\n\nThe fix was backported to all supported release lines:\n\n| Release line | Patched version |\n|---|---|\n| 2.34 | [v2.34.2](https://github.com/coder/coder/releases/tag/v2.34.2) |\n| 2.33 | [v2.33.8](https://github.com/coder/coder/releases/tag/v2.33.8) |\n| 2.32 | [v2.32.7](https://github.com/coder/coder/releases/tag/v2.32.7) |\n| 2.29 (ESR) | [v2.29.17](https://github.com/coder/coder/releases/tag/v2.29.17) |\n\n### Workarounds\n\nNone.\n\n### References\n\n- Fix: #26205\n\n### Credits\n\nWe'd like to thank Anthropic's Security Team (ANT-2026-22433) for independently disclosing this issue!","state":0,"publishedAt":"2026-08-20T18:34:21+00:00","modifiedAt":"2026-10-18T10:55:40.9943988+00:00","affected":[{"ecosystem":"Go","name":"github.com/coder/coder/v2","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"2.34.0"},{"kind":"fixed","version":"2.34.2"}]}],"versions":[],"rawVersionEvidence":null},{"ecosystem":"Go","name":"github.com/coder/coder/v2","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"2.33.0"},{"kind":"fixed","version":"2.33.8"}]}],"versions":[],"rawVersionEvidence":null},{"ecosystem":"Go","name":"github.com/coder/coder/v2","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"2.30.0"},{"kind":"fixed","version":"2.32.7"}]}],"versions":[],"rawVersionEvidence":null},{"ecosystem":"Go","name":"github.com/coder/coder/v2","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"2.29.17"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V3","vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"LOW"}],"references":["https://github.com/coder/coder/security/advisories/GHSA-8fxq-53rx-ph5f","https://github.com/coder/coder/pull/26205","https://github.com/coder/coder/commit/35a7dc8ab9c7f15ce05d963947823ee31224512f","https://github.com/coder/coder","https://github.com/coder/coder/releases/tag/v2.29.17","https://github.com/coder/coder/releases/tag/v2.32.7","https://github.com/coder/coder/releases/tag/v2.33.8","https://github.com/coder/coder/releases/tag/v2.34.2"],"sourceUrl":"https://github.com/advisories/GHSA-8fxq-53rx-ph5f","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-8fxq-53rx-ph5f","identifiers":["GHSA-8fxq-53rx-ph5f","CVE-2026-111933","GO-2026-6265"]},"retained":false,"historicalAffected":[]}],"coverage":[]}