Artículo de Scrapfly Engineering (12 de julio de 2026) sobre un canal de fingerprinting alojado en los últimos bits de un número.

El mecanismo. IEEE 754 define cómo se almacena un double, pero no exige el redondeo correcto de las funciones trascendentes. Como el redondeo correcto resulta costoso, cada plataforma distribuye una libm con sus propios coeficientes minimax, tablas y constantes. En consecuencia, Math.tanh(0.8) devuelve tres valores distintos según glibc, libsystem_m y UCRT. Linux y macOS divergen en aproximadamente una cuarta parte de las entradas, típicamente en 1 ULP. « Un detector no necesita matemáticas, solo una tabla. » Y la incoherencia es inmediatamente explotable: afirmar ser macOS mientras se devuelven bits de Linux contradice su propio User-Agent.

una sola llamada a tanh sobre la entrada correcta es una firma por sistema operativo. Afirma ser macOS, devuelve bits matemáticos de Linux, y te has contradicho con tu propio User-Agent.

**Scrapfly Engineering** — équipe d'ingénierie de **Scrapfly** , scrapfly.dev

El indicio es reciente y está fechado. Hasta Chrome 147, V8 calculaba tanh con un fdlibm embebido, idéntico en todas partes. El commit c1486295ae5 lo sustituyó por std::tanh, que lee la libm del sistema anfitrión, publicado con Chrome 148.

Tres superficies tienen fuga. Math.tanh es la única función Math.* afectada — V8 embebe y enlaza estáticamente todo lo demás. Las siete funciones trigonométricas de CSS tienen fuga, con Blink llamando a la libm del sistema anfitrión tras una reducción de ángulo basada en grados que no comparte código con Math.sin. Y Web Audio toca tres bibliotecas dentro de un mismo grafo: Accelerate para las etapas de FFT y vectoriales, libsystem_m escalar para las funciones trascendentes del compresor. WASM, por su parte, no delata el sistema operativo — solo la arquitectura.

Cuatro trampas dificultan la contramedida: solo algunas funciones tienen fuga, de modo que falsificar las demás crea una asimetría detectable; JavaScript y CSS son rutas de código separadas; macOS embebe dos bibliotecas matemáticas que divergen entre sí entre un 10 y un 89% según la función, de modo que "reproducir las matemáticas de Apple" carece de sentido hasta saber cuál se llama en cada punto; y ARM y x86 difieren en la multiplicación-suma fusionada y en la propagación de NaN.

El ruido no funciona: produce un valor que no coincide con ningún sistema operativo real, y su no determinación es en sí misma una señal. El único camino es la reproducción bit a bit — coeficientes extraídos de la libm objetivo y transcritos en hexadecimal, cada fusión escrita como fma() explícito, compilada con -ffp-contract=off.

El editor declara que sus publicaciones se redactan con asistencia de IA, mientras que los mecanismos, las cifras y el código siguen siendo propios.