privacy

Privacy ツール

公開IPアドレス・リクエストヘッダー・JavaScriptから読める端末情報から、サイトは実際に何を知るのか。エントロピーの積み上がり方と、HARやURL、トークンを共有する前に落とすべき項目を整理します。

3 ツール

§01 分野ガイド

3つの観測者、3つの層

JavaScriptが動く前から、サイトは公開IPを受け取っています。そこだけでASN、粗い地理推定、HTTP/TLSのバージョンが分かり、Cookieは関与せず、経路上のプロキシが既定でログに残します。IPアドレス確認ツールが表示するのはこの層です(IP、都市・地域・国、ISP、ASN、タイムゾーン、エッジPoP、TLS)。

2層目はブラウザの自己申告(User-AgentAccept-LanguageRefererSec-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コアが並べば、それだけで唯一です。

シグナル一覧

シグナル観測者概算エントロピー安定性
公開IPNW層、JS前高い(NATで共有)回線/VPNで変化
ASN + 組織名NW層、JS前約5〜10bitISPごとに安定
Accept-Languageヘッダー約5〜8bit非常に安定
User-AgentSec-CH-UA-*ヘッダー+JS約10bit(縮小中)更新まで安定
タイムゾーンJS約3〜5bit(約400)IPでなく人に付く
画面 + devicePixelRatioJS約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約8bitGPU/ドライバ依存
WebGLのレンダラ文字列JS10bit以上非常に安定
フォント列挙JSデスクトップで高い構成ごとに安定
Cookie / localStorage のIDサーバーが付与設計上一意消すまで

数値は公開調査からの桁の目安です。消せるのは最終行だけで、上の行は毎回再生成されます。

成果物と一緒に出ていくもの

漏洩の多くは追跡ではなく、チケットに貼られたデバッグ成果物です。

成果物受け取った側が得るもの載っているフィールド
HARの書き出し有効なセッションと本文CookieSet-CookieAuthorizationx-api-key?token=postData.textcontent.text
チケットのURL同一性と、期限まで通るアクセス?session=?sig=X-Amz-Signature、メールのハッシュを含む計測パラメータ
バグ報告のJWT誰で何ができるか(鍵なしで読める)subemailtenantrolesexp
生のメールヘッダー、.eml実経路と社内のホスト名Received:(fromと発信元IP)、X-Originating-IP、内部のbyホスト名
チケットのログ行実IPと端末モデル、OSビルドX-Forwarded-Forremote_addrUser-Agentのモデルトークン(SM-G991BBuild/…)
DevToolsの画面写真開いていたパネルの中身(画素なので検出不能)NetworkのResponse本文、ApplicationのCookiesのValue

どのツールを使うか

外向きのアドレスは遠隔の端点にしか見えず、「今どのアドレスで出ているか」だけはローカルで答えられません。IPアドレス確認ツールapi.sitekits.devに尋ねるのはこのためです(保存はしません)。「スクリプトが何を読めるか」は逆に完全ローカルで、ブラウザフィンガープリントテストがヘッダー・画面・ハードウェアとcanvas署名を扱います(フォント・WebGL・音声は列挙しないので点検用)。UA文字列だけならUserAgentパーサー、オリジン側の宣言(Referrer-PolicySet-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、貼った認証情報が見えます。管理外の端点には使い捨てトークンを。

FAQ
IPアドレスから、おおよその都市以外にサイトは何を知りますか?
分かるのは主に「人」ではなく「ネットワーク」です。プレフィックスにはASNとそれを広報している組織が紐づいており、住宅向けISPなのか、モバイルキャリアなのか、企業の出口なのか、クラウドのリージョンやVPN事業者なのかを見分けられます。この読み取りは都市フィールドよりはるかに信頼できます。さらに接続そのものから、スクリプトが自己申告しなくても、ネゴシエートしたHTTPのバージョン、クライアントが提示したTLSのバージョン、リクエストを終端したエッジPoPが分かります。CGNATでは数千人の加入者が1つのアドレスの背後に入るため、IPは個人ではなく集団に付くラベルです。本当に情報量があるのは矛盾のほうで、データセンターのASNなのに住宅街らしい都市が出る、JavaScriptのタイムゾーンとIPから推定される国が食い違う、といった組み合わせがそれにあたります。IPアドレス確認ツールは、サーバーから見えるのと同じ項目を表示します。
VPNを使えばブラウザフィンガープリントは防げますか?
防げません。VPNが変えるのはネットワーク層だけで、canvasの描画結果、画面サイズ、フォント構成、タイムゾーン、ハードウェアのカウンタは変わらないため、再訪した利用者は同じ個体として認識され続けます。むしろJavaScriptから読めるタイムゾーンとIPから推定した国が食い違うこと自体が、VPN利用の信頼できるシグナルになります。
ブラウザを一意に特定するには何bitのエントロピーが必要ですか?
約33bitです。2^33はおよそ86億なので、世界人口から1人を切り出す規模になります。2^k人に1人が持つ値はkbit分の寄与で、相関のあるシグナルどうしは単純な合計より少ない量しか足されません。よく引かれる約18.1bitはヘッダーと画面情報だけの値ではなく、Panopticlickにおけるフィンガープリント全体の平均で、内訳はプラグイン列挙15.4bitとフォント列挙13.9bitが大半です(現在のブラウザはこの2つをほぼ塞いでいます)。ヘッダーと画面情報単体はUser-Agentが約10.0bit、Accept系ヘッダーが約6.09bit、画面解像度と色深度が約4.83bitと桁が小さく、互いに重なるため単純に足し上げてこの平均に届くこともありません。
チケットにURLを貼ると何が漏れますか?
リンク先だけではありません。クエリ文字列にはセッションID、期限まで有効な署名付きURLの署名、ハッシュ化したメールアドレスを含むトラッキングパラメータが載り、それが第三者に送られるRefererヘッダー、CDNのアクセスログ、ブラウザ履歴、分析基盤へそのまま複製されます。URLのどこまでが転送されるかを決めるのは貼った本人ではなく、オリジンのReferrer-Policyです。貼る前に展開して中身を見て、個人データはクエリパラメータに置かないでください。
sitekitsのツールのうち、入力をサーバーに送るのはどれですか?
大半はブラウザ内で完結します。ブラウザフィンガープリントテスト、HARファイルサニタイザーとビューアー、JWTトークンデコーダー、URLパーサー、UserAgentパーサー、メールヘッダーアナライザー、各種フォーマッタや変換ツールは貼り付けた内容をローカルで解析し、ページの外には出しません。api.sitekits.dev を呼ぶのは3つだけで、いずれも手元では答えが見えない問いを扱います。IPアドレス確認ツール(外に出ているアドレス)、DNSルックアップ(ドメイン名)、HTTPヘッダーチェッカー(URL)で、入力はその1回の問い合わせに使うだけで保存せず、ヘッダーチェッカーが返すのはステータスとヘッダーのみ、本文は取得しません。外部へ出る唯一の例外がREST APIテスターで、ブラウザから入力先へ直接送信し(sitekitsのサーバーは経路になし)、当サイトではなく宛先に実IPと貼り付けた認証情報が見えます。各ツールページには local / server / external のいずれかを示すチップが表示されます。