Chromium 148 より*Math.tanh*は下位の OS を特定するフィンガープリントとして使用可能になった

2026/07/13 6:12

Chromium 148 より*Math.tanh*は下位の OS を特定するフィンガープリントとして使用可能になった

RSS: https://news.ycombinator.com/rss

要約

日本語翻訳:

Chrome バージョン 148 以降、Chrome や同様のブラウザは特定の数学的な挙動を通じて正確なオペレーティングシステムの詳細を漏らし、高度なデジタルフィンガープリンティングを可能にしています。これはまず

Math.tanh
関数から始まり、bundled routines からホストライブラリへと切り替わったことで、macOS、Windows、Linux のユーザーが使用しているか否かに基づいて小数点以下最終桁が 1 ユニット異なる独自のプロファイル(OS シグネチャ)が作成され、他の V8 数学関数とは異なりプラットフォーム間で同一ではなくあります。また、すべての CSS 三角関数はホスト libm を直接呼び出すことで OS を漏らします。macOS Apple Silicon では、スカラーおよびベクトルフレームワーク間のアーキテクチャ固有の分断により計算に著しい乖離が生じます。Scrapfly はこれらの問題に対処するため、数学的ビットごとの再現を含め、Linux のなりすまし用の真正な Windows ライブラリのマッピングや特定の ARM/x86 FMA(fused-multiply-add)挙動の処理を含む特別ソリューションを開発しました。彼らの Scrapium ブラウザはこれらの OS シグネチャを真正的なシステムと完全に一致するようになりすまえ、同時に最適な速度のためにハードウェア FMA を能動的に有効化します(ネイティブエミュレーションより最大約 6 倍高速)。高度なマッピング技術および数十万もの入力を対象とした厳格な検証を通じて、ユーザーは微妙な数学的な丸めエラーや将来のアップデートにおけるアーキテクチャの癖に基づく識別を防止する同時期にネイティブレベルのパフォーマンスで完全なステルスを実現します。

本文

指紋検出回避:OS 固有の数学ライブラリによる指紋解析と完全再現技術

指紋検出は通常、WebGL、フォント、オーディオなどの分野を対象にしますが、より静かに機能する信号として**数字の最後の数ビット(最低限の有効桁)**に宿る情報も存在します。以下にその仕組み、対策、および完全再現の技術詳細を解説します。

指紋検出の確認

Math.tanh
の計算結果は、使用する数学ライブラリ(libm)によって異なります。以下のコマンドを実行すると、OS ごとに異なる値が出力されます。

Math.tanh(0.8)

結果の例:

  • 本物の Linux Chrome (glibc 使用):
    0.6640367702678491
  • 本物の macOS Chrome (libsystem_m 使用):
    0.664036770267849
  • 本物の Windows Chrome (UCRT 使用):
    0.6640367702678489

仕組みと注意点

この値は定数ではなく、オペレーティングシステム(OS)によって正確なビット構成が異なります

  • macOS: Apple の数学ライブラリ (
    libsystem_m
    ) を介して計算。
  • Linux:
    glibc
    を介して計算。
  • Windows: ユニバーサル C ランタイム (UCRT) を介して計算。

3 つのライブラリは入力値の約 4 分の 1 の精度で合致しないが、通常は有効桁の最後の 1 ユニット(1 ULP)程度の差です。入力が

0.8
の場合、この微小なビット構成の差により 3 つの OS で異なる結果に収束します。

Chrome バージョンによる挙動の違い

Chrome 150 を使用した測定結果では、以下の通り動作します:

  • Math.tanh(0.5)
    : Linux・macOS・Windows の 3 者とも一致(情報漏洩なし)。
  • Math.tanh(0.7)
    : Linux は一致するが、macOS と Windows では 1 ULP 差。
  • Math.tanh(0.8)
    : 3 つの OS で全て異なる結果となり、ばらつきは 2 ULP に及ぶ(識別に最適)。
  • Math.tanh(0.9)
    : Windows が他と比べて 1 ULP 差のみ。

重要: Chrome 148 以降、V8 はホストの

libm
から読み取るよう仕様変更されました。以前は bundled な fdlibm ポートを使用していたため、どの OS でも同じビットを返し情報漏洩していませんでした(V8 コミット
c1486295ae5
で変更)。

なぜ 1 つの関数が異なるビットを返すのか

IEEE 754 は double の保存方法を定義しますが、

sin
cos
tanh
exp
正しく丸められることを強制していません。 正しく丸める計算は高コストであるため、各ベンダーは速度と精度のバランス(分数 ULP を犠牲にして)を取る独自の libm を提供しています。これらには自社固有のミニマックス係数やルックアップテーブルが組み込まれています。

主要なライブラリ一覧

  • Linux: glibc
  • macOS: Apple
    libsystem_m
  • Windows: UCRT (
    ucrtbase.dll
    )

これらはほぼすべての場所では一致しますが、OS を分類するのに十分な頻度で分岐します。検出器には数学的計算の知識が必要ではなく、単に結果テーブルを持つことで検出が可能です。

四つの罠:単純な再実装は失敗する

「Mac の関数を再実装する」というアプローチは、以下の 4 つの理由で接触するだけで失敗します。

1. 一部の数学機能だけが漏洩する

V8 は独自の数学を静的にリンクしています。

  • Math.exp
    Math.pow
    Math.atan
    など:bundled な llvm-libc から提供(全 OS で同一)。
  • Math.sin
    /
    Math.cos
    :bundled な glibc 由来の double ルーチンから提供(全 OS で同一)。
  • 例外
    Math.tanh
    :Chrome 148 以降、V8 はプラットフォーム固有の
    std::tanh
    を使用し、ホストの libm から読み取ります。これが唯一 OS を漏洩する
    Math.*
    関数です。

2. JavaScript の数学と CSS の数学は別々のコードパス

CSS の

sin()
cos()
atan2()
は、
Math.sin
と共有されるコードを持たず、以下のプロセスを経て計算されます:

  1. レイアウトエンジンで角度を度数に変換。
  2. プラットフォーム固有の
    std::sin
    を呼び出し(値を減少させ)。

これは直接ラジアンで計算する

Math.sin
と異なる結果となり、すべての 7 つの CSS 三角関数がホストの libm の情報を漏洩します。単なる関数ではなく、度数変換とラジアン〜度のステップをビット単位で再現する必要があります。

3. macOS は互いに不一致を生じる 2 つの数学ライブラリを持つ

Apple Silicon は以下の 2 つの異なるライブラリを持っています:

  • スカラー版:
    libsystem_m
    (使用例:
    Math.tanh
    )。
  • ベクトル版: Accelerate フレームワーク (
    vvsin
    ,
    vvtanh
    )。

これらのコードは異なり、100 万の入力において関数により10〜89% のケースで発散します。

  • 例:
    cos(0)
    はスカラー版で正確に
    1.0
    ですが、Accelerate では
    0.9999999999999999
    と異なります。

したがって、「Apple の数学を再現する」ことは定義が曖昧です。正しい解決策は、デバッグプロトコルで実際の Mac を駆動し、実際の Chrome から正確な double 値を読み取り、スカラー

libsystem_m
と CSS/オーディオコンプレッサー用のスカラー版を後援することです。Accelerate(FFT 等)との間で間違ったライブラリを選ぶと、1 ULP ずれだけでなく深刻な問題になります。

4. アーキテクチャによる漏洩

ARM と x86 は、融合乗算加算(FMA)や NaN の符号伝播において異なります。コンパイラが一つのターゲットで FMA を融合させ、別のターゲットでは行わない場合、ドリフトが発生します。

マップ:どこで何かが漏洩しているか

操作V8 Math.* (JS)CSS calc()Web Audio
sin
,
cos
,
tan
V8 bundled (漏洩なし)ホスト libm (漏洩あり)Accelerate / スカラー版
asin
,
acos
,
atan
,
atan2
V8 bundledホスト libm (漏洩あり)使用しない
tanh
ホスト libm (漏洩あり)なし使用しない
exp
,
log
,
pow
V8 bundledホスト libm (漏洩あり)コンプレッサー / FFT
  • V8 bundled: 静的にリンクされており、すべての OS で同一です。
  • ホスト libm: OS を漏洩するプラットフォーム固有のライブラリ(Mac:
    libsystem_m
    , Linux: glibc, Windows: UCRT)。
  • Accelerate: Mac の Web オーディオ DSP に使用される Apple の vDSP。

3 つの重要な情報源:

  1. V8 はほぼすべての処理を bundled 数学でルーティングするため、JS は
    Math.tanh
    のみに情報が漏洩します。
  2. Blink はすべての三角関数に対してホストの libm を直接呼び出すため、CSS は常に情報源となります。
  3. Mac の Web オーディオは、FFT では Accelerate ですが、DynamicsCompressor(単位の超越関数)ではスカラー版
    libsystem_m
    を使用します。1 つのオーディオグラフに 3 つ異なるライブラリが存在します。

WASM について

WASM は超越演算オペコードを持っていないため、数学は bundled libm から供給されます。その算術(

f64.sqrt
,
f64.mul
)はハードウェアが行うため、WASM の数学はすべての OS で同一です。指紋軸は NaN の正規化と SIMD 丸めにおける ARM と x86 の分岐のみとなります。

これを閉じる方法:完全再現技術

単なる出力の乱す(ノイズなし)では無意味です。「主張している OS と同一である」ことが目標です。以下に 3 つの主要なアプローチがあります。

アプローチ A: アルゴリズムの完全再現

目標の libm からミニマックス係数などを回復し、移植可能な C に転記します。良い

tanh
を構築するのではなく、「彼らの
tanh
」を構築します

Apple の sin 多項式(libsystem_m から抜き取った係数)を例示します:

// Apple が発火する各融合乗算加算 (fma) は明示的な fma() として記述されます。
// 係数のビットパターンはそのままコピーされ、小数点表記では異なる丸めになります。
static const double P[6] = {
     0x1.5d8fd1fd19ccd * p-33, -0x1.ae5e5a9291f5d * p-26,  0x1.71de3567d48a1 * p-19,
    -0x1.a01a019bfdf03 * p-13,  0x1.111111110f7d0 * p-7,  -0x1.5555555555548 * p-3,
};
static double sin_poly(double x2) {
  double p = fma(x2, P[0], P[1]);
  p = fma(x2, p, P[2]);
  p = fma(x2, p, P[3]);
  p = fma(x2, p, P[4]);
  p = fma(x2, p, P[5]);
  return x2 * p;                 // 呼び出し側で完了: sin(x) = fma(x, x2*p, x)
}

決定論的な再現:

  • 明示的な
    fma()
    が重要です。
  • コンパイル時に FMA 収縮をオフにする (
    -ffp-contract=off
    )。これにより、コンパイラが自らの融合を発明したり捨てたりすることを防ぎ、Apple と同じ演算フローになります。
  • 結果は FMA と非 FMA CPU で同一に、ARM マシンと x86 フリート上で同一になります。

アプローチ B: オリジナルライブラリの直接読み込み

再現が割に合わない場合は、オリジナルの libm をマップします。

  • Windows UCRT:
    ucrtbase.dll
    を実行時にメモリ上にマップし、エクスポートを直接呼び出します。コードが本物なので、リバースエンジニアリングなしでビットは本物です。
// Windows x64 ABI (System V ではない)。ms_abi がないとクラッシュします。
typedef double(__attribute__((ms_abi)) * D1)(double);          // tanh, sin, ...
typedef double(__attribute__((ms_abi)) * D2)(double, double);  // atan2

// マップされた DLL コードは CFI リージスターズでないため、
// -fsanitize=cfi-icall (生産環境オン) は #UD-trap を発生させます。
[[clang::no_sanitize("cfi-icall")]]
double ucrt_tanh(double x) {
  return ucrt.loaded ? ucrt.tanh(x) : std::tanh(x);
}

詳細な調整:

  • UCRT の数学関数は
    mov eax, [rip+disp32]
    で始まって、スカラーか FMA/AVX2 パスかを選択する CPU ディスパッチフラグを読み取ります。
  • 新鮮なマップではこのフラグが 0 になり遅いパスを取得するため、初期呼び出し前にFMA パスに強制することで、実際の Windows マシンとビット単位で一致します。

アプローチ C: フックによるゲート制御

エンジンが libm を呼ぶ単一の関数をフックし、主張する OS にゲートします(Linux は glibc を保持し、Mac では再現版を使用)。

速度最適化 (FMA 有効化): 完全に再現されていても低速であれば情報源となります。ソフトウェア呼び出しの

fma()
はハードウェア FMA より 2.5〜6 倍遅いです。

  • デフォルトの x86 ベースラインはハードウェア FMA 以前の挙動のため、比率が不自然です。
  • ハードウェア FMA をオンにすると、各融合演算は 1 インストラクションになり約 6 倍高速化し、glibc よりも速く、ビット単位で同一になります。

バリデーション

出荷前の証明として、以下のテストを実行します:

  • 871,000 の入力実行: 稠密グリッド、間隔境界、サブノーマル、符号付きゼロ、無限大、NaN など。
  • 本物のデバイスオラクル: スカラーと Accelerate の両方の結果を計算する実際の Mac で不一致箇所を検出。
  • 本物のブラウザアンカー: 実際の Mac Chrome (
    Math.tanh
    と CSS 三角関数) を完全精度で計算し、指紋検出器の基準とする。

確認事項:

  • Math.tanh
    と CSS の
    sin
    /
    cos
    /
    tan
    /
    asin
    /
    acos
    /
    atan
    /
    atan2
    について、再現版は出荷バイナリ内の機械コードと完全に一致しています(Bit-for-bit パラリティ)。
  • ドメインエッジもチェックされます:例えば実際の Mac では
    asin(2)
    は 0 に解決(NaN クランプ)しますが、ナイーブな再現版では 90 度となりません。

結論:なぜそれが重要なのか

数学は決定論的であり、プローブするのは簡単ですが、偽装するのは困難であり、スプーフィングスタックのレーダーにはほぼありません。

  • 防衛者にとって: 強いシグナルとなります。
  • スクレイパーにとって: 負債となります。

これを正しく行うには、ベンダーの libm 内部をリバースエンジニアリングし、3 つのエンジンが呼び出しサイトごとに数学をルーティングする方法をマッピングし、アルゴリズムを最後のビットまで一致させ、アーキテクチャを超えて決定論性を維持し、実在するハードウェアに対して証明する必要があります。

これにより、API を介して macOS として提示するとしても、アイデンティティはコサインの丸めまで保持され、実在するトラフィックと区別できなくなります(Scrapfly / Scrapium の技術スタック)。

同じ日のほかのニュース

一覧に戻る →

2026/07/13 5:23

小さなエミュレータ

## Japanese Translation: このテキストは、収集家のためのプラットフォーム間での即時的な互換性を優先しつつ、コモドール C64、ZX Spectrum(48k/128)、Amstrad CPC(CPC464/6128)、Acorn Atom、Z1013 などのレトロコンピュータシステムおよびそれらの対応ソフトウェアの包括的な目録です。具体的には、『Boulderdash』『Ghost's'n'Goblins』『Rick Dangerous』『Prince of Persia』のようなアクションゲームや、『Tetris』『Pengo』『Sokoban』のようなパズルゲームにわたる特定のタイトルを対象とし、ローディング時の独自の要件(例:BASIC 環境では「Enter」キーを押す、Spectrum タイトル『Cyclone』『Great Escape』では特定のジョイスティック種類[Kempston]を選択する、特定のインターフェースでは「F1」「SPACE」キーを押すなど)を詳述しています。また、本ガイドでは Arkos/Overlanders、Batman Group、Plush、Offence、Oxyron、Proxima、Dekadence などの著名なデベロッパーに帰属する様々なデモとインターフェースを列挙しています。さらに、特定のコントローラーや RAM モジュールなどといったハードウェアの制約を明示することで、今日広く利用可能な膨大なソフトウェアライブラリがどの機械構成で実行可能かをはっきりさせます。これは『Visual 6502 Remix』から『Wunderbar』『Batman Forever』などの特殊なデモにいたるまで、すべてのソフトウェアを網羅しています。最終的には、古いハードウェア上で何が達成可能かについてユーザーが正確に知ることを保証し、余計な詳細を含めない実用的な参考文献として機能します。

2026/07/13 3:25

Claude Code はプロンプトを読み込むまでに約3万トークンを消費し、OpenCodeは7,000 トークンである。

## Japanese Translation: 主要な知見は、セッションの段階と設定の複雑性に 따라 Claude Code と OpenCode の間でのトークン使用ダイナミクスが著しく異なることを示しています。標準的な設定において、Claude Code は非効率的なシステムプロンプト、キャッシュ管理のために数万のトークンを再記述し、堅牢なフレームワークテンプレートにより引き起こされる大規模な初期オーバーヘッド(約 33,000 トークン)を被る一方、OpenCode の床は低い(約 7,000 トークン)ため、大きな差を生じています。ただし、Fable 5 のような新しいモデルではこの隙間が縮小します。特に、複雑な本番環境設定においては、OpenCode 自身のツール呼び出しのシリアライゼーションとスキーマサイズによる影響で、最初のリクエストでより高いトークン負荷(Claude の約 75,000 トークンに対し、約 90,817 トークン)を被り、その後のリクエストで安定化するまで要請されます。新しいモデルは命令セットのサイズを削減しますが(例:27k から 10k クラクターへ)、特定のコストドライバーは残っています:対話履歴と乗算される延長された思考ブロック、「フレームワーク税」として作用する大規模な静的フレームワークテンプレート(例:AGENTS.md)、およびバーストコストを増幅するサブエージェントのファンアウト構造。さらに、本研究では EU AI Act のログ記録要件への準拠を確保し完全性を保証するために、キャッシュの書き込みと課金構造の違い(例:キャッシュされた読み取り対課金されるプレミアム書き込み)を検証できるよう、185 件のレコードを捕捉した SHA-256 ハッシュ連鎖監査軌跡を利用しました。 ## Text to translate: The primary findings indicate that token usage dynamics vary significantly between Claude Code and OpenCode depending on the session stage and configuration complexity. While Claude Code incurs a massive initial overhead (~33,000 tokens) compared to OpenCode's low floor (~7,000 tokens) in standard setups—driven by inefficient system prompts, rewriting tens of thousands of tokens for cache management, and rigid framework templates—this gap narrows with newer models like Fable 5. Notably, in complex production configurations, OpenCode's first request can incur a higher token load (~90,817 tokens vs. ~75,000 for Claude) due to its own serialization of tool calls and schema sizes before stabilizing on subsequent requests. While newer models reduce instruction set sizes (e.g., from 27k to 10k characters), specific cost drivers remain: extended thinking blocks that compound with conversation history, large static framework templates (e.g., AGENTS.md) that act as a "framework tax," and subagent fan-out structures that multiply bootstrap costs. Additionally, the study utilized a SHA-256 hash-chained audit trail capturing 185 records to ensure integrity and support compliance with EU AI Act logging requirements, verifying that both architectures handle cache writes and billing structures differently (e.g., cached reads vs. billed premium writes).

2026/07/08 12:28

物理学を学びたいですか(第 2 版,2021)

## 日本語訳: 本書は、従来の大学システムによって教育を受けられなかった学習者を対象としており、推測的な見解や暗記に頼るのではなく「本当の物理学」を学びたい方に向けて設計された、自己学習向け物理学ガイドの第 2 版です。これは 2021 年 8 月 13 日にリリースされました。約 6 年前に開始され以来、作成から現在に至るまで 60 万人以上がアクセスした大成功を収めた第 1 版(2015 年に発売)を基盤とし、読者からのフィードバックを取り入れ、最新の教科書基準に合わせて更新されています。読者によれば、本書を用いて学士号を取得したり、大学院プログラムに進学したり、宇宙に対する純粋な好奇心を満たしたりしているそうです。生物学や化学の背景知識が不可欠とされる従来の道筋とは異なり、このカリキュラムは厳密に高校までの予備微積分(前代数から前微積分まで)のみを要求し、微積分は学士課程の授業と並行して学習します。生物学や化学は必須前提条件ではありませんが、併せて学ぶことは有益です。構造化された学習経路は、導入力学から静電学、波動・振動、現代物理学、古典力学、電磁気学、量子力学、そして熱力学・統計力学へと進み、物理学の学士号に相当する知識を修得します。大学院コア科目(これにはすべての undergraduate トピックへの習熟に加え、フーリエ解析、テンソル、常微分方程式/偏微分方程式、実解析・複素解析、群論といった高度な数学が必要です)および研究論文を加えることで、博士レベルの mastery に達します。本書には、凝縮系物理学、宇宙論、電子工学、光学、粒子物理学、量子計算、固体物理学、弦理論を含む大学院の選択科目も用意されています。主要な undergraduate テキストブックとしては、Young and Freedman の「大学物理学(現代物理学)」、French & King の「振動と波動」、Taylor の「古典力学」、Griffiths の「電磁気学への導き」と「量子力学」が挙げられます。主要な graduate テキストブックとしては、Arfken らの「物理学者のための数学的方法」、Jackson の「古典電磁気学」、Sakurai の「現代量子力学」、Pathria と Beale の「統計力学」、Carroll の「時空と幾何」(一般相対性理論用)、Zee の「殻なしの量子場論」、Peskin & Schroeder が挙げられます。インスピレーションを得るための推奨人気の本には、Weinberg の「最初の 3 分」、Feynman の「物理法則の本質」、Close の「粒子の旅」、Thorne の「ブラックホールと時空の歪み」、Susskind と Hrabovsky の「理論的最小限度」、Feynman 講義録、Schumm の「深層のもの」があります。学習上の助言としては、教科書の問題を解くこと、Khan Academy や Coursera などのオンラインリソースの利用、答えを確認する前に Google 検索で段階的な解答を見つけること、成績よりも深い概念的理解を優先することが強調されています。究極的に、このリソースは正式な科学学位を持たない個人に、専門的知識と物理学原理に対する深い把握を獲得することを可能にします。