Chromium 148以降、Math.tanhでOSが特定可能に

原題: Since Chromium 148, Math.tanh is now fingerprintable to link underlying OS

なぜ重要か

ブラウザフィンガープリントの新たな手法として、数学演算のビット差異によるOS特定が実用化されており、スクレイピング対策・プライバシー技術の両面で対応が求められる。

Chrome 148のV8エンジン更新により、Math.tanhがホストOSのlibmライブラリを呼び出すようになった。その結果、Linux(glibc)、macOS(libsystem_m)、Windows(UCRT)の3OS間で計算結果が最終ビットレベルで異なり、ブラウザフィンガープリントによるOS特定が可能になったと、Scrapfly Engineeringが2026年7月12日に報告した。

Scrapfly Engineeringは2026年7月12日、Chrome 148以降のV8エンジンにおいて、JavaScriptの`Math.tanh`関数がOSのネイティブ数学ライブラリ(libm)に委譲されるよう変更されたことで、実行OSを特定できるフィンガープリント信号が生まれたと報告した。

具体的には、`Math.tanh(0.8)`を実行した場合、Linux(glibc)では`0.6640367702678491`、macOS(libsystem_m)では`0.664036770267849`、Windows 11(UCRT)では`0.6640367702678489`と、3OS間で異なる値が返される。この差異はIEEE 754規格が浮動小数点の三角関数・双曲線関数の「正確な丸め」を義務付けていないことに起因し、各ベンダーが独自の係数やルックアップテーブルを用いたlibm実装を提供しているためだ。差異は全入力の約4分の1に発生し、通常は最後の1ビット(1 ULP)の差にとどまる。

V8のコミット`c1486295ae5`により、それまで内蔵のfdlibmポートで計算していた`tanh`が`std::tanh`に置き換えられ、ホストOSのlibmを参照するようになった。この変更はV8 14.8.57(Chrome 148)で初めて適用された。Chrome 147以前はすべてのOSで同一のビット列を返しており、このリークは存在しなかった。

実際のフィンガープリント検出では、特定の入力値に対する出力パターンを比較するだけでOSを識別できる。たとえばUser-AgentでmacOSと主張しながらLinuxの数学ビットを返せば矛盾が生じ、アンチボットシステムに検出される可能性がある。

`Math.tanh`のほか、CSS三角関数やWeb Audio APIのコンプレッサーも同様にホストlibmを経由するため、複数経路でOS判定が可能だとScrapflyは指摘している。同社はこのシグナルを正確に再現することが、本物のブラウザを模倣する上で技術的に困難な課題の一つだと説明した。

出典

scrapfly.dev — 元記事を読む →