Privacy ツール
公開IPアドレス・リクエストヘッダー・JavaScriptから読める端末情報から、サイトは実際に何を知るのか。エントロピーの積み上がり方と、HARやURL、トークンを共有する前に落とすべき項目を整理します。
3 ツール
3つの観測者、3つの層
JavaScriptが動く前から、サイトは公開IPを受け取っています。そこだけでASN、粗い地理推定、HTTP/TLSのバージョンが分かり、Cookieは関与せず、経路上のプロキシが既定でログに残します。IPアドレス確認ツールが表示するのはこの層です(IP、都市・地域・国、ISP、ASN、タイムゾーン、エッジPoP、TLS)。
2層目はブラウザの自己申告(User-Agent、Accept-Language、Referer、Sec-CH-UA-*)で、どこにでも残る一方、詐称も容易です。3層目は読み込み後にスクリプトが測る値で、画面やタイムゾーンから<canvas>の描画差分までは次表のとおり。ブラウザフィンガープリントテストがこれをローカルに読み、canvasの描画署名まで出します。
効くのは個々の値の秘匿性ではなく同時分布です。約33bit(≒86億)で1人が切り出される計算になります。ただし相関する値は単純に足し合わせられません。Panopticlickの実測値はUser-Agentが約10.0bit、Accept系ヘッダーが約6.09bit、画面解像度と色深度が約4.83bit、タイムゾーンが約3.04bitで、よく引かれる約18.1bitはフィンガープリント全体の平均です。その内訳はプラグイン列挙15.4bitとフォント列挙13.9bitが大半を占めており、現在のブラウザはこの2つをほぼ塞いでいます。ヘッダーと画面の値は互いに重なるため、足しても全体平均を超えることはありません。より大規模な調査(Gomez-Boixら、200万件)では一意性はさらに低いと報告されています。要点は数値そのものではなく仕組みで、退屈な属性が十数個あればCookieなしで再訪者を識別し続けられます。逆に取られがちですが、IPは最も持続する識別子であると同時に最も弱い位置情報です。エントロピーは対称なので、珍しい値に詐称するほど特定されやすくなります。iPhoneを名乗るUser-Agentの隣に3440×1440と16コアが並べば、それだけで唯一です。
シグナル一覧
| シグナル | 観測者 | 概算エントロピー | 安定性 |
|---|---|---|---|
| 公開IP | NW層、JS前 | 高い(NATで共有) | 回線/VPNで変化 |
| ASN + 組織名 | NW層、JS前 | 約5〜10bit | ISPごとに安定 |
Accept-Language | ヘッダー | 約5〜8bit | 非常に安定 |
User-Agent、Sec-CH-UA-* | ヘッダー+JS | 約10bit(縮小中) | 更新まで安定 |
| タイムゾーン | JS | 約3〜5bit(約400) | IPでなく人に付く |
画面 + devicePixelRatio | JS | 約5〜8bit | モニタ接続で変化 |
CPUコア数 (hardwareConcurrency) | JS | 約2〜3bit | 端末ごとに固定。丸めなしの実数(6/10/12/20など) |
デバイスメモリ (deviceMemory) | JS | 約1〜2bit | 端末ごとに固定。0.25/0.5/1/2/4/8GBに丸め、上限8GB |
| canvasの描画 | JS | 約8bit | GPU/ドライバ依存 |
| WebGLのレンダラ文字列 | JS | 10bit以上 | 非常に安定 |
| フォント列挙 | JS | デスクトップで高い | 構成ごとに安定 |
Cookie / localStorage のID | サーバーが付与 | 設計上一意 | 消すまで |
数値は公開調査からの桁の目安です。消せるのは最終行だけで、上の行は毎回再生成されます。
成果物と一緒に出ていくもの
漏洩の多くは追跡ではなく、チケットに貼られたデバッグ成果物です。
| 成果物 | 受け取った側が得るもの | 載っているフィールド |
|---|---|---|
| HARの書き出し | 有効なセッションと本文 | Cookie、Set-Cookie、Authorization、x-api-key、?token=、postData.text、content.text |
| チケットのURL | 同一性と、期限まで通るアクセス | ?session=、?sig=、X-Amz-Signature、メールのハッシュを含む計測パラメータ |
| バグ報告のJWT | 誰で何ができるか(鍵なしで読める) | sub、email、tenant、roles、exp |
生のメールヘッダー、.eml | 実経路と社内のホスト名 | Received:(fromと発信元IP)、X-Originating-IP、内部のbyホスト名 |
| チケットのログ行 | 実IPと端末モデル、OSビルド | X-Forwarded-For、remote_addr、User-Agentのモデルトークン(SM-G991B、Build/…) |
| DevToolsの画面写真 | 開いていたパネルの中身(画素なので検出不能) | NetworkのResponse本文、ApplicationのCookiesのValue列 |
どのツールを使うか
外向きのアドレスは遠隔の端点にしか見えず、「今どのアドレスで出ているか」だけはローカルで答えられません。IPアドレス確認ツールがapi.sitekits.devに尋ねるのはこのためです(保存はしません)。「スクリプトが何を読めるか」は逆に完全ローカルで、ブラウザフィンガープリントテストがヘッダー・画面・ハードウェアとcanvas署名を扱います(フォント・WebGL・音声は列挙しないので点検用)。UA文字列だけならUserAgentパーサー、オリジン側の宣言(Referrer-Policy、Set-Cookie)はHTTPヘッダーチェッカーがサーバー側から本文なしで取得します。
表の振り分けはこうです。HARは外に出す前にHARファイルサニタイザーへ通し(該当ヘッダー・クエリのトークン・両方の本文を[REDACTED]に置換し件数を表示)、HARファイルビューアーで必要な値が残ったか確認します(HARガイド)。リンクはURLパーサー&アナライザーで展開、トークンはJWTトークンデコーダーで渡すクレームを確認、生ヘッダーはメールヘッダーアナライザーでReceived:連鎖を確認。いずれもページ内で完結します。画面写真だけは代替がなく、ぼかしは編集ではないので切り取ります。トークン全般はセキュリティ関連ツールとセキュリティ向けの一覧にもまとめています。
よくある落とし穴
ジオロケーションを位置として扱う
cityはプレフィックスの登録地です。データセンターのASNが住宅街の都市を示すなら、信用ではなく調査の対象です。
見えるフィールドだけを消す
照合対象は固定のヘッダー名とtoken|key|secret|password|passwd|pwd|auth|session|sig|signatureに一致するパラメータ名だけで、URLのパスに埋めた秘密(/v1/reset/9f3a…)は残ります。出力には目を通すこと。
URL自体がデータであることを忘れる
クエリ文字列はRefererヘッダー、CDNのログ、ブラウザ履歴、分析基盤に残ります。署名付きURLに期限があるのはそのためで、個人データをクエリに置いてはいけません。
ブラウザ側のHTTPクライアントを中立と考える
REST APIテスターは入力URLへブラウザから直接送るため(sitekitsのサーバーは経路になし)、宛先に実IP、User-Agent、貼った認証情報が見えます。管理外の端点には使い捨てトークンを。