Articolo di Scrapfly Engineering (12 luglio 2026) su un canale di fingerprinting annidato negli ultimi bit di un numero.

Il meccanismo. Lo standard IEEE 754 definisce come viene memorizzato un double ma non impone l'arrotondamento corretto delle funzioni trascendenti. Poiché l'arrotondamento corretto è costoso, ogni piattaforma distribuisce una libm con i propri coefficienti minimax, tabelle e costanti. Ne risulta che Math.tanh(0.8) restituisce tre valori distinti a seconda di glibc, libsystem_m e UCRT. Linux e macOS divergono su circa un quarto degli input, tipicamente di 1 ULP. « Un rilevatore non ha bisogno di matematica, solo di una tabella. » E l'incoerenza è immediatamente sfruttabile: dichiarare macOS restituendo bit di Linux contraddice il proprio User-Agent.

una singola chiamata a tanh sull'input giusto è una firma per-OS. Dichiara macOS, restituisci bit matematici di Linux, e hai contraddetto il tuo stesso User-Agent.

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

L'indizio è recente e datato. Fino a Chrome 147, V8 calcolava tanh con una fdlibm integrata, identica ovunque. Il commit c1486295ae5 l'ha sostituita con std::tanh, che legge la libm dell'host, distribuito con Chrome 148.

Tre superfici presentano fughe. Math.tanh è l'unica funzione Math.* interessata — V8 integra e collega staticamente tutto il resto. Tutte le sette funzioni trigonometriche CSS presentano fughe, con Blink che chiama la libm dell'host dopo una riduzione dell'angolo in gradi che non condivide codice con Math.sin. E Web Audio coinvolge tre librerie all'interno di un singolo grafo: Accelerate per le fasi FFT e vettoriali, libsystem_m scalare per le funzioni trascendenti del compressore. WASM, invece, non presenta fughe relative al sistema operativo — solo all'architettura.

Quattro trappole rendono difficile la contromisura: solo alcune funzioni presentano la fuga, quindi falsificare le altre crea un'asimmetria rilevabile; JavaScript e CSS sono percorsi di codice separati; macOS integra due librerie matematiche che divergono tra loro dal 10 all'89% a seconda della funzione, per cui "riprodurre la matematica di Apple" non ha senso finché non si sa quale venga chiamata in quale punto; e ARM e x86 differiscono su fused multiply-add e propagazione di NaN.

Il rumore non funziona: produce un valore che non corrisponde a nessun OS reale, e il suo non-determinismo è a sua volta un segnale. L'unica via è la riproduzione bit a bit — coefficienti estratti dalla libm target e trascritti in esadecimale, ogni fusione scritta come fma() esplicito, compilata con -ffp-contract=off.

L'editore dichiara che i propri post sono redatti con l'assistenza dell'IA, mentre i meccanismi, i dati e il codice restano propri.