Content Security Policyを使ってHTTPからしか画像を読み込めないように制限しておき、HTTP Strict Transport Securityを使ってHTTPSへ書き換えようとするウェブサイトのURLをimg要素で読み込ませることで、訪問済みかどうか調べるというSnifflyという手法の実装例を見ていた。HSTSが強制的にHTTPSへ書き換えることが逆にプライバシーを漏えいさせてしまう結果になったのは皮肉だ。

HSTSを提供している場合、そのウェブサイトへのアクセスはすべてHTTPSにブラウザー側で書き換えられる。つまりHSTSを提供しているウェブサイトへ訪問済みの場合、そのウェブサイトへHTTPで画像をリクエストしてもHTTPSに書き換わることになる。そうするとCSPでHTTPな画像に制限している場合、必ず読み込みエラーになることになる。

それだけでは普通の読み込みエラーと判別できない。しかしHTTPSへの書き換えとCSPによる読み込みエラーはブラウザー側で高速に行われるため、errorイベントでエラーになるまでの時間を調査することで通常の読み込みエラーと識別できる。

だいたいこのような仕組みのようだ。HSTSの仕組みでどうにかするのは難しそうなので、CSP側で……ということになりそう。いずれにせよHTTPS化が一気に進みそうになる前になんとか解決されると良いなと思う。