速報

日本郵便UGXの送り状システムにサイバー攻撃 越境EC配送は全宛先で停止

CATEGORY

Better AuthのExpo連携で認証回避|更新後に旧署名の失効を確認

※本ページのリンクにはプロモーションが含まれています。

モバイルの認可要求を受けるサーバーが未発行の値を拒否し、署名に使う秘密鍵を切り替える概念イラスト

この記事のポイント

脆弱性
CVE-2026-121802
深刻度

CRITICAL9.1

対象
Better Authとサーバーで登録したExpo連携プラグイン(@better-auth/expo)
悪用状況
不明
推奨対応
両パッケージを修正版に更新し、対象経路に到達できた環境では秘密鍵を切り替え、旧署名が拒否されることを確認してください。
公表日

目次

Better AuthのExpo連携を使うサーバーでは、公開されたがサーバー自身の発行していない値に署名し、第三者によるアカウントの乗っ取りにつながる問題が修正されました。開発元が11月3日に公表した個別勧告 GHSA-4wq4-2ppv-q3hgによると、対象版のサーバーでExpoプラグインを登録している場合は、better-auth本体と@better-auth/expoをそろえて更新してください。脆弱なへ到達できた環境では、更新後にアプリケーションのも切り替えます。

この署名の問題は、11月4日にCVE-2026-121802としても掲載されました。問題があるのは、モバイルアプリに組み込んだログイン画面そのものではなく、ブラウザーへの受け渡しを助けるサーバー側の処理です。同じ認証をWeb版とモバイル版で共有していれば、モバイル向けに追加した経路が、Web版でも使うアカウントに影響します。アプリストアへの再申請やクライアントの配布を待つ前に、現在トラフィックを処理している認証サーバーを調べる必要があります。

スポンサーリンク

サーバーでexpo()を登録しているか

開発元は、サーバーで@better-auth/expoのexpo()を登録する構成を影響判定の出発点にしています。Expo向けの影響範囲は1.4.0-beta.6以上かつ1.7.16未満、または1.8.0-beta.0以上かつ1.8.0-beta.5未満です。修正版は安定系列の1.7.16と、ベータ系列の1.8.0-beta.5です。個別勧告には本体パッケージの範囲も載っていますが、本体の版だけでこのExpo経路の有無は決まりません。依存関係とサーバーのプラグイン登録を両方確認します。

具体的には、モノレポのモバイルアプリ側だけでなく、認証ハンドラーを構成するファイルと、認証サービスが使うを開きます。開発環境と本番でプラグインを条件付き登録している場合は、本番の分岐を確認します。で管理していれば、認証サービスのディレクトリで npm ls better-auth @better-auth/expo を使って解決された版を確認できます。ローカルの結果は配備済みコンテナの版を証明しないので、稼働中のリビジョンは別に照合します。

次に、認証APIのベースパス配下にある /expo-authorization-proxy が、どのホスト名から到達可能だったかを調べます。公開Webアプリの同一にマウントされた経路、モバイル専用API、直接アクセスできるオリジン、検証用の別名ホストは分けて考えます。主側だけで制限していても、同じ認証サービスや秘密鍵を使う別の入口が公開されていれば、そちらの履歴も対象です。実際の利用者がExpoログインを使ったかどうかより、攻撃者が経路を呼べたかが優先です。

なぜ署名が別の認証処理に通ったのか

通常、ソーシャルログインで使うstateは、サーバーが始めた認可処理と戻ってきた応答を結び付ける値です。修正前のプロキシは、呼び出し側が渡した認可URLからstateを取り出し、自分が発行した値かを確認せずに署名付きとして返しました。秘密鍵そのものを攻撃者が読む必要はなく、公開処理に署名を作らせるだけで成立する点が、この問題の要点です。

開発元によれば、同じアプリケーション秘密鍵を使うメール関連のトークンと、Cookieの一部にも署名が通る構造でした。勧告が示す主な影響は、第三者が利用者のメールアドレスを知っていると、その利用者の操作を必要とせずになりすまし、登録メールアドレスを変更できることです。セッションCookieキャッシュを有効にした環境では、利用者IDを知る第三者がその利用者として行動できる経路もあります。後者を使っていない場合も、前者の理由で対応対象からは外れません。勧告の深刻度はCriticalで、 3.1は9.1です。これは攻撃条件と影響の評価であり、被害件数を示す値ではありません。

同じ勧告は、プロキシから任意の外部サイトへ遷移できた問題と、trustedOriginsのワイルドカードが意図した範囲の外に一致し得た問題も扱います。ワイルドカードの問題には実際にワイルドカードを設定していることが条件になりますが、その設定がなくても署名の問題は残ります。修正版はサーバーが発行した有効期限内のstateだけを署名し、遷移先を構成されたプロバイダーの認可エンドポイントのオリジンに制限します。ワイルドカードの照合も、URLを解析してスキーム、ホスト、パスを判定する方式に変わっています。

スポンサーリンク

更新と秘密鍵の切り替えを一つの作業として計画する

Better Authのリリース案内では、今回の配布で12件の問題を修正し、関連するBetter Authパッケージを一緒に更新するよう求めています。本記事が扱うのはExpoの勧告です。認証サービスで使うパッケージを列挙し、採用中の系列のへまとめて上げてロックファイルを更新します。に固定したを使い、配備後はイメージやの識別子を記録して、旧版のレプリカが入口に残っていないことを確かめます。

エンドポイントへ到達できた環境では、開発元は更新後の秘密鍵を案内しています。コードの更新で新たに不正な署名を作らせる経路は塞がりますが、更新前に作られた署名は、旧鍵で引き続き検証できる間は有効になり得ます。新しい鍵を設定したという作業記録だけで終えず、旧鍵で署名された値が対象の検証経路で通らないことを終了条件にします。公式の設定リファレンスにある旧鍵を保持する仕組みは、暗号化データの復号を継続するための設定です。暗号化データの移行と問題のある署名の失効は別々に確認してください。

運用上は、未修正のインスタンスが残ったまま新しい鍵を読ませない順序が重要です。旧版へ新しい鍵を配って公開経路が残れば、その新しい鍵で再び署名を作られる可能性があります。逆に、同じ認証サービスの中で旧鍵と新鍵を使うインスタンスが同時に応答すると、ログインの開始とが別の個体に届いたときに失敗することがあります。配備方式に合わせ、旧版へのルーティングを外し、修正版と鍵の世代がそろった状態で認証を受け付けるようにします。認証を一時停止できない場合は、切り替え前に対象経路を絞れるか検討します。

鍵を変えると、利用者が進行中だったログインを最初からやり直す必要が出る場合があります。Better Authのstate_invalidの説明も、開始とコールバックの間に鍵が変わると状態を復号できない場合があるとしています。運用担当者は、想定される再ログインの案内と、切り替え直後に失敗した利用者への問い合わせ対応を用意します。すでに発行されたセッションや成立したメールアドレス変更を、鍵の切り替えだけで元に戻せるとは考えないでください。

更新前に取れる暫定措置と限界

Expoのソーシャルログインを使っていなければ、開発元はサーバーのexpo()プラグインを外す方法を案内しています。使っている場合の暫定策は、当該経路へのリクエストで、authorizationURL内のstateが英大文字・英小文字・数字・ハイフン・アンダースコアだけの32文字に一致しない場合に拒否することです。プロキシで適用するなら外側のURL全体に対する部分一致で済ませず、実際にサーバーへ渡るパラメーターと同じ解釈で判定できるかを確認します。公式の暫定策が対象にするのは署名の問題だけで、やワイルドカードの修正を代替しません。

認証を止める判断では、経路の遮断とサービス全体の遮断を区別します。経路を使わない環境なら対象機能の無効化を先に検討できます。依存する環境では、入口での一時制限が本来のログインを妨げないか、テスト用のクライアントで確かめます。リリース案内にはVercelでの保護も記載されていますが、開発元はそこでも更新を勧めています。自社運用の環境や別経路にも同じ保護があると仮定しないでください。

スポンサーリンク

更新後は正規のログインと拒否の両方を見る

では、実際に使うプロバイダーごとにExpoアプリからログインを開始し、システムブラウザー、認証API、アプリへの復帰まで一巡させます。続いてWeb版のログイン、メールアドレス変更、ログアウト後の再ログインを確認します。のプロバイダーだけが更新後に失敗する場合、開発元はそのプロバイダーのオリジンをtrustedOriginsに加えるよう案内しています。公式のExpo連携ガイドを参照し、アプリ復帰用のスキームとSSO側のオリジンを区別して、必要なものだけを登録します。動作を戻す目的で広いワイルドカードへ変えると、許可範囲の見直しが難しくなります。

拒否側は、管理下の検証環境と専用アカウントで、期限切れやサーバー未発行のstateが受理されないこと、構成していない外部オリジンへ送られないこと、旧鍵で署名した検証用の値が通らないことを確認します。Cookieキャッシュを有効にしている構成は、その設定を再現した上でセッションの有効性を調べます。や検証記録にCookie、認可コード、署名済みトークンの生値を残す必要はありません。対象経路、時刻、リクエスト識別子、結果コードなどを記録し、利用者データを含まない形で照合します。

過去の到達範囲から調査対象を決める

開発元の個別勧告で確認できるのは、成立条件、影響と修正です。公開されていた自社環境で悪用がなかったかは、手元の記録から別に判断します。まず脆弱な版と設定を使い始めた時期、外部から到達できた期間、修正版への切り替え時刻、旧鍵が受理されなくなった時刻を並べます。入口のログが残る期間と、実際に調査できる期間が一致しなければ、その空白を明示します。

対象経路への普段と異なるリクエストに加え、直後のメールアドレス変更、アカウント復旧、想定外のセッションや管理操作がないかを照合します。認証ログだけでは追えない操作は、アプリ側のや変更履歴と合わせます。単発のアクセスや異常な値だけで侵害を断定せず、同じアカウントに対する操作の時系列を確認します。異常な変更が確認できた場合は、該当セッションの無効化やアカウントの復旧を、通常のに沿って進めます。

作業の完了は、修正版への更新、公開されていた場合の旧署名の失効、正規ログインの再確認を別々に記録して判断します。ログインが戻っただけでは旧署名の拒否を証明できず、旧署名を拒否できたことだけでも更新前に成立した操作の調査は終わりません。Webとモバイルで認証基盤を共有しているなら、両方の担当が同じ切り替え時刻と確認結果を参照できるようにします。

出典・一次情報

本記事は以下の公開情報をもとに作成しています。最新の状況は各リンク先で確認してください。

この記事を書いた人

Ryohei

Webエンジニア / アプリ開発者 / 技術ブログ運営者

福岡のWeb制作会社に勤務するWebエンジニアです。10年以上にわたりWeb制作・開発に携わり、ヒアリングや進行管理から、コーディング、CMSの構築、システム開発、サーバーの構築・保守・運用まで、Webサイト制作の工程を幅広く担当しています。Webサイトは、これまでに100以上の構築・保守を手がけてきました。

個人でもWebサイトの制作・改修やWebアプリの開発・運用を行い、AIを活用した開発にも取り組んでいます。近年はWebセキュリティにも注力しています。

2015年から技術メディア「Into the Program」を運営し、実務や開発で得た知識をもとに、プログラミングの実装方法やWebサイトの運用・セキュリティ情報を発信しています。

主な分野
Webサイト構築・保守・運用 / HTML/CSS / JavaScript / PHP / WordPress / サーバー構築・保守・運用 / アプリ開発 / セキュリティ対策
資格・試験合格
情報セキュリティマネジメント試験
基本情報技術者試験
AWS認定ソリューションアーキテクト アソシエイト
PHP8技術者認定ウィザード
メディア運営
2015年〜

記事の作成・更新について

セキュリティ記事は、ベンダーの公式アドバイザリやCVE・JVNなどの一次情報を参照し、出典と情報確認日を記載します。実環境での検証を行った場合は、その環境と確認範囲を明示します。重要な追加情報や誤りを把握した場合は、内容を確認して追記・訂正します。

あわせて確認したい対策・解説

ほかの脆弱性

関連する記事

おすすめの書籍

キーワードから探す

スポンサーリンク

インシデント対応

セキュリティインシデントが起きたときに、被害の把握・封じ込め・復旧・再発防止までを行う一連の対応。

詳しく見る

監査ログ

誰が、いつ、何をしたかを記録したログ。不正な操作の調査や、操作の正しさの確認に使う。

詳しく見る

アクセスログ

Webサーバーなどが、受け付けたリクエストを1件ずつ記録したログ。日時・接続元IPアドレス・URL・応答の状態などが残る。

詳しく見る

SSO

シングルサインオン。一度のログインで、複数のサービスやシステムを使えるようにする仕組み。

詳しく見る

検証環境

本番環境に反映する前に、変更や更新が問題なく動くかを試すための環境。本番と同じ構成にできるほど確認の精度が上がる。

詳しく見る

WAF

Webアプリケーションへの通信を検査し、SQLインジェクションやXSSなどの攻撃とみられるリクエストを遮断する仕組み。

詳しく見る

リダイレクト

あるURLにアクセスしたとき、自動的に別のURLへ転送すること。サイトの移転やURLの変更で使う。

詳しく見る

OAuth

パスワードを渡さずに、外部のアプリにアカウントの一部の操作を許可するための仕組み(認可の標準)。

詳しく見る

コールバック

ほかの関数に引数として渡し、処理の完了時や出来事が起きたときなどに呼び出してもらう関数。

詳しく見る

ローテーション

パスワードやAPIキー、鍵などを定期的または必要に応じて新しいものに作り直し、古いものを無効にすること。

詳しく見る

デプロイ

作成・修正したプログラムやWebサイトを、本番のサーバーに配置して使える状態にすること。

詳しく見る

依存関係

プログラムが動くために必要な、ほかのライブラリやパッケージとの関係。また、その必要な部品そのもの。

詳しく見る

ビルド

ソースコードなどから、実際に動かしたり配布したりできる形の成果物を作る作業。

詳しく見る

パッチ

ソフトウェアの不具合や脆弱性を修正するための更新プログラム。適用することで既知の問題を解消する。

詳しく見る

HTTPS

HTTPの通信をTLSで暗号化したもの。Webサイトとの通信を盗み見や改ざんから守る。

詳しく見る

CVSS

脆弱性の深刻度を0.0〜10.0の数値で評価する共通の基準。数値が大きいほど深刻度が高い。

詳しく見る

キャッシュ

一度取得したデータを一時的に保存しておき、次に使うときに再利用して処理を速くする仕組み。

詳しく見る

セッション

利用者とシステムの一連のやり取りを、ひとまとまりとして扱う単位。Webでは、ログイン状態などをページをまたいで保つために使う。

詳しく見る

Cookie

Webサイトがブラウザに保存させる小さなデータ。ログイン状態の維持や設定の記憶、アクセス解析などに使われる。

詳しく見る

ドメイン

インターネット上の住所にあたる名前。「example.com」のように、WebサイトやメールアドレスのURLに使う。

詳しく見る

オリジン

Webで、スキーム(httpsなど)・ホスト名・ポート番号の組み合わせ。ブラウザーはオリジンが同じかどうかで、ページ間のアクセスを制限する。

詳しく見る

npm

JavaScript(Node.js)のパッケージを公開・入手・管理するための仕組みとツール。世界最大級のパッケージの公開場所でもある。

詳しく見る

ロックファイル

パッケージマネージャーが、実際に入れた依存パッケージのバージョンを記録するファイル。package-lock.jsonなど。

詳しく見る

パッケージ

ソフトウェアを配布・インストールしやすいように、プログラムと必要な情報をひとまとめにしたもの。npmやComposerなどで管理する。

詳しく見る

API

ソフトウェアやサービスの機能を、ほかのプログラムから決まった方法で呼び出して使えるようにした窓口。

詳しく見る

秘密鍵

公開鍵暗号で、持ち主だけが厳重に保管する鍵。署名や、公開鍵で暗号化されたデータの復号に使う。

詳しく見る

エンドポイント

APIでリクエストを送る先のURL。また、ネットワークにつながるパソコンやスマートフォンなどの端末のことも指す。

詳しく見る

プロキシ

通信の間に立ち、利用者の代わりにリクエストを送ったり受け取ったりする中継の仕組みやサーバー。

詳しく見る

認可

認証で確認した利用者に、どの情報や機能へのアクセスを許すかを決める仕組み。

詳しく見る

認証

アクセスしてきた相手が本人であることを確かめる仕組み。パスワードや生体情報、電子証明書などを使う。

詳しく見る