better-authの脆弱性、OAuthのstateをMagic Linkとして使われ他人としてサインインされるおそれ(CVE-2026-114607、修正は1.7.7)
CVE-2026-114607認証ライブラリのbetter-authに、OAuthのサインインで発行されるstate(途中の状態を表す値)を、Magic Linkのトークンとしても受け付けてしまう脆弱性(CVE-2026-114607、GHSA-965c-763c-88jm)が、2026年10月1日にbetter-authから公表されました(GitHub Advisory Databaseへの収録は10月28日、日本時間)。対象になるかは、Magic LinkとOAuthの設定の組み合わせで決まります。
2026-11-01更新:一次情報(better-auth公式のGHSA、GitHub Advisory Database、NVD、VulnCheck、KEV、EPSS、npm、リリースノート)と照合し、速報から解説に書き直して公開しました。CVEが2つある理由、対象を設定で見分ける条件、更新時の段取り(既存リンク失効・保存先の同時切り替え・1.6→1.7の変更)を追記しました。
- Magic Linkと、組み込みのソーシャルログインまたはGeneric OAuthを併用し、OAuthのstateをデータベースに保存している構成が対象です。
- 相手のメールアドレスを知っているだけで、メールを受け取れる証明なしに、その利用者としてサインインされるおそれがあります。
- 修正版は1.7.7です。更新するか、設定の変更(回避策)で防ぎます。
01better-authの脆弱性で起きることと仕組み
攻撃者は、ねらった相手のメールアドレスで社外のOAuthサインインを始め、返ってきたstateの値を、そのアドレスのMagic Linkサインインの確認に送ります。better-authは、OAuthのstateとMagic Linkのトークンを同じ保存先に同じ識別子で記録していたため、Magic Linkの処理が両者を区別できませんでした。結果として、攻撃者はメールを受け取れることを証明しないまま、その利用者としてサインインできます。[1]
深刻度は、CVEの採番機関であるGitHub(GitHub_M)の評価でCVSS 3.1の9.1(緊急)です。この問題には、VulnCheckが別にCVE-2026-110862を採番し、CVSS 4.0で9.3(緊急)と評価しています。弱点の分類はCWE-287(不適切な認証)です。[1][3][4]
OAuthのstateとMagic Linkのトークンが同じ保存先に並び、stateでサインインできてしまう
アドバイザリが示す手順を、攻撃者の操作・better-authの中の保存先・起きることの順に並べる。
better-auth 1.4.0-beta.18以上1.7.7未満
出典 better-auth「GHSA-965c-763c-88jm」(2026-10-01)
02影響を受ける条件
アドバイザリは、次がすべて当てはまる構成を対象としています。独自のハッシュ関数を使っている場合は、Magic LinkとOAuthのstateが同じ保存値にならないかを確かめます。
- better-authが1.4.0-beta.18以上、1.7.7未満である。[1]
- Magic Linkプラグインが有効で、トークンの保存が既定の
storeToken: "plain"、または"hashed"かつ全体のverification.storeIdentifierも"hashed"になっている。[1] - 組み込みのソーシャルログイン、またはGeneric OAuthが有効である。[1]
- OAuthのstateをデータベースに保存している(
account.storeStateStrategy: "database"。データベースまたはセカンダリストレージを設定したときの既定)。stateをCookieに保存している場合、この経路は塞がれます(ただし後述のOAuth Proxyの条件に注意)。[1]
対象の場合、認証していない攻撃者が、相手のメールアドレスを知っているだけでその利用者のセッションを得て、アカウントの権限をすべて使えます。メールボックスやOAuth提供元へのアクセスは要りません。Magic Linkでの新規登録が有効で、そのアドレスの利用者がまだいなければ、「メール確認済み」と誤って記録されたアカウントを作られます。確認済みのメールアドレスやドメインを信頼して権限を与えるアプリでは、影響が広がります。[1]
4つの条件がすべてそろうと対象になり、どれか1つを外せばこの経路は塞がれる
アドバイザリが挙げる対象の条件と、1.7.7に上げるまでの回避策を、項目ごとに並べる。
出典 better-auth「GHSA-965c-763c-88jm」(2026-10-01)
03悪用の状況
2026年11月1日時点で、米国のCISAが公開している「悪用が確認された脆弱性の一覧(KEV)」には載っていません。
今後30日以内に悪用される確率の推定値(EPSS)は0.4%です(2026-11-01時点)。見込みは高くない部類ですが、推定値で、悪用されないことを保証するものではありません。
アドバイザリに再現用のコード(PoC)の公開はありません。KEVには載っておらず、実際の悪用の報告もありません。[1]
公表と同じ日に1.7.7がnpmで公開され、11月1日時点でKEVには載っていない
better-authの公表から、データベースへの登録、悪用の状況の確認までを並べる(日本時間)。
提供元(better-auth) データベース・公的機関
2026年10月1日
2026年10月23日
2026年10月28日
2026年11月1日
出典 better-auth「GHSA-965c-763c-88jm」(2026-10-01)、NVD「CVE-2026-114607」(2026-10-23)、米CISA「Known Exploited Vulnerabilities Catalog」(2026-11-01確認)
04対象のバージョンと推奨する版
修正版は1.7.7です。1.4.0-beta.18以上1.7.7未満が影響を受けます。配布元(npm)で公開済みの版で、確認日は2026年11月1日です。1.7.7はアドバイザリと同じ2026年10月1日(日本時間)にnpmで公開されています(アドバイザリ本文には公表時点で未公開とありますが、収録までに公開されました)。更新の前に、提供元のリリースノートで変更点を確かめてください。[1][7][8]
| 系列 | 推奨する版 | 今回の脆弱性が直る版 | 最新版 |
|---|---|---|---|
| 1.7系 | 1.7.7 | 1.7.7 | 1.7.15(2026年11月1日) |
1.7.7は、今回のMagic Linkの問題と同時に、OAuth Proxyで別人としてサインインできる問題(高)も直しています。[1][8][10]
05better-authがどこから入っているか確かめて上げる手順
使っている版と、どのパッケージが連れてきているかを確認します。依存はpackage-lock.json・yarn.lock・pnpm-lock.yamlにも記録されています。
ターミナルnpm ls better-auth対象の構成かを設定で確かめます。Magic Linkの指定、storeToken、verification.storeIdentifier、account.storeStateStrategyの指定を探します(指定が無ければ既定値で判断します)。
ターミナルgrep -rn -E "magicLink|storeToken|storeStateStrategy|storeIdentifier" --include="*.ts" --include="*.js" .1.7.7以上へ更新します。別に入れている@better-auth/のアダプター・プラグインも同じ版にそろえます。
ターミナルnpm install better-auth@1.7.7間接依存で入っている場合は、package.jsonのoverridesで版を固定して入れ直します(yarnはresolutions、pnpmはpnpm.overrides)。
package.json"overrides": { "better-auth": "1.7.7" }更新後の版を確かめます。更新すると既存のMagic Linkと途中のサインインは無効になるため、利用者への案内も用意します。
ターミナルnpm ls better-auth
06すぐに更新できないときの対処
更新できるまでの間は、アドバイザリが挙げる次のいずれかで緩和します。[1]
account.storeStateStrategyを"cookie"にする。OAuth Proxyを使う場合は、先に各環境の全体用の秘密鍵とは別の専用secretを、関係するすべての環境に設定します(共有したままだと別の乗っ取り経路が開きます)。[1]- Magic Linkの
storeTokenを"hashed"にし、全体のverification.storeIdentifierは未設定か"plain"にする。[1] - Magic Link、またはソーシャル・Generic OAuthのサインインを止める。[1]
Magic LinkのdisableSignUp: trueだけでは足りません。新しい確認済みアカウントの作成は止まりますが、既存アカウントの乗っ取りは防げません。[1]
071.7.7へ上げるときの段取り
更新すると、それまでに発行したMagic Linkと、処理の途中だったOAuthサインインのstate・SAMLの途中状態は使えなくなります。利用者はサインインやアカウント連携をやり直すことになります。データベースのスキーマ移行は要りません。[1][8]
別に入れている@better-auth/のアダプター・プラグイン(例:@better-auth/drizzle-adapter)は、本体と同じ版にそろえて更新します。検証用の保存先を共有する複数のサーバーや、OAuth Proxyに参加するすべての環境(本番・プレビュー・開発)は、同じタイミングで切り替えます。混在すると途中状態をやり取りできません。[1][8]
1.6系から上げる場合は、1.7系で入った設定・スキーマの変更(アカウントのissuer必須化、Generic OAuthの書き換え、OIDC/MCPプラグインの分離など)があります。1.7系に修正版が出ているため、1.6系に留まったままの対処はありません。提供元の1.7アップグレード手順に沿って進めます。[9]

よくある質問
Magic Linkを使っていなければ対象外ですか?
Magic Linkプラグインが無効なら、この経路は成立しません。対象は、Magic Linkと、組み込みのソーシャルログインまたはGeneric OAuthの両方を使い、OAuthのstateをデータベースに保存している構成です。[1]
OAuthのstateをCookieに保存していれば大丈夫ですか?
このMagic Linkの経路は塞がれます。ただしOAuth Proxyを使っていて、その専用secretを全体用の秘密鍵と共有している場合は、別の乗っ取り経路(同じ1.7.7で修正)が開きます。回避策の節のとおり、専用secretを分けて設定します。[1]
出典・参考資料
- better-auth公式:GHSA-965c-763c-88jm2026-10-01公表・2026-10-23更新(日本時間) / 仕組み、対象の条件、影響、修正版1.7.7、回避策、段取り、CVSS 3.1 9.1、CWE-287
- GitHub Advisory Database:GHSA-965c-763c-88jm2026-10-28収録(日本時間) / 収録日、影響範囲 >=1.4.0-beta.18 <1.7.7、修正版1.7.7、CVSS 3.1 9.1
- NVD:CVE-2026-1146072026-10-23登録(日本時間) / CVSS 3.1 9.1(CNA GitHub_M)、登録日
- VulnCheck:CVE-2026-110862(同一問題の別採番)2026-10-15 / 同じ問題にCVE-2026-110862を採番、CVSS 4.0 9.3、影響範囲
- 米CISA:Known Exploited Vulnerabilities Catalog(JSON版 2026.10.30)2026-11-01確認 / KEVに未掲載であること
- FIRST:EPSS(CVE-2026-114607)2026-10-31 / 今後30日に悪用される見込みの推定 0.4%
- npm:better-auth2026-11-01確認 / 1.7.7の公開日(2026-10-01、日本時間)、最新は1.7.15(2026-11-01)
- better-auth公式:リリースノート v1.7.72026-10-01 / Magic Linkの修正、更新の段取り(既存リンク失効・保存先共有)、OAuth Proxyの同時修正、アダプターの同時更新
- better-auth公式:リリースノート v1.7.02026-08-18 / 1.7系の破壊的変更(アカウントのissuer必須化、Generic OAuthの書き換え、OIDC/MCP分離など)
- better-auth公式:GHSA-r4xp-prcw-77qf(OAuth Proxy)2026-10-01公表(日本時間) / OAuth Proxyで別人としてサインインできる問題、1.7.7で修正、専用secretの条件
- 修正のプルリクエスト:github.com/better-auth/better-auth/pull/11494GitHub Advisoryの参考リンク / 修正の内容・経緯
- 修正のコミット:github.com/better-auth/better-auth/commit/ac54bfd67821a7607533af2059858b12bc54e26aGitHub Advisoryの参考リンク / 修正の内容・経緯
あわせて読みたい記事
Vite 6.4.4の脆弱性の確認方法、開発サーバーから.envを読み取られるおそれと6.4.5への更新(CVE-2026-118662)
Vite 6.4.4の脆弱性CVE-2026-118662は、ネットワークに公開した開発サーバーで、拒否したはずの.envなどを返すおそれがあります。10月6日の更新で6.4.4にした環境が対象になった理由、初期設定で条件がそろう点、Astro 5など間接の依存の確かめ方、6.4.5への上げ方を説明します。
PHPのWindows版のBrotliの脆弱性、8.5.12-1などへの入れ替えとcURL・Guzzleの確かめ方(CVE-2026-111497)
PHPのWindows版に同梱のBrotliの脆弱性CVE-2026-111497は、米CISAが悪用を確認しています。10月21日の版も対象のままである理由、GuzzleやWordPressで自動展開が有効になる条件、8.5.12-1などへの入れ替えと確かめ方を説明します。
Brotliの脆弱性の確認方法、PythonとNode.jsで対象かを確かめて直す(CVE-2026-111497、コード実行のおそれ)
圧縮形式Brotliの展開処理の脆弱性CVE-2026-111497(HTTP2Shell)は、米CISAが悪用を確認しています。Pythonのbrotli・brotlicffi、Node.jsの同梱版などで、自分の版と構成が対象かを確かめる方法と修正版を、言語ごとに説明します。