Androidの接続チェックトラフィックの漏洩
VPN業者のhttps://mullvad.netからセキュリティ関連アナウンスがあったので、翻訳してみる。
なお、Androidでは、ここで上げられた点のみが問題なのではなく、より大きな途方もないプライバシー侵害が行われていることに注意したい。これは、AndroidやiPhoneを使う限り避け得ないものだ。その概要は当記事最後の動画にある。
mullvad.netによるレポート
Android leaks connectivity check traffic
当社のアプリ(注:mullvad.netのサービスに付属するクライアント用アプリと思われる)の継続的なセキュリティ監査により、VPNサービスでは防げない特定のトラフィックをAndroidが漏洩していることが確認された。監査報告書は近日中に公開される予定だ。この投稿は、MUL22-03と呼ぶこの発見を掘り下げることを目的とする。
我々は、報告された漏洩を調査し、AndroidがVPNトンネルの外側に接続チェックを送信していると結論付けた。これは、デバイス(注:スマフォ)がWiFiネットワークに接続するたびに行われ、「VPN以外の接続のブロック」設定が有効の場合でも行われる。
(注:
そもそもVPN以外の接続のブロックの設定であれば、この場合にはmullvad.netの出口サーバ以外には、いかなる情報も漏洩しないはずだった」
設定>ネットワークとインターネット>VPNで以下の設定
)
Androidシステムがなぜこのトラフィックをデフォルトで送信したいのか、その理由はわかっている。例えば、ネットワーク上にキャプティブポータル(注:キャプティブポータルとは)がある場合、ユーザーがそれにログインするまで、接続は使用できない。そのため、ほとんどのユーザーが望むことは、キャプティブポータルのチェックが行われ、ポータルが表示および使用できるようになることだろう。しかし、これは特定の脅威モデルを持つ一部ユーザーにとっては、プライバシーに関する懸念となり得る。Androidがこのトラフィック漏洩を止める方法はないようで、我々は、Android issue trackerで報告した。
たとえVPNトンネルの外に出るトラフィックに問題がなくとも、この設定の名前(「VPN以外の接続のブロック」)とAndroidのドキュメントは誤解を招くと考えられる。ユーザーが受ける印象は、VPNを経由しない限り、スマフォからトラフィックが出ないというものだ。このため、我々は別の問題を報告し、Androidドキュメントの改善を提案した。
再現手順
- システム設定で、「常時接続VPN」と「VPN以外の接続のブロック」が有効になっていることを確認する。
- WiFi を切断する。
- ルーターで tcpdump を実行するなどして、Android デバイスとのネットワークトラフィックの監視を開始する。
- WiFiに接続する。
- このトラフィックには、VPNトラフィックに限らず、DNSルックアップ、HTTP(S)トラフィック、そして潜在的にはNTPトラフィックも含まれることを確認する。
比較対象として、プライバシーとセキュリティに焦点を当てたAndroidベースのディストリビューションGrapheneOSは、接続チェックを無効にするオプションをユーザーに提供している。このオプションが有効な場合、上記リークは観察できなかった。
プライバシーへの配慮
接続確認トラフィックは、接続確認サーバーを制御する当事者およびネットワークトラフィックを観測するあらゆる者によって観測および分析される可能性がある。メッセージの内容が「あるAndroidデバイスが接続された」以上のことを明らかにしない場合でも、メタデータ(送信元IPを含む)は、特にWiFiアクセスポイントの位置などのデータと組み合わせた場合、さらなる情報を導くのに使える。しかし、このような匿名化解除の試みは、かなり高度な技術を必要とするため、我々のユーザーの多くは、おそらくそれを重大なリスクと見なすことはないだろう。
結論と提言
リークを修正するためにアプリでできることは何も無い。しかし、ユーザーにその存在を知らせ、Androidオペレーティングシステムの制限について透明性を確保することはできる。これにより、誰もが十分な情報を得た上で判断することができる。
最後に、GrapheneOSのような接続チェック無効機能を、Androidの純正品に採用することをGoogleに提案する。
GrapheneOS側の反応
https://twitter.com/GrapheneOS/status/1579616922450395136
接続チェックは、AOSPで使用される4つのGoogleサービスのうちの1つである。我々は、デフォルトでこれらの4つのサービスをGrapheneOSのサービスに置き換え、トグルで無効にしたり、標準のGoogleサーバを使用することができる。接続チェックは低レベルのもので、各ネットワーク上で実行され、動作するかどうか否かをチェックするものだ。
(注:
GrapheneOSでは、設定>ネットワークとインターネットに以下がある。
)
接続チェックは特殊なケースである。VPN使用の場合でも、各基盤となるネットワークがインターネットに接続しているかどうかを検出する必要があるからだ。
VPNを使っていて、GrapheneOSを使用していることを隠したい場合は、接続チェックのトグルをStandard(Google)に切り替えてほしい。
我々はまた、接続チェックのための第3の「無効」オプションも用意している。これによって、ネットワークがインターネットに接続されるまでは以下をサポートしない。作業中のネットワークへの自動切り替え、OSからのキャプティブポータルの処理、インターネットに依存するスケジュールジョブの遅延である。この選択はユーザに委ねられる。
VPNを使っていて、通常のAndroidデバイスとしてふるまいたい場合は、Standard (Google) オプションが最も適している。接続チェックは、AndroidのJava標準ライブラリでHTTPSとHTTP GETリクエストを行い、標準的なフローズン・ユーザー・エージェント(注:意味不明)で 204レスポンスコード(注:No Content)を探すだけでである。
GrapheneOS が行うデフォルト接続の完全なリストは、https://grapheneos.org/faq#default-connections にある。
Private DNSを自動に設定している場合、ネットワークが提供するDNSでDoT経由でランダムなサブドメインを解決することをテストしている。それに関するメモをページに追加するかもしれないが、これはDNSの一部である。
また、アプリのリンク認証に関するセクションも読んでほしい。
https://grapheneos.org/usage#app-link-verification
アプリリンク検証では、ドメインがデフォルトでアプリへのリンク処理を委ねることができる。例えば、https://youtube.com/.well-known/assetlinks.json は、YouTubeアプリを認証する。NewPipeの場合、ユーザーは手動でこれを有効にする必要がある。
安全でないネットワーク時間を置き換える以外に、我々はこれらのサービスを置き換えることを重要視していない。プライバシーとセキュリティを大幅に向上させるという私たちの中核的な焦点から外れているからだ。我々がAndroid 13で提供するほとんどの改良点の概要については、https://grapheneos.org/features を見てほしい。