Androidの二つのダイアログは、いつも混同されます。VPNの同意を求める画面と、アプリがあなたのデータに対して求める権限の要求です。前者が渡すのはネットワーク上の位置、つまりパケットを読み取り、書き換えられる地点です。後者が渡すのは、Androidがアプリごとに守っている保存済みの内容です。両者を同じものとして扱うと、トンネルが見られる範囲を誇張するか、あるいは執拗なアプリが次に何を求めるかをひどく過小評価することになります。

同意ダイアログが実際に渡すもの

VpnService を実装し BIND_VPN_SERVICE を宣言するアプリは、端末のVPNになることをシステムに求めます。承認されると、フレームワークは tun インターフェースを作成し、そのファイルディスクリプタをアプリに渡します。その後のアプリの動作はすべてこのディスクリプタを通ります。IPパケットを読み出し、どう扱うかを決め、パケットを再び書き戻します。

そのインターフェースの範囲は明示されています。どの宛先を取り込むかはルートが決め、どのアプリがそこに流し込むかは addAllowedApplication や addDisallowedApplication が決めます。二つのアプリだけを挙げたアプリ単位のVPNは、端末の残りを見ることはありません。

これはパケット単位の付与であって、データ単位の付与ではありません。サービスが見るのは、アプリがネットワークスタックに渡すバイト列であり、それは宛先に向けられたものです。送信元アプリのプライベートストレージ、データベースファイル、復号済みのメモリには手が届きません。アプリが自分のサンドボックスに保存したファイルは、以前とまったく同じだけ読み取りにくいままです。

パケットの視界が止まる場所

TLSはトンネルの中でも役目を果たします。ハンドシェイクはアプリとサーバーの間で行われ、アプリとVPNの間では行われないからです。VPNはセッション鍵なしには復号できない暗号文を転送します。だからトンネルだけでは、HTTPSページや保護されたメールセッションの中身は明らかになりません。

暗号文の周りのメタデータは別の話で、ここで多くの自信に満ちた主張が崩れます。宛先IP、ポート、パケットサイズ、タイミングはすべて見えます。さらに TLS ClientHello の中のサーバー名も見えます。これは通常、TLS 1.3 の下でも平文で送られます。Encrypted Client Hello はこれを変えますが、普及しているわけではありません。暗号化されていない問い合わせが出ていくとき、通常のDNSも同じくらい簡単に名前を漏らします。

古いプロトコルや設定を誤ったプロトコルは、さらに多くを渡します。平文のHTTP、TLSなしのIMAP、そして数々のゲームやIoTのプロトコルは、tun ディスクリプタを持つものすべてに中身を晒します。

決して一緒に付いてこない権限

VPNを承認しても、連絡先、SMS、写真、メディアストアが承認されるわけではありません。それらは別個の実行時権限であり、それぞれに独自のダイアログと、アプリの設定ページにおける独自の取り消し経路があります。通話履歴を求めるVPNクライアントは、他のどのアプリとも同じようにそれを求めなければならず、あなたはトンネルを残したまま断れます。

注意すべきは証明書のインストールです。VPNの設定の一部に見えますが、そうではありません。ユーザーCAを認証情報ストアにインストールすると、Androidが受け入れる証明書が変わります。そして Android 7.0 以降、API 24 以降を対象とするアプリは、ネットワークセキュリティ設定でユーザー信頼アンカーを選ばない限り、ユーザーが追加したCAを無視します。CAを強く求めるクライアントは、正当な企業内の傍受を行っているのかもしれませんし、VPNのダイアログが一度も触れなかった何かを求めているのかもしれません。

アクセシビリティのアクセスはさらに外側にあります。アクセシビリティを有効にしたサービスは他のアプリの画面内容を読めますが、それはパケット単位の位置では決して得られません。

ローカルのフィルターか、遠隔のゲートウェイか

同じAPIが、信頼の水準を異にする二つの製品を覆っています。端末上のファイアウォールや広告ブロッカーは tun ディスクリプタを受け取り、通信にローカルで応答し、自分が運用するサーバーへは決して送りません。本物のトンネルはそのパケットをどこか別の場所のゲートウェイへ転送し、その運営者は反対側から同じメタデータを見て、何が戻るかも決めます。

両者を見分ける実用的な方法は、VPNをオンにした状態とオフにした状態で自分の公開アドレスを確認し、通知が遠隔のエンドポイントを示しているかを見ることです。アドレスがまったく変わらないなら、通信はおそらく端末内で折り返しています。

どちらの場合もパケット上の位置であることに変わりはありません。違いは、出口に他に誰が立っているかです。

自分が承認したものを監査する

設定を開き、次にネットワークとインターネット、次にVPNを開き、ステータスバーのアイコンではなく項目そのものを読みます。常時接続VPNとVPNなしの接続をブロックは、インターフェースを生かし漏洩を断つ端末設定であり、何かを広げるものではありません。同じ画面からプロファイルを削除し、付与を取り消せます。

続いて他の権限をたどります。アプリ情報にはクライアントが持つ実行時権限が表示され、セキュリティ設定には同時にユーザー証明書がインストールされたかが表示されます。どちらも独立して削除できます。

答える価値のある問いは狭いものです。どのパケットがこのサービスに入り、どこへ行き、実装が何を保持するのか。ダイアログのその他の部分は雑音です。VpnService のリファレンスが、このインターフェースが何を公開するかの権威ある一覧です。

関連記事