better-auth: OAuthのステート値が、別のユーザーとしてサインインするためのマジックリンクとして利用される可能性があります。
## 影響を受ける可能性はありますか?
`better-auth`のバージョン`1.4.0-beta.18`から`1.7.7`までのバージョンで、マジックリンクプラグインとソーシャルログインまたは汎用OAuthログインを使用している場合、影響を受ける可能性があります。
以下の**すべて**が当てはまる場合、影響を受けます。
- マジックリンクが有効になっており、デフォルトの`storeToken: "plain"`が設定されているか、または`storeToken: "hashed"`が設定されており、グローバルな`verification.storeIdentifier: "hashed"`(ハッシュ化されたデフォルトを含む)が設定されている。
- 少なくとも1つの組み込みソーシャルプロバイダーまたは汎用OAuthプロバイダーが有効になっている。
- OAuthのステート値が`account.storeStateStrategy: "database"`を使用している。これは、データベースまたはセカンダリストレージが設定されている場合のデフォルトです。
Cookieベースのステートは、以下のOAuth Proxyの条件に従う場合、この問題を回避できます。カスタムハッシャーを使用している場合は、フローが同じ保存された識別子に解決されないことを確認してください。
## 概要
Better Authは、OAuthログインのステート値をマジックリンクのトークンとして受け入れます。攻撃者は、任意のメールアドレスでOAuthログインを開始し、返されたステート値を使用して、そのアドレスでマジックリンクログインを完了させることができます。攻撃者は、そのメールアドレスを読み取ることができることを証明する必要はありません。
## 影響
認証されていない攻撃者が、あるユーザーのメールアドレスを知っている場合、そのユーザーの通常のセッションを取得し、そのアカウントのすべての権限を使用することができます。攻撃者は、メールボックスにアクセスする必要はなく、OAuthプロバイダーへのサインインやOAuthコールバックの完了も必要ありません。
マジックリンクのサインアップが有効になっており、そのメールアドレスを持つユーザーが存在しない場合、攻撃者は代わりに、Better Authが誤ってメールアドレスの検証済みとマークするアカウントを作成し、そのアカウントにサインインすることができます。この誤った「メールアドレス検証済み」フラグは、後でメールボックスの所有者がサインインする際に、Better Authのデフォルトの未検証アカウント保護機能を回避する可能性があり、攻撃者のセッションがそのアカウントに残る可能性があります。検証済みのメールアドレスまたはメールドメインを信頼するアプリケーションは、このアカウントに対してより多くのアクセス権を与える可能性があります。
## 修正
計画されていた `better-auth` のバージョン 1.7.7 のリリースに向けて、修正が取り込まれました。ただし、このパッケージはまだ利用できません。
`better-auth` と、それと共にリリースされた Better Auth のアダプター、プラグイン、および連携機能をまとめてアップグレードしてください。検証ストレージを共有するサーバーは、同じタイミングでアップグレードする必要があります。新しい Magic Link をリクエストし、保留中の OAuth または SAML へのサインインを再開してください。アップグレード前に作成されたリンクや状態は、正常に完了できません。カスタムの `verification.storeIdentifier.overrides` ルールを、`magic-link:` および `auth-state:` プレフィックスに合わせて更新してください。ユーザーデータやアカウントデータの移行は行われず、公開されているトークン値や API シグネチャは変更されません。
## 対策
修正版へのアップグレードが完了するまでの間、以下のいずれかの対策を使用してください。
- `account.storeStateStrategy` を `"cookie"` に設定します。また、OAuth Proxy を使用している場合は、まず、すべての環境で共有する専用の OAuth Proxy の `secret` を設定し、各環境のグローバルな Better Auth のシークレットとは異なるようにしてください。Cookie ベースの状態は、プロキシがグローバルシークレットを共有し、暗黙的なアカウント連携が有効になっている場合に、別の OAuth Proxy を介したアカウントの乗っ取りのリスクを生み出す可能性があります。
- Magic Link プラグインのオプション `storeToken` を `"hashed"` に設定し、グローバルな `verification.storeIdentifier` を設定しないか、または `"plain"` に設定します。グローバル識別子のハッシュ化は、Magic Link トークンもハッシュ化されている場合、この問題を完全に防ぐことはできません。
- Magic Link を使用したサインインを無効にするか、ソーシャルログインや汎用 OAuth ログインを無効にします。
Magic Link プラグインで `disableSignUp: true` を設定するだけでは不十分です。これにより、新しい検証済みアカウントの作成は停止されますが、既存のアカウントの乗っ取りは防ぐことができません。
影響を受けるパッケージ:
- npm (JavaScript) better-auth: 影響範囲は、バージョン 1.4.0-beta.18 以降、1.7.7 未満。バージョン 1.7.7 で修正済み。