Scrapfly 工程团队揭示了浏览器指纹识别中一个几乎不为人知的信号:浮点数学运算的尾部位差异。同一个 Math.tanh(0.8) 调用在 Linux(glibc)、macOS(libsystem_m)和 Windows(UCRT)上返回不同的最后一位精度——这是因为每个操作系统的 C 数学库(libm)使用了不同的多项式近似系数。文章深入剖析了 V8、Blink 和 Web Audio 中数学运算的路由机制,并展示了如何通过逆向工程和直接内存映射 DLL 来逐位精确复现特定操作系统的数学行为。
…491,macOS 返回 …490,Windows 返回 …489——仅 1-2 ULP 的差异就暴露了操作系统std::tanh 后开始泄露宿主 OS 的 libmMath.* 中只有 tanh 泄露 OS(其余由 V8 内置),但 CSS 的七个三角函数全部走宿主 libm,Web Audio 走 Accelerate 框架libsystem_m(给 tanh/CSS trig)和 Accelerate vDSP(给 Web Audio FFT),两者结果不同fma() 和 -ffp-contract=off 确保跨架构确定性ucrtbase.dll 内存映射并调用其导出函数,需处理 x64 ABI 差异(ms_abi)和 CFI 检查