GHSA-wxw3-q3m9-c3jr: Better Auth: OAuth callback accepts mismatched `state` when cookie-backed state storage is used without PKCE
In parseGenericState, the cookie branch decrypted the oauth_state cookie and validated expiry, but did not compare the incoming OAuth state query parameter to the nonce that generateGenericState issued at sign-in. Any callback to /api/auth/oauth2/callback/<providerId> that arrived with a forged state and any code was therefore accepted as long as the browser still held a live oauth_state cookie. With pkce: false (or any getToken path that does not enforce a code-verifier round-trip), an attacker who forced the victim to deliver an attacker-controlled authorization code to the callback would mint a session bound to the attacker’s external identity in the victim’s browser. Account-linking flows behaved the same way, binding the attacker’s external account to an authenticated victim row.
References
Code Behaviors & Features
Detect and mitigate GHSA-wxw3-q3m9-c3jr with GitLab Dependency Scanning
Secure your software supply chain by verifying that all open source dependencies used in your projects contain no disclosed vulnerabilities. Learn more about Dependency Scanning →