{"id":"GHSA-8fxq-53rx-ph5f","title":"Coder: Login endpoint user enumeration via timing-defense placeholder in password comparison","summary":"Coder: Login endpoint user enumeration via timing-defense placeholder in password comparison","severity":"low","cvss":3.7,"cwe":["CWE-203","CWE-204"],"vendor":"coder","product":"github.com/coder/coder/v2","ecosystem":"go","affected":["github.com/coder/coder/v2 >= 2.34.0, < 2.34.2","github.com/coder/coder/v2 >= 2.33.0, < 2.33.8","github.com/coder/coder/v2 >= 2.30.0, < 2.32.7","github.com/coder/coder/v2 < 2.29.17"],"patched":["github.com/coder/coder/v2 2.34.2","github.com/coder/coder/v2 2.33.8","github.com/coder/coder/v2 2.32.7","github.com/coder/coder/v2 2.29.17"],"published":"2026-08-20","updated":"2026-08-20","source":"GHSA","sourceUrl":"https://github.com/advisories/GHSA-8fxq-53rx-ph5f","references":[{"url":"https://github.com/coder/coder/security/advisories/GHSA-8fxq-53rx-ph5f"},{"url":"https://github.com/coder/coder/pull/26205"},{"url":"https://github.com/coder/coder/commit/35a7dc8ab9c7f15ce05d963947823ee31224512f"},{"url":"https://github.com/coder/coder/releases/tag/v2.29.17"},{"url":"https://github.com/coder/coder/releases/tag/v2.32.7"},{"url":"https://github.com/coder/coder/releases/tag/v2.33.8"},{"url":"https://github.com/coder/coder/releases/tag/v2.34.2"},{"url":"https://github.com/advisories/GHSA-8fxq-53rx-ph5f"}],"tags":["ghsa","go"],"ingestedAt":"2026-08-20T18:59:55.296Z","slug":"GHSA-8fxq-53rx-ph5f","body":"## Overview\n\n### 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!\n\n## Affected packages\n\n- `github.com/coder/coder/v2 >= 2.34.0, < 2.34.2`\n- `github.com/coder/coder/v2 >= 2.33.0, < 2.33.8`\n- `github.com/coder/coder/v2 >= 2.30.0, < 2.32.7`\n- `github.com/coder/coder/v2 < 2.29.17`\n\n## Remediation\n\nUpgrade to a patched release:\n\n- `github.com/coder/coder/v2 2.34.2`\n- `github.com/coder/coder/v2 2.33.8`\n- `github.com/coder/coder/v2 2.32.7`\n- `github.com/coder/coder/v2 2.29.17`","depth":"sunlit","depthScore":20,"depthScoreParts":{"impact":20.4,"likelihood":0,"exploitation":0,"ransomware":0},"changes":[]}