better-auth: OAuth Proxy lets an attacker sign in as another user
## 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 ope
- Products
- better-auth
- Affected versions
- Not specified
- Fixed versions
- 1.7.7
- CVEs
- CVE-2026-110864
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 1 Nov 2026, 18:45 UTC · Revision 1
Source evidence
better-auth: OAuth Proxy lets an attacker sign in as another user
core-osv · Original sourcePublished 27 Oct 2026, 15:32 UTC
## 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 ope
osv:GHSA-r4xp-prcw-77qf
better-auth
Fixed versions: 1.7.7
Complete source record
{
"id": "487dcad0848ae4fb0ae3d56caf8361acc615e3e5c51ee697ed4a93a4fe77b2f1",
"url": "https://osv.dev/vulnerability/GHSA-r4xp-prcw-77qf",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "better-auth: OAuth Proxy lets an attacker sign in as another user",
"summary": "## 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 ope",
"evidence": "osv:GHSA-r4xp-prcw-77qf",
"products": [
{
"name": {
"value": "better-auth",
"evidence": "/affected/0/package/name"
},
"prerequisites": [],
"fixed_versions": [
{
"value": "1.7.7",
"evidence": "/affected/0/ranges"
}
],
"affected_versions": []
}
],
"severity": "high",
"structured": {
"id": "GHSA-r4xp-prcw-77qf",
"aliases": [
"CVE-2026-110864",
"GHSA-r4xp-prcw-77qf"
],
"metrics": [
{
"type": "CVSS_V3",
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N"
}
],
"affected": [
{
"ranges": [
{
"type": "SEMVER",
"events": [
{
"introduced": "1.5.0-beta.12"
},
{
"fixed": "1.7.7"
}
]
}
],
"package": {
"name": "better-auth",
"purl": "pkg:npm/better-auth",
"ecosystem": "npm"
},
"database_specific": {
"source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-r4xp-prcw-77qf/GHSA-r4xp-prcw-77qf.json"
}
}
],
"modified": "2026-10-27T15:47:24.832632558Z",
"provider": "osv",
"references": [
"https://github.com/better-auth/better-auth/security/advisories/GHSA-r4xp-prcw-77qf",
"https://github.com/better-auth/better-auth/pull/11494",
"https://github.com/better-auth/better-auth/commit/ac54bfd67821a7607533af2059858b12bc54e26a",
"https://github.com/better-auth/better-auth",
"https://github.com/better-auth/better-auth/releases/tag/v1.7.7"
],
"provider_metadata": {
"cwe_ids": [
"CWE-287",
"CWE-345"
],
"severity": "HIGH",
"github_reviewed": true,
"nvd_published_at": null,
"github_reviewed_at": "2026-10-27T15:32:16Z"
}
},
"related_cves": [
{
"value": "CVE-2026-110864",
"evidence": "/aliases"
}
],
"security_relevant": true,
"severity_evidence": "/database_specific/severity"
},
"source_id": "core-osv",
"document_id": 462841,
"published_at": "2026-10-27T15:32:16+00:00"
}