世界を動かす技術を、日本語で。

すべてのプライベートTorアイデンティティを結びつける安定したFirefox識別子を発見しました

概要

  • Firefox系ブラウザにおける IndexedDBの順序性漏洩によるプライバシー脆弱性 の発見
  • サイト間で 安定したプロセス単位の識別子 を導出可能
  • Private BrowsingやTor Browserでも セッション切断後も識別子が持続
  • Mozillaは Firefox 150/ESR 140.10.0 で修正済み
  • 修正方法は返却順序の正規化 による情報漏洩防止

Firefox系ブラウザのIndexedDB順序性漏洩によるプライバシー脆弱性

  • IndexedDB API の返却順序が、 内部ストレージ構造 に由来する識別子として機能
  • サイトは 複数のIndexedDBデータベース を作成し、返却される順序を観察することで 一意かつ安定した識別子 を得ることが可能
  • この識別子は プロセス単位 で共有され、 異なるorigin間でも同一識別子 が観測可能
  • Private Browsingモード ではウィンドウを全て閉じても Firefoxプロセスが継続している限り識別子が持続
  • Tor Browser では「New Identity」機能でも識別子がリセットされず、 完全な匿名性が損なわれる

脆弱性の技術的詳細

  • IndexedDBの内部実装 (ActorsParent.cpp)で、Private Browsing時のデータベース名は UUIDベース でグローバルなハッシュテーブルに格納
  • UUIDのマッピングは プロセス全体で共有 され、 完全なブラウザ再起動時のみクリア
  • indexedDB.databases() 実行時、データベース名のリストは ハッシュセットの内部順序 で返却され、 安定した順序 となる
  • この順序が サイト間で一致 し、 プロセス終了まで持続
  • 証明方法 として、異なるオリジンで同一スクリプトを実行し、順序が一致することを観察

プライバシーへの影響

  • クロスオリジン追跡 :異なるサイト間で同一プロセスかどうかを識別でき、 活動のリンク が可能
  • 同一オリジン追跡 :Private Browsing後の再訪問でも 識別子が残存 し、 完全なセッション切断 が実現できない
  • Tor Browser では「New Identity」後も識別子が持続し、 期待される分離性が破綻

エントロピーと識別能力

  • サイトが制御できるデータベース名数Nに対し、 N!通りの順序 が得られ、理論上 log2(N!)ビットのエントロピー
  • 16個のデータベース名で 約44ビット の情報量、 実用上十分な識別力

修正方法とセキュリティ上の教訓

  • 内部ストレージ順序に由来するエントロピーの排除 が必須
  • 返却リストを正規化(例:辞書順ソート) することで識別子化を防止
  • APIの有用性 を損なわず、 開発者にとって予測可能かつ安全
  • Mozillaは迅速に修正 (Firefox 150/ESR 140.10.0、Bug 2024220)
  • Geckoベースの他ブラウザ (Tor Browser含む)も同様の修正が必要

プライバシー設計への示唆

  • 実装上の些細な挙動深刻なプライバシー問題 に発展する可能性
  • API設計時には内部状態の決定論的露出に注意
  • 小さな修正 で大きなプライバシー回復が可能
  • プライバシー重視ブラウザ開発者 への重要な教訓

Hackerたちの意見

TorのユーザーはほとんどがTor Browserを使ってるんじゃないかな。Mozillaに対して責任ある開示があったって読んだけど、そのセクションにはTor Projectがいつ対応する予定なのか、修正されたTor Browserをリリースするのかが書いてない気がする。彼らはすごく密に連携してるのか、それとも大きなタイムラグがあるのかな?

Tor Browserはいつも最新のFirefox ESRにすぐに基づいてアップデートするよ。次の日にアップデートをリリースしたみたいだね: https://blog.torproject.org/new-release-tor-browser-15010/

すごく面白い研究で、素晴らしく書かれてるね。終わりの方で製品の広告があるかと思ったけど、全然なかった!でもちょっと疑問なんだけど、なんでこの会社は自分たちの製品がフィンガープリンティングしてるのに、Mozillaにこの脆弱性を報告したんだろう?競合と差別化するために、脆弱性を秘密にしておく方がビジネス的には良いんじゃないかな(倫理的には良くないけど)。例えば、責任ある開示でゼロデイを燃やす悪意のあるアクターってあんまり見ないよね!

彼らはそれに依存してないと思うし、開示するってことは他の人もできないってことだよね。

私たちは自社の製品に脆弱性を利用していません。

Tor BrowserはデフォルトでJavaScriptを許可してるのかな?もしJavaScriptの実行をブロックしたら、影響を受けないって聞いたんだけど。

実際、JavaScriptを無効にするとフィンガープリンティングが大幅に増えるよ。あんまりユーザーがそれをオフにしないから、すぐにユニークな存在になっちゃうんだ。確かに、JSがないと他の詳細を集める選択肢が制限されるけど、JSなしでユニークになるのは今はずっと楽だよ。Tor Browserは理由があってnavigator.platformを全く偽装しないから、User-AgentがWindowsを偽装してても、Linuxを使ってるのはバレちゃうんだよね。

これを聞く限り、ブラウザを再起動しても持続しないってことかな?それだと攻撃者にとっての有用性がかなり減ると思う。

でもそうかな?国家機関はすでにすべてのノードを知ってるか、知ってるかもしれないよね。たくさんのメタ情報が相互にリンクされてると、彼らはかなり正確に人を特定できると思うし、常に100%の精度が必要ってわけじゃないかもしれない。周囲の情報を使ったり、壁を通して嗅ぎ取ったりすることを考えてたんだけど(確か?記事をあんまり覚えてないけど、過去3〜5年の間にそんな記事があったよね?)。要は、ターゲットユーザーだけに関係なく、できるだけ多くの情報を集めるってことだと思う。例えば、「プロキシ情報で特定する」って呼ぶかな。

多くのユーザーはブラウザを何ヶ月も開いたままにしてるよ。

ここでIDブリッジングを使うんだ。1. ウェブサイトがブラウザをフィンガープリンティングして、IDとフィンガープリンティングを含むクッキーを保存する。2. 次のセッションで再度フィンガープリンティングして、クッキーと比較する。フィンガープリンティングが変わってたら、サーバーに古いフィンガープリンティングと新しいフィンガープリンティングを通知する。

この記事の抜粋はリスクをよく説明してるね。 > 「Firefoxのプライベートブラウジングモードでは、Firefoxプロセスが動いている限り、すべてのプライベートウィンドウが閉じられた後でも識別子が持続する可能性があります。Torブラウザでは、安定した識別子が「新しいアイデンティティ」機能を通じても持続します。これはクッキーやブラウザの履歴をクリアし、新しいTor回路を使用するための完全なリセットを目的としています。」

ちょっと混乱してるんだけど。IndexedDBのUUIDは「すべてのオリジンで共有されてる」ってことだから、順序じゃなくてデータベースの内容を使ってブラウザを特定すればいいんじゃないの?

コンテンツは明らかにオリジンにスコープされてるよね。そうじゃないと、IndexedDBは単なるトリビアルなエバークッキーになっちゃう。

ページには教育的な例があるよ。例えば、あるページがデータベース a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p を作成して、その順序をクエリしたとする。例えば、g,c,p,a,l,f,n,d,j,b,o,h,e,m,i,k みたいな順序が得られるかもしれない。これはデータベース名とUUIDのグローバルマッピングに基づいてる。ここでの重要な脆弱性は、そのFirefoxプロセスの間、あらゆるウェブサイトがそのデータベースセットを作成すれば、データベースの内容に関わらず、全く同じ出力の順序を得ることができるってこと。これがフィンガープリンティングになるんだ。時間を超えて持続する安定した高エントロピーの識別子で、データベースの内容が保存されていなくても残る。オリジン間でも共有されるし(内容は共有されないのに)、ウェブサイトのデータが削除された後も保持される。フィンガープリンティングを再取得するためにウェブサイトがする必要があるのは、同じ名前のデータベースを再作成して、その順序を観察することだけなんだ。

UUIDとデータベースのマッピングがブラウザ内でオリジン間で共有されてるんだ。オリジンに関連付けられたデータベースのサブセットだけが、そのオリジンに公開される。

ウェブサイトがユーザーに尋ねたり通知したりせずに、こんな情報にアクセスできるのはどうしてなんだろう。ブラウザも、サーバー(アプリ)が情報にアクセスするためには許可を得なきゃいけないようにすればいいのに。

一番人気のあるブラウザは広告会社が作ってるんだよね。しかも、彼らは最大の競合相手への資金提供もほとんどしてる。だから、何か違うことを期待するのは無理じゃない?

「なんでブラウザは、サーバー(アプリ)がアクセスするための許可を与えられなきゃいけないようにしないんだろう?Androidの電話みたいにさ。残念ながら、Appleはあまり細かいコントロールを与えてくれない。」

つまり、GoogleはChromiumの開発にお金を出してるのは、ただ楽しむためじゃないってことだよね…

ハハ。アプリよりはまだマシだよ。アプリは、Google Playサービスがないようなしっかり守られたシステムでも、想像を超える量の識別子やデバイスの特性にアクセスできるからね。

ウェブを使いやすくすること、フィンガープリンティング、そしてユーザーに何十個、何百個もの権限を要求することの間には微妙なバランスがあります。ブラウザはOSと同じくらい複雑で(実際、ブラウザ自体がOSみたいなものですから)、システムのどの部分も意図せずに露出して悪用される可能性があります。

正直言って、ウェブ標準のほとんどはフィンガープリンティングに使われてる気がする。実際にデータを保存するためにIndexedDBを使ってるサイトなんて、ほんの一部だと思うし(そもそも誰が必要としてるの?)。だから、ウェブ標準の拡張は間違ってるんだよね。ブラウザはデバイスとやり取りするための最小限のAPIを提供すべきで、IndexedDBみたいな機能はWebAssemblyライブラリとして実装すれば、貴重なデータが漏れないんじゃないかな。例えば、canvasが画像バッファへのアクセスだけを提供して、プラットフォーム特有のライブラリを呼び出す描画ルーチンがなければ、フィンガープリンティングには役立たなくなるはず。

「Local Storage Editor」みたいなブラウザ拡張を使えば、ウェブサイトのローカルストレージの中身を見られるよ。今のところ、長寿命の画像(例えばGmailの画像)をキャッシュするために使われてたり、クッキーの代わりにログインする別の方法として使われてるのを見たことがある。

OPのリンクはTorでタイムアウトしちゃったけど、Wayback[1]のバージョンは問題なく読み込めたよ。それと、この問題に焦点を当ててる学術界の研究者を知ってる人いる?EFFにはこのテーマに関してかつてペドフィリアの名前がついてたプロジェクトがあるのは知ってるけど、NGOで活動してる人たちよりも、大学の教授やMSRやPARCみたいな純粋な研究所の人を探してるんだ。プライバシーオタクとして、このテーマに魅了されてるんだよね。拡張機能のnoscriptやublock origin、firefoxコンテナ(私たちの個人的な「聖なる三位一体」)を使ってセキュリティは得られるけど、フィンガープリンティングの問題で匿名性が逃げちゃう感じ。特にスタイロメトリーを「フィンガープリンティング」の大きなバケツに入れちゃうとね。 [1] https://web.archive.org/web/20260422190706/https://fingerpri...

識別子は、Firefoxプロセスが動作している限り持続することもあります。セッションの終わりにはTorブラウザを必ず終了させてください。一つのセッションで二つの使い方を混ぜないようにしましょう。