自 Chronium 148 起,Math.tanh 现在可用于指纹识别以链接底层操作系统
指纹识别通常涉及画布、WebGL、字体和音频。还有一个更安静的信号,它存在于数字的最后几位。你可以在任何控制台中运行这个:Math.tanh(0.8) // 0.6640367702678491 真正的 Linux Chrome (glibc) // 0.664036770267849 真正的 macOS Chrome (libsystem_m) // 0.6640367702678489 真正的 Windows Chrome (UCRT) 这不是常量。它是一个近似值,确切的比特取决于计算它的操作系统。真正的 Mac 通过 Apple 的数学库运行 Math.tanh。Linux 通过 glibc 运行它。两者在大约四分之一的输入上不同,通常在最后一位相差一个单位 (1 ULP)。Windows 通过通用 C 运行时与两者有几个百分点的不同,而在上述输入中,三者都落在了不同的比特上。在三台真实机器上运行的真正的 Chrome 150 的相同调用:调用 Linux (glibc) macOS (libsystem_m) Windows (UCRT) 分析 Math.tanh(0.5) 0.46211715726000974 0.46211715726000974 0.46211715726000974 所有三者一致 Math.tanh(0.7) 0.6043677771171636 0.6043677771171635 0.6043677771171635 只有 Linux,1 ULP Math.tanh(0.8) 0.6640367702678491 0.664036770267849 0.6640367702678489 所有三者不同,2 ULP 分散 Math.tanh(0.9) 0.7162978701990245 0.7162978701990245 0.7162978701990244 仅 Windows,1 ULP 根据 Chrome 150 上的 DevTools 协议测量:Linux (glibc),Apple Silicon 上的 macOS 26 (libsystem_m),Windows 11 (ucrtbase.dll)。tanh(0.5) 是大约四分之三的输入之一,大家都同意,这正是它没有用作探测的原因。tanh(0.8) 是同时区分三者的一个输入。一个 tanh 调用在正确的输入上是每个操作系统的特征。声明 macOS,返回 Linux 数学比特,那么你就存在自我矛盾的 User-Agent。这个信息是最近的。在 Chrome 148 之前,V8 自己计算 tanh,使用打包的 fdlibm 移植版本,这样在每个操作系统上返回相同的比特,没有泄露任何东西。V8 提交 c1486295ae5 用 std::tanh 替换了它,读取主机 libm。它首次出现在 V8 14.8.57,也就是 Chrome 148。Chrome 147 及之前版本在这里没有泄露。Chrome 148、149 和 150 有。Scrapfly 提供了一款必须在数百个信号上与真实浏览器匹配的浏览器。数学是其中一个更难的部分。这就是原因,以及我们关闭它的方法。为什么一个函数返回不同的比特 IEEE 754 定义了一个双精度数是如何存储的。它不要求 sin、cos、tanh 或 exp 被正确舍入。正确舍入是昂贵的,因此每个供应商都发布了一个 libm,牺牲了一部分 ULP 来换取速度,具有自己最小最大系数、查找表和约简常数。三个实现,三组比特:Linux:glibc macOS:Apple libsystem_m Windows:UCRT 他们几乎在所有地方都一致,只是在足够多的时间上分裂以识别操作系统。一个探测器不需要数学。它需要一个表:真正的 macOS Chrome 返回 cos(1) 的这个模式,真正的 Linux Chrome 返回那一个。一个探测,一个比较。四个陷阱 “只需重新实现 Mac 函数” 在接触时会出现问题。有四个原因。 1. 只有一些数学泄露。V8 自带自己的数学并进行静态链接:Math.exp、Math.pow、Math.atan 和大多数其他来自于打包的 llvm-libc,Math.sin / Math.cos 来自于打包的 glibc 衍生的 dbl-64 例程。它们在每个操作系统上都是相同的,因此伪造它们会产生不一致。例外是 Math.tanh:自 Chrome 148 起,V8 使用平台 std::tanh 计算,而不是之前使用的打包例程,因此现在读取主机 libm。它是唯一一个泄露操作系统的 Math.*,这种不对称性本身是可检查的。 2. JavaScript 数学和 CSS 数学是不同的代码路径。CSS sin()、cos() 和 atan2() 不与 Math.sin 共享代码。布局引擎将角度按度数缩减,然后在缩减值上调用平台 std::sin。这与直接的弧度 sin() 给出了不同的结果,并且它击中主机 libm,因此所有七个 CSS 三角函数都有泄露。我们逐位再现了度数缩减和弧度到度数的步骤,而不仅仅是叶函数。 3. macOS 有两个不同意的数学库。Apple Silicon 包含标量的 libsystem_m 和 Accelerate 框架的向量例程(vvsin,vvtanh)。它们是不同的代码。在一百万个输入中,它们在 10% 到 89% 的情况下出现偏差,这取决于函数。取 cos(0):标量返回正好 1.0,Accelerate 返回 0.9999999999999999。因此,“再现 Apple 的数学”在你知道浏览器在哪个网站调用哪个库之前是未定义的。我们通过在真实 Mac 上通过调试协议驱动真实的 Chrome 并读取确切的双精度数来解决这个问题。答案是:标量 libsystem_m 支持 Math.tanh、CSS 三角函数和音频压缩器的每个样本的超越函数。Accelerate 支持 Chrome 在 Mac 上的 Web Audio DSP、FFT、向量数学和双二次滤波器(fft_frame_mac.cc、vector_math_mac.h、biquad.cc,皆为 BUILDFLAG(IS_MAC))。选择错误的库用于给定的调用位置,且大多数输入会落后 1 ULP,情况比没有伪造更糟。 4. 架构...
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡