すべてのプライベート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設計時には内部状態の決定論的露出に注意
- 小さな修正で大きなプライバシー回復が可能
- プライバシー重視ブラウザ開発者への重要な教訓