あるセキュリティ研究者が技術論文を公開し、Android 16にVPN保護を実質的に回避してしまう脆弱性が混入しており、すべてのVPNアプリに影響することを明らかにした。「常時接続VPN(Always-On VPN)」や「VPNなしの接続をブロック(Block connections without VPN)」の設定を有効にしているかどうかは関係ない。
Android 16は、VPNで保護されたトンネルの外へ通信を漏洩させ得る。つまり、実際のIPアドレスがインターネット上で可視化され、追跡や監視につながり得る問題が発生する。
しかも、ここからが肝心だ。研究者はこの脆弱性をAndroid Vulnerability Reward Programを通じて報告したものの、グーグルは脅威モデルの範囲外だとして問題をクローズし、「修正しない(Won't Fix)」と判断した。
Android 16のVPN脆弱性を読み解く
この問題に私の注意が向いたのは、チューリッヒを拠点とするセキュリティ研究者のYusefが、Xで@cybaqkebmとして、次の短い投稿をしたときだった。「Androidの『常時接続VPN』と『VPNなしの接続をブロック』は、どうやらそれほど信頼できない」。投稿に貼られていたリンクは、Android 16のVPNバイパスに関する極めて技術的なレポートへとつながっていた。
要点はこうだ。上述の2つの設定は、確立済みのVPNトンネルの外へ端末から一切の情報を出さないことを厳格に保証する目的で用意されているはずだが、実際にはそうではない。
グーグルは、悪意あるVPNの危険性について以前から警告し、「VPNアプリは公式ソースからのみダウンロードし、Google PlayでVPNバッジのあるアプリを確認する」よう利用者に助言してきた。そのため、この問題は非常に深刻に受け止められるべきだと思うかもしれない。
だがYusefは、AndroidのVRPを通じて脆弱性を報告した後、確認したとしてこう述べている。「どうやら、彼らの脅威モデルに入っていないようだ」。実際、この問題はWon't Fix(実現不可能)としてクローズされた。
さらに、Mullvad VPNのアラートによれば、アプリベンダーもAndroidのイシュートラッカーでこの問題を報告したという。これは重要な点だ。Mullvadは、この脆弱性がAndroid 16プラットフォーム上の「あらゆるVPNアプリ」に影響すると指摘しているからである。
技術的な概要を「TL;DR(要約)」で示すと、Yusefは次のように述べた。
ConnectivityManager上のBinderメソッドregisterQuicConnectionClosePayloadは、任意のバイトバッファとUDPソケットを受け付ける。呼び出し元に必要なのはINTERNETとACCESS_NETWORK_STATE(いずれも自動付与)だけだ。
登録されたソケットが死ぬと、system_serverがそのソケットの元のネットワーク上でバッファを送信する。権限チェックなし、ペイロード検証なし、呼び出しUIDのVPNロックダウン状態の認識もない。fwmarkサーバーをすり抜ける少し小粋なトリックを1つ使えば、攻撃者アプリはこの原始的な仕組みを利用して、稼働中のVPNを迂回しユーザーの実IPを漏洩させられる。
つまり悪意あるアプリは、使用しているVPNアプリが何であれ、またAndroid 16のVPN構成がどれほど厳格であれ、VPNトンネルの外へ通信を送信できるということだ。



