better-authの脆弱性、OAuthのstateをMagic Linkとして使われ他人としてサインインされるおそれ(CVE-2026-114607、修正は1.7.7)

公開 2026-11-01公表 2026-10-01更新 2026-11-01資料確認 2026-11-01JavaScript / TypeScriptの脆弱性 126件のまとめ
対象製品better-auth
識別番号CVE-2026-114607
影響範囲1.4.0-beta.18以上、1.7.7未満(Magic LinkとOAuthを併用する構成)
修正情報1.7.7

認証ライブラリの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の中の保存先・起きることの順に並べる。

攻撃者ねらった相手のメールアドレスで、社外のOAuthサインインを始める
返ってきたstateを、そのアドレスのMagic Linkの確認に送る

better-auth 1.4.0-beta.18以上1.7.7未満

OAuthのstateデータベースに保存する(storeStateStrategy: "database")
Magic Linkのトークンstateと同じ保存先に、同じ識別子で記録する
Magic Linkの確認stateとトークンを区別できない
メールを受け取れる証明なしに
その利用者のセッションを得るアカウントの権限をすべて使える
起きること
既存のアカウントの乗っ取りメールボックスやOAuth提供元へのアクセスは要らない
確認済みのアカウントの作成Magic Linkでの新規登録が有効で、そのアドレスの利用者がまだいない場合
権限の広がり確認済みのメールアドレスやドメインを信頼して権限を与えるアプリ

出典 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に上げるまでの回避策を、項目ごとに並べる。

対象になる構成
この経路が塞がれる構成
版
1.4.0-beta.18以上1.7.7未満
1.7.7以上
Magic Linkのトークンの保存
既定のstoreToken: "plain"、またはhashedで全体のverification.storeIdentifierもhashed
storeTokenがhashedで、全体のstoreIdentifierは未設定かplain
サインインの方法
Magic Linkと、組み込みのソーシャルログインかGeneric OAuthの両方が有効
Magic Link、またはソーシャル・Generic OAuthのサインインを止める
OAuthのstateの保存先
database(データベースかセカンダリストレージを設定したときの既定)
cookie。OAuth Proxyを使うなら先に専用のsecretを分ける
だから 1.7.7以上に上げる。Magic LinkのdisableSignUp: trueだけでは、既存のアカウントの乗っ取りを防げない。

出典 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日

better-authがアドバイザリを公表し、npmで1.7.7を公開OAuth Proxyで別人としてサインインできる問題も同じ版で直した。PoCの公開は無い
9.1CVSS 3.1(GitHubの評価)

2026年10月23日

NVDにCVE-2026-114607を登録同じ日にアドバイザリも更新された

2026年10月28日

GitHub Advisory Databaseに収録

2026年11月1日

KEVに載っていない実際の悪用の報告も無い。npmの最新は1.7.15
0.4%EPSS(30日以内の悪用の推定)

出典 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.71.7.71.7.15(2026年11月1日)

1.7.7は、今回のMagic Linkの問題と同時に、OAuth Proxyで別人としてサインインできる問題(高)も直しています。[1][8][10]

05better-authがどこから入っているか確かめて上げる手順

  1. 使っている版と、どのパッケージが連れてきているかを確認します。依存はpackage-lock.json・yarn.lock・pnpm-lock.yamlにも記録されています。

    ターミナル
    npm ls better-auth
  2. 対象の構成かを設定で確かめます。Magic Linkの指定、storeToken、verification.storeIdentifier、account.storeStateStrategyの指定を探します(指定が無ければ既定値で判断します)。

    ターミナル
    grep -rn -E "magicLink|storeToken|storeStateStrategy|storeIdentifier" --include="*.ts" --include="*.js" .
  3. 1.7.7以上へ更新します。別に入れている@better-auth/のアダプター・プラグインも同じ版にそろえます。

    ターミナル
    npm install better-auth@1.7.7
  4. 間接依存で入っている場合は、package.jsonのoverridesで版を固定して入れ直します(yarnはresolutions、pnpmはpnpm.overrides)。

    package.json
    "overrides": {
      "better-auth": "1.7.7"
    }
  5. 更新後の版を確かめます。更新すると既存の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]

脆弱性の公表・更新一覧で、JavaScript / TypeScriptの関連情報を調べることもできます。

緊急の場合AI攻撃リスク即点検サービス公開情報と、契約後すぐに用意できるアクセスの記録から先に調べ、被害や狙われやすい構成がないかを早く確かめます。

よくある質問

Magic Linkを使っていなければ対象外ですか?

Magic Linkプラグインが無効なら、この経路は成立しません。対象は、Magic Linkと、組み込みのソーシャルログインまたはGeneric OAuthの両方を使い、OAuthのstateをデータベースに保存している構成です。[1]

OAuthのstateをCookieに保存していれば大丈夫ですか?

このMagic Linkの経路は塞がれます。ただしOAuth Proxyを使っていて、その専用secretを全体用の秘密鍵と共有している場合は、別の乗っ取り経路(同じ1.7.7で修正)が開きます。回避策の節のとおり、専用secretを分けて設定します。[1]

CVE番号が2つあるのはなぜですか?

同じ問題に、GitHubがCVE-2026-114607を、VulnCheckがCVE-2026-110862を別々に採番したためです。どちらも同じ脆弱性を指し、修正版は1.7.7です。[1][4]

1.7.7に上げると、既存の利用者のログインはどうなりますか?

更新前に発行したMagic Linkと、途中だったOAuth・SAMLのサインインは使えなくなり、利用者はやり直しになります。データベースの移行は不要です。検証用の保存先を共有するサーバーは同時に切り替えます。[1][8]

出典・参考資料

  1. better-auth公式:GHSA-965c-763c-88jm2026-10-01公表・2026-10-23更新(日本時間) / 仕組み、対象の条件、影響、修正版1.7.7、回避策、段取り、CVSS 3.1 9.1、CWE-287
  2. 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
  3. NVD:CVE-2026-1146072026-10-23登録(日本時間) / CVSS 3.1 9.1(CNA GitHub_M)、登録日
  4. VulnCheck:CVE-2026-110862(同一問題の別採番)2026-10-15 / 同じ問題にCVE-2026-110862を採番、CVSS 4.0 9.3、影響範囲
  5. 米CISA:Known Exploited Vulnerabilities Catalog(JSON版 2026.10.30)2026-11-01確認 / KEVに未掲載であること
  6. FIRST:EPSS(CVE-2026-114607)2026-10-31 / 今後30日に悪用される見込みの推定 0.4%
  7. npm:better-auth2026-11-01確認 / 1.7.7の公開日(2026-10-01、日本時間)、最新は1.7.15(2026-11-01)
  8. better-auth公式:リリースノート v1.7.72026-10-01 / Magic Linkの修正、更新の段取り(既存リンク失効・保存先共有)、OAuth Proxyの同時修正、アダプターの同時更新
  9. better-auth公式:リリースノート v1.7.02026-08-18 / 1.7系の破壊的変更(アカウントのissuer必須化、Generic OAuthの書き換え、OIDC/MCP分離など)
  10. better-auth公式:GHSA-r4xp-prcw-77qf(OAuth Proxy)2026-10-01公表(日本時間) / OAuth Proxyで別人としてサインインできる問題、1.7.7で修正、専用secretの条件
  11. 修正のプルリクエスト:github.com/better-auth/better-auth/pull/11494GitHub Advisoryの参考リンク / 修正の内容・経緯
  12. 修正のコミット:github.com/better-auth/better-auth/commit/ac54bfd67821a7607533af2059858b12bc54e26aGitHub Advisoryの参考リンク / 修正の内容・経緯

あわせて読みたい記事

JavaScript / TypeScript公表 2026-10-21

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公表 2026-10-26

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などへの入れ替えと確かめ方を説明します。

Python公表 2026-10-22

Brotliの脆弱性の確認方法、PythonとNode.jsで対象かを確かめて直す(CVE-2026-111497、コード実行のおそれ)

圧縮形式Brotliの展開処理の脆弱性CVE-2026-111497(HTTP2Shell)は、米CISAが悪用を確認しています。Pythonのbrotli・brotlicffi、Node.jsの同梱版などで、自分の版と構成が対象かを確かめる方法と修正版を、言語ごとに説明します。