アプリ内ブラウザ(WebView)とトークンの受け渡し

技術の仕組み | アプリの落とし穴

← 技術の仕組み

WebViewは、アプリの中に埋め込まれたブラウザです。見た目はWebページですが、それを表示しているのはアプリ本体。だから通常のブラウザと違い、アプリ側が表示中のURLや受け渡される値を覗ける・介入できる。ここで「呼び出し元URLの先頭だけを確認する」ような甘い検証を挟むと、トークンを横取りされます。

先に押さえる

普通のブラウザは、サイトごとに厳密な壁(同一オリジン)があります。ところがWebViewはアプリが内側に持つ画面なので、アプリと表示中Webの境界が曖昧。アプリはWebViewの今のURLを読めるし、値の受け渡しにも割り込めます。「誰の画面で、誰が値を扱っているか」を意識するのが起点です。

トークンが渡る流れと、検証の穴

1WebView内でログイン → トークンがURLで戻る
アプリ内のWebView
戻り先URLにトークンが載って返る
アプリ本体URLを読み取れる
2「先頭一致だけ」の検証は途中で破れる
正規URLの先頭:https://正規ドメイン/…
先頭が一致すればOK、という判定
細工URL先頭は正規に見せ、実際の宛先を攻撃者側へトークンを奪う

URLの先頭が正規ドメインかだけを見る検証は、その後ろに別の宛先を紛れ込ませる細工で通ってしまいます。結果、正規のふりをした画面にトークンが渡り、横取りされます。

動きで見る

アプリ内ブラウザで認証し、戻ってきたトークンをネイティブアプリへ受け渡す流れを追うと、ホスト側アプリがブラウザ内を覗ける=穴と、それを受け取り側の検証で塞ぐ要点が見えます。(図は横スクロールできます)

見抜きどころ

甘い検証は「先頭一致」。正しくは宛先ドメインを厳密に確定する――たとえば末尾まで含めて区切り(/)で閉じて比較し、「正規ドメインの直後が区切りである」ことまで確かめます。「どこまでを一致とみなすか」を曖昧にしないのが急所です。

つまずきやすい

「HTTPSだから安全」ではありません。TLS途中で読まれないことを守るだけで、トークンを渡す相手が正しいかは別問題。WebViewではアプリが相手を取り違えないURL検証が守りの中心になります。

攻撃と対策をひと目で

攻撃・リスク

  • ホスト側アプリがアプリ内ブラウザの中を覗けるため、コード/トークンを窃取・すり替えできる
  • リダイレクト先の取り違え(先頭一致など甘い突き合わせ)で、別アプリ・別ドメインへトークンが渡る
  • 「HTTPSだから安全」の思い込み(=経路の秘匿と渡す相手の正当性は別物)

効く対策

  • 宛先ドメインを区切りまで含めて厳密に確定(先頭一致にしない)
  • 受け取ったトークンの発行先・用途・宛先・署名を検証してから使う
  • 機微なトークンをアプリ内ブラウザに晒さない受け渡し設計(外部ブラウザ/システム連携の利用)

つながる仕組み

渡す中身→ OAuthとアクセストークン 別の層→ TLS通信の傍受と復号

この仕組みを使う設問