@better-auth/expoに乗っ取り脆弱性、修正版あり
@better-auth/expoに、認証なしでアカウントの乗っ取りにつながる脆弱性が公表されました。ExpoアプリでBetter Authを使う組織は1.7.16へ更新し、そのあとアプリケーションシークレットも入れ替えてください。
急ぎ度: 早めに
CVSS v3は9.1で、認証なしにネットワーク越しで悪用でき、修正版1.7.16がすでに公開されているためです。
関係があるか
ExpoのモバイルアプリでBetter Authのログインを使い、@better-auth/expoを導入しているサービスが対象です。ユーザーのアカウントを預かる事業者側のサーバーに影響します。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| @better-auth/expo | 1.7.16より前 | 1.7.16 |
| better-auth(パッケージ情報では Better Auth の名前でも掲載) | 1.7.16より前 | 1.7.16 |
確かめ方
- 1package.jsonとロックファイル(package-lock.json・pnpm-lock.yaml・yarn.lock)で、@better-auth/expoが入っているかを調べる。
- 2入っていれば、インストールされている版が1.7.16より前でないかを確認する。better-auth本体の版も併せて見る。
- 3本番サーバー、ステージング環境、ビルド済みのコンテナイメージにも古い版が残っていないかを確かめる。
何が起きたか
@better-auth/expoの1.7.16より前の版に、認証をしていない相手が、任意のアカウントのメールアドレスを書き換えるなど、アカウント乗っ取りにつながる操作を成立させられる脆弱性があります。
原因は、呼び出し側が渡してきたstateという値に、サーバーが署名をしてしまうことです。その値がサーバー自身の発行したものかを確かめていません。署名は「サーバーが認めた値」の証明として扱われるため、外部から持ち込まれた値でも正当なものとして通ってしまいます。分類はCWE-346です。
Expoアプリで認証にBetter Authを使っているなら、筆者は早めに更新の計画を立てるべき案件だと見ています。KEVへの掲載は確認できていませんが、条件が軽く、被害がアカウントそのものに及ぶためです。
攻撃の流れ
-
1
値の持ち込み
外部の第三者が、サーバーの発行していないstate値を送りつける。
-
2
発行元の確認なし
サーバーはその値が自分の発行したものかを確かめない。
-
3
署名の付与
サーバーが持ち込まれた値に署名し、正当な値として扱えるようにしてしまう。
-
4
アカウント情報の改ざん
メールアドレスの変更などが通り、アカウントの乗っ取りにつながる。
どう悪用されるか
悪用に認証は要りません。ネットワーク越しに到達でき、攻撃の複雑さは低く、利用者に何かを操作させる必要もありません。前提になるのは、@better-auth/expoを使ったサーバーがインターネット側から届く場所にあることです。
悪用されると、任意のアカウントのメールアドレスを変えられるなど、アカウントを奪われる事態になります。CVSSの評価では、機密性と完全性への影響が高く、可用性への影響はありません。つまり、サービスが止まるのではなく、利用者の情報が読まれたり書き換えられたりする型の被害です。
今すぐやること
-
1
使っている版を確認する
@better-auth/expoとbetter-authが、どの環境でどの版かを洗い出します。モノレポや複数のサービスで使っている場合は、すべてのパッケージを対象にします。
npm ls @better-auth/expo better-auth -
2
修正版1.7.16へ更新する
@better-auth/expoとbetter-authを、1.7.16以降に上げます。ロックファイルを更新し、本番とステージングの両方に反映します。更新の影響範囲は、ベンダーのリリースノートで確認してください。
-
3
更新後にアプリケーションシークレットを入れ替える
ベンダーは、修正版へ更新したあとにアプリケーションシークレットをローテーションするよう求めています。更新前に不正に署名された値が有効なまま残る可能性があるためとみられます。入れ替えると既存のログインに影響が出るおそれがあるので、先に検証環境で挙動を確かめ、利用者への影響が小さい時間帯に行うと安全です。
-
4
侵害の跡がないか調べる
公表前から狙われていた可能性は否定できません。メールアドレスが短期間に変更されたアカウント、身に覚えのない再設定の記録、不審なログインがないかを、認証まわりのログとデータベースの更新履歴で確認します。
-
5
ベンダーの告知を確認する
GitHubのセキュリティアドバイザリとv1.7.16のリリースノートに、詳細と追加の対応が書かれている場合があります。更新作業の前に目を通してください。
背景
Better Authは、TypeScriptで書かれたオープンソースの認証ライブラリです。@better-auth/expoは、モバイルアプリ開発のExpoで作ったアプリのログインを、サーバー側の認証と結びつける連携パッケージにあたります。アカウント情報を直接扱う層なので、ここに穴があると、アプリ側の作り込みでは防ぎにくくなります。
stateは、ログインの往復でリクエストの正当性を確かめるためによく使われる値です。そのため、サーバーが署名するのは自分が発行した値だけでなければなりません。今回の脆弱性は、その前提が署名の場面で抜けていたものです。
よくある質問
Q.Expoを使っていないBetter AuthのWebアプリも影響を受けますか。
まだ分かっていないこと
- 公表されたばかりのため、実際の攻撃で悪用されたかどうかは分かっていません。
この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 修正版 |
|---|---|---|---|
| better-auth | better-auth |
1.7.16 未満 |
1.7.16 |
| better-auth | Better Auth |
1.7.16 未満 |
1.7.16 |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
@better-auth/expo before 1.7.16 allows certain account-takeover outcomes (e.g., unauthenticated changes of any account's email address), because it signs a caller-supplied state value without checking whether that value had been issued by the server. NOTE: the application secret must be rotated after updating to a fixed version.
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory
参照URL
- advisory github.com
- advisory nvd.nist.gov
- advisory github.com
- web github.com
- web github.com
- web github.com