ワイヤレスデバッグを有効にし、ノートPCを接続すると、VPNが有効なままでもセッションは動作し続けました。これは何かがトンネルをすり抜けたように見えます。ほぼ確実にそうではありません。デバッグセッションとアプリのWebサイトへの要求は別のネットワーク関係であり、トンネルを越えるべきはその片方だけです。

私はこの誤読に二度出会いました。一度はスマートフォンとノートPCが同じWi-Fiにいたとき、もう一度は再起動後もペアリングが残っていたときです。どちらの場合もVPNは設定どおりに動作していました。

バグに名前を付ける前に観測に名前を付ける

リークの主張の前には三つの出来事があり得て、それらは置き換え可能ではありません。ツールがサービスを発見することも、端末がワークステーションを承認することも、承認済みセッションが実際にコマンドとバイトを運ぶこともあります。どれを見たのかを書き留めてください。それぞれは人が思うほど多くを証明しません。

発見は通常mDNSかポートスキャンです。ペアリングはスマートフォン側で行う登録の判断で、ユーザーが入力するコードで確認されます。生きたセッションは、ペアリング済みの二つの端点の間で通信が動いたことを意味します。そのどれも、アプリのHTTPS要求がどこへ行くかは説明しません。

宛先、インターフェース、アドレスファミリー、タイムスタンプ、ユーザープロファイルをその出来事に結び付けておいてください。これらの詳細がなければ、その観測を意図したローカルネットワークの方針や、当時動作していたVPNビルドと比較できません。

二つの経路が決して交わらない理由

ワイヤレスデバッグは端末への内向きの接続です。adbdはWi-Fiインターフェースに結び付いたポートで待ち受け、ペアリング後にワークステーションがそこへ接続します。方向が重要です。ノートPCがスマートフォンの中へ入るのであって、その逆ではありません。これは外向きのリークとは正反対です。

アプリのインターネット通信は、VpnServiceが導入するトンネルインターフェースから出て、UIDとルーティング規則で照合されます。adbdはshellユーザーとして動作するシステムデーモンであり、そのルーティング集合に含まれるアプリではありません。すべてのアプリがトンネルに固定されていても、adbdは下位のWi-Fiリンクにとどまります。

ロックダウンモードは対象アプリにトンネルを強制しますが、待ち受けソケットを出口経路に変えるわけではありません。

だからこそ、動作するADBセッションと動作するキルスイッチは矛盾なく共存します。リークを証明するには、遮断されるべき方向を観測する必要があります。

外向きテストの実際の姿

デバッグ経路ではなく、対象アプリをテストしてください。失敗条件を意図的に作り、そのうえで新しい要求を一度だけ行い、何が起きたかを記録します。

  1. VPNだけが経路であることを確認します。常時接続VPNを有効にし、VPNなしの接続をブロックします。
  2. サポートされた方法でVPNを停止し、アプリが接続なしと報告することを確認します。
  3. そのアプリから無害な要求を一度送り、失敗するか成功するかを記録します。
  4. ワイヤレスデバッグを有効にした場合と無効にした場合で繰り返し、変数を切り分けます。

その条件下で遮断された要求は証拠です。成功したADBセッションは証拠ではなく、ターミナルアプリからの一度のpingも同様です。

ロックダウンが有効なのに要求が成功した場合は、アプリのUIDとそのVPN許可、有効なネットワーク、クライアントのバージョンを記録してください。その組み合わせが本当の発見です。

ペアリングはセッションより長く残る

ペアリングは永続的な状態であり、ケーブルテストの後に忘れてよいハンドシェイクではありません。Androidのデバッグのドキュメントはワイヤレスの手順を説明し、明示的に忘れるか承認が取り消されるまで関係が続くと記しています。

トンネルを責める前に、何がまだ承認されているかを確認してください。ワイヤレスデバッグを開き、ペア設定済みのデバイスを見て、もう心当たりのないものは忘れてください。ワークステーションからadb devicesを実行して、どの項目がまだ応答するかを確認し、adb disconnectで古いものを外します。ワイヤレスデバッグをオフにすると待ち受けポートは完全に閉じます。

共有または信頼できないネットワークでは、オフのままにしてください。管理していないネットワーク上の永続的な承認は、仮定のTUNバイパスより大きな問題です。

そのバグを報告する前に

有用な報告は、失敗した正確な境界を名指しします。端末のモデルとAndroidのリリース、VPNクライアントとバージョン、ロックダウンが有効だったか、アプリのパッケージとUID、スマートフォンが接続していたネットワークを含めてください。観測を生んだコマンドまたは要求と、発生時刻も加えます。これがなければ、壊れていると主張する境界を誰も再現できません。

テストを劇的に見せるために、強制を無効にしたり信頼できないネットワークでデバッグを公開したりしないでください。それは測定対象のシステムを変え、誰も再現できない証拠を残します。

VPNが有効な間にADBが接続したことだけが証拠なら、間違った経路を測っています。まずアプリ層のテストを再実行してください。答えはたいていそこにあります。

関連記事