Better Auth の脆弱性により、ExpoおよびElectronプラグイン経由でアカウント乗っ取りが可能に

要点

Better Authは2026年11月3日、TypeScript向け認証ライブラリのバージョン1.7.16のリリースに合わせて、3件のセキュリティアドバイザリを公開しました。これらのBetter Authの脆弱性のうち最も深刻なものはCVSSスコア9.1で、メールアドレスを知っている相手であれば、認証されていない攻撃者がそのユーザーとしてサインインできます。残る2件は、電話番号によるサインインとElectronデスクトッププラグインに影響します。

expo()プラグインを登録しているアプリは、ユーザー操作を必要としない(ゼロクリックの)アカウント乗っ取りのリスクにさらされます。また、Electronプラグインの別のバグにより、サーバーの認証シークレットがサインイン済みの任意のユーザーに漏えいする恐れがあります。better-auth 1.7.16または1.8.0-beta.5にアップグレードし、そのうえでシークレットをローテーションしてください。

重要な理由

Better Authは、TypeScriptアプリ向けのオープンソース認証ライブラリです。3件のバグはいずれも中核となるID確認の仕組みに関わるため、影響はアカウントの直接的な乗っ取りに及びます。Expoのアドバイザリによると、この攻撃は「ユーザー側の操作がなくても」成立します。

現時点で、悪用の実態や公開された概念実証(PoC)は報告されていません。

攻撃の仕組み

Expoプラグインが、発行していない値に署名してしまう(CVE-2026-121802、CVSS 9.1)

expo()プラグインは、ブラウザーがソーシャルサインインを開始する際に役立つ公開エンドポイントを追加します。しかし、このエンドポイントは「リクエストから受け取った値に、アプリケーションのシークレットで署名」していました。Better Authは、同じシークレットをメール検証リンクやセッションCookieのキャッシュにも使用しています。その結果、攻撃者はメールアドレス変更用のトークンを偽造し、アカウントを乗っ取れる可能性がありました。同じエンドポイントにはオープンリダイレクトの問題もあり、ワイルドカードを使った信頼済みオリジンの設定では、意図しないURLまで一致してしまうおそれもありました。

認証前に電話番号を登録できてしまう(GHSA-q747-mqgr-4gh7、CVSS 8.1)

サインアップの処理で、所有者であることが証明される前に電話番号が保存される場合がありました。攻撃者は、被害者の電話番号を自分のアカウントに紐付けられます。その後、被害者が有効なコードでサインインすると、被害者は「攻撃者のアカウントのセッションを取得」します。被害者が入力したデータが、攻撃者に渡る可能性があります。なお、攻撃者が被害者本人のアカウントに入れるわけではありません。

Electronプラグインがサーバーのシークレットを漏えいさせる(GHSA-9p5w-h4pr-fcrc、CVSS 8.1)

通常のサインインで、サーバー内部の認証コンテキストが返される場合がありました。このコンテキストには「認証シークレットと、設定済みソーシャルプロバイダーのクライアントシークレットが含まれて」います。このシークレットがあれば、メールアドレスを知っている相手になりすまして、セッションを偽造できます。また、プラグインの順序によっては、パスワードによるサインインで二要素認証のチェックを回避できる場合もありました。

影響を受けるバージョン

  • @better-auth/expo: 1.4.0-beta.6から1.7.16未満
  • @better-auth/electron: 1.5.0-beta.12から1.7.16未満
  • better-auth の電話番号プラグイン: 0.4.12-beta.7から1.7.16未満
  • ベータ版: 1.8.0-beta.0から1.8.0-beta.5未満

パッチと緩和策

  • better-auth、@better-auth/expo、@better-auth/electronを1.7.16または1.8.0-beta.5にアップグレードしてください。
  • Expoのエンドポイントに外部から到達できた場合は、アプリケーションのシークレットをローテーションしてください。古い署名は「シークレットが変更されるまで有効」なままです。
  • Electronプラグインを使用していた場合は、認証シークレットと、すべてのソーシャルプロバイダーのクライアントシークレットをローテーションしてください。
  • 1.7.16では新規の未検証番号を防ぐのみのため、認証されていない電話番号は削除してください。
  • アップグレードできない場合は、サーバー側のexpo()およびelectron()プラグインを削除してください。

脆弱性の全容とアップグレード手順については、プロジェクトのBetter Authセキュリティリリースの投稿をご覧ください。

翻訳元: https://meterpreter.org/better-auth-vulnerabilities/

本記事は meterpreter.org の記事を翻訳・要約したものです。