1月22日、15歳の高校3年生ハッカー、daniel(Hackermondev)氏が「Unique 0-click deanonymization attack targeting Signal, Discord and hundreds of platform」と題した記事(GitHub Gist)を公開した。この記事では、CloudflareなどのCDNのキャッシュ機能を悪用し、ユーザーの大まかな所在地を特定可能な0クリック攻撃(いわゆるDeanonymization攻撃)について詳しく紹介されている。
以下に、その内容を紹介する。
Cloudflareのキャッシュ機能を利用した位置情報の特定手法
この記事で述べられている手法を簡潔にまとめると、 「ターゲットに自動でコンテンツを取得させ、そのコンテンツがどのデータセンターにキャッシュされているかを攻撃者が世界各地から問い合わせる」ことで、ターゲットがどのエリアにいるかを逆算する というものだ。
ここでターゲットになっているCloudflareは、世界各地に分散配置したデータセンターを使い、利用者の端末から近い場所でコンテンツをキャッシュすることで高速化を実現している。ところが、この仕組みを逆手に取ることで、ターゲットユーザーがアクセスしたリソース(画像やファイルなど)が「どのデータセンターにキャッシュされているか」を調べ、その地理情報をもとにターゲットの所在地を半径数百マイル程度にまで絞り込めるとされている。
どのように「どのデータセンターにキャッシュされているか」を突き止めるのか
ターゲットにコンテンツを取得させる
たとえば攻撃者が用意した画像や、サービス上で自動ダウンロードされる添付ファイルなどのURLをターゲットに読み込ませる。すると、Cloudflare側ではターゲットの近隣にあるデータセンターにコンテンツをキャッシュするか、既存キャッシュを更新する。攻撃者が複数の地域(VPNなど)からリクエストを送る
攻撃者は世界各地に設置されたVPNサーバーに切り替えるなどして、同じURLに対して「このデータセンターでキャッシュがHITするかどうか」を問い合わせる。具体的には、HTTPレスポンスヘッダのcf-cache-status
(HIT/MISS)やcf-ray
(担当データセンターの空港コード)をチェックする。キャッシュHITしたデータセンターを特定する
「北米の特定地域ではHITしないが、ヨーロッパやアジアのある地域ではHITする」といった具合に複数拠点からアクセスし、そのキャッシュ状況を照合する。HITしたデータセンターほどターゲット端末が存在する場所に近いことがわかるため、都市レベル、あるいは200〜300マイル程度の範囲まで位置を推定できる。
キャッシュを問い合わせた結果から大まかな位置情報を取得する
Signalにおける実例
1クリック攻撃
例えば無料で安全なメッセンジャーアプリを謳うSignalでは、画像などの添付ファイルを自動でダウンロードする仕組みを利用することで、このキャッシュ攻撃が成立すると解説されている。
攻撃者が用意した画像をターゲットに送信し、ターゲットのアプリが添付ファイルを開くと、その近隣データセンターにキャッシュされる。その後、攻撃者はURLを複数拠点から問い合わせ、どこでキャッシュHITするかを確認し、ターゲットの所在地を推測できるという。
攻撃手順の例(記事中のReproduction Stepsより)
- 下準備として、攻撃者側が画像をキャッシュしてしまわないよう、リクエストをインターセプトして自分の環境のキャッシュ汚染を避ける。
- ターゲットに対して画像ファイルを送りつける。相手がメッセージを表示すると、自動的に添付ファイルを取得する。
- 攻撃者は世界各地(VPNなどを用いる)から当該ファイルのURLをリクエストし、HITしたデータセンターを特定してターゲットの地域を絞り込む。
0クリック攻撃
さらに、Signalのモバイルアプリがプッシュ通知に画像を含む設定になっていると、ターゲットがアプリを開かずともサーバーから通知画像を取得するため、完全にユーザー操作なし(0クリック)で同じ攻撃が成立すると指摘されている。
Discordにおける実例
DiscordもCDNにCloudflareを採用しているため、Signal同様の問題が生じるとしている。記事では以下のようなシナリオが紹介されている。
- カスタム絵文字や画像の自動取得
Nitro(有料プラン)のユーザーがカスタム絵文字を使ったり、アバター画像を表示する際に自動でCDNからダウンロードされる。 - フレンドリクエスト通知のアバター画像
ターゲットがアプリを起動していなくても、フレンドリクエストが届くと通知に相手のアバターがサムネイル表示される。これはユーザーの操作なしで画像をCDNから取得するため、0クリック攻撃の温床になりうる。
GeoGuesser: 攻撃の自動化
記事では、Discordのフレンドリクエスト機能とユーザーアバターURLを使い、攻撃を自動化する「GeoGuesser」というボットの例が示されている。以下のような手順で動作する。
- 攻撃者のDiscordアカウントで、任意のユーザーにフレンドリクエストを送る。
- フレンドリクエスト通知が飛ぶ際、ターゲットの端末はアバター画像を自動的に取得し、近隣のCloudflareデータセンターにキャッシュされる。
- 攻撃者は世界各地(VPN等)からアバターURLにアクセスし、HITするデータセンターを調べることでターゲットの所在地を推定する。
Cloudflareの対応と現状
記事によると、当初は「Cloudflare Teleport」という仕組み(Cloudflare Workersのバグ経由)で任意のデータセンターに直接リクエストを送れたが、現在は修正された。ただし、VPNなどを利用すれば複数の地域からの問い合わせが依然可能であり、結果として半数以上のデータセンターを探索できるという。
Cloudflareは「コンテンツのキャッシュ設定は各利用サービス側が管理すべき」としており、このDeanonymization攻撃自体をCDNの脆弱性とは見なしていない旨をコメントしている。
サービス側の対応
- Signal
記事によると、Signalは「ネットワークレイヤーでの完全な匿名性を提供するわけではない」という立場を示し、現状は根本的な対策を行っていない。 - Discord
当初は修正を検討したものの、最終的にはCloudflare側のキャッシュ仕様に起因するとして、やはり抜本的な対策は行われていない。
攻撃から身を守るには
ジャーナリストや活動家など、高い匿名性を求める利用者は下記のような点を考慮すべきだとしている。
- プッシュ通知で画像を自動取得する設定をオフにする。
- 公開プロフィールや、相手が一方的に送信できるメッセージ・画像がある環境では、CDN経由のリソース取得に注意する。
- 必要に応じてVPNやTorなど、ネットワークレイヤーでの匿名性を高める手段を導入する。
記事では「CDNのキャッシュが本来想定していなかった形で悪用される可能性」に警鐘を鳴らし、特にプライバシーを重視するユーザーが十分な注意を払う必要性を強調している。
詳細はUnique 0-click deanonymization attack targeting Signal, Discord and hundreds of platform · GitHub を参照していただきたい。