Patch Forecast
Yellow warning
Plan into this sprint.

GHSA-r4xp-prcw-77qf

better-auth: OAuth Proxy lets an attacker sign in as another user

Risk score
54/100
CVSS
7.4 v3.1
Published
27 Oct 2026

Open in the live forecast Today's forecast

What to know

What it is
You may be affected if you use better-auth from 1.5.0-beta.12 through versions before 1.7.7 with the OAuth Proxy plugin. You are affected only if all of these are also true: On a participating environment, the OAuth Proxy plugin has no dedicated secret, or its secret equals that environment's global Better Auth secret…
Affected
better-auth (npm) >= 1.5.0-beta.12, < 1.7.7
Fix
Upgrade better-auth to 1.7.7 or later.
Exploitation
No known exploitation

Story map

Story map: better-authTHE FLAWSTHE FIXGHSA-r4xp-prcw-77qfOAuth Proxy lets an attackersign in as another userCVSS 7.4CVE-2026-114607OAuth state can be used as aMagic Link to sign in as anotheruserCVSS 9.1 · EPSS 0%GHSA-q84f-53jg-9ppmDevice login approval does notshow the requesting client orpermissionsCVSS 8.1Upgrade better-auth1.7.7 · 1.5.0or later on your release lineWho is exposedbetter-auth (npm) >=1.4.0-beta.18, < 1.7.7AMBER · PATCH THIS WEEKbetter-authBetter Auth is an authenticationand authorization library forTypeScript. From 1.4.0-beta.18until 1.7.7, deployments thatenable Magic Link withstoreToken set to plain, or withstoreToken set to hashed and…Where it standsNo known exploitationCONNECTS TOSame weaknessAuthentication bypass (CWE-287)249 other warnings in 30 days →
Story map: the flaws, the fix, how it unfolded and what it connects to. Boxes link to the record or article.

At a glance

better-auth: Amber, patch this week. Better Auth is an authentication and authorization library for TypeScript. From 1.4.0-beta.18 until 1.7.7, deployments that enable Magic Link with storeToken set to plain, or with storeToken set to hashed and the global verification.storeIdentifier setting also set to hashed, enable a built-in social or Generic OAuth …

The flaws

  • GHSA-r4xp-prcw-77qf: OAuth Proxy lets an attacker sign in as another user (CVSS 7.4)
  • CVE-2026-114607: OAuth state can be used as a Magic Link to sign in as another user (CVSS 9.1 · EPSS 0%)
  • GHSA-q84f-53jg-9ppm: Device login approval does not show the requesting client or permissions (CVSS 8.1)

The fix

Upgrade better-auth: 1.7.7 · 1.5.0 or later on your release line

Who is exposed: better-auth (npm) >= 1.4.0-beta.18, < 1.7.7

Where it stands

  • No known exploitation

Connects to

Why it is Yellow

  • CVSS 7.4 high
  • Remotely exploitable without logging in
  • On your watchlist: npm

Affected packages

PackageEcosystemVulnerableFixed in
better-authnpm>= 1.5.0-beta.12, < 1.7.71.7.7

References

Original description

## Am I affected? You may be affected if you use `better-auth` from 1.5.0-beta.12 through versions before 1.7.7 with the OAuth Proxy plugin. You are affected only if **all** of these are also true: - On a participating environment, the OAuth Proxy plugin has no dedicated `secret`, or its `secret` equals that environment's global Better Auth secret. - Sign-in state is stored in a cookie (`account.storeStateStrategy: "cookie"`). With a database or secondary storage, this is only the case if you chose it explicitly. - Implicit account linking is on (the default). You are not affected by this path if every participating environment uses a proxy `secret` distinct from its global Better Auth secret, if sign-in state is stored in the database, or if you use a version before 1.5.0-beta.12. ## Summary The OAuth Proxy plugin trusts any user profile it can decrypt. In the affected setup, Better Auth encrypts sign-in state, including data the caller chose, with the same secret and hands it to anyone who starts a social sign-in. An attacker can use this to get a fake profile for another user's email address that the proxy accepts as real. ## Impact An attacker without an account who knows a user's verified email address can sign in as that user, with that user's permissions. They can read private data, change the account, and link a provider account of their choice to it. They need no provider sign-in and no action from the victim. No availability impact is established, and a reported open redirect was not confirmed. ## Patches The fix is merged for the planned `better-auth` 1.7.7 release. That package is not available yet. Upgrade all nodes handling the same cookie-backed OAuth or SAML state flow and all OAuth Proxy participants together, including the production coordinator and preview or development deployments. Keep installed Better Auth packages released alongside `better-auth` on the same release version. Restart pending sign-in and account-linking flows; pre-upgrade state cookies and proxy payloads are rejected. Public options and API signatures are unchanged. ## Workarounds Until you upgrade to the fixed release, apply one of these: - Set one strong OAuth Proxy `secret` across every environment that takes part in the proxy flow, and keep it different from each environment's global Better Auth secret. - Set `account.storeStateStrategy: "database"`. This is already the default when a database or secondary storage is configured. If Magic Link is also enabled, switching can expose a separate cross-purpose verification-record path in affected releases. Ensure the two flows resolve to distinct stored identifiers; with built-in options, use Magic Link `storeToken: "hashed"` with global `verification.storeIdentifier` unset or `"plain"`, or disable Magic Link or both built-in social and Generic OAuth sign-in. - Remove the OAuth Proxy plugin if you do not need it. Setting `account.accountLinking.disableImplicitLinking: true` stops this path from taking over an existing account. It does not fix the underlying flaw: the callback can still accept attacker-made data as a provider identity. Apply one of the steps above as well.

Last activity 27 Oct 2026. Patch Forecast updates every hour.