Stringhe del renderer WebGL e segnali hardware: quanto dice di te la tua GPU

L'hardware su cui gira un browser trapela nella pagina in diversi piccoli modi. Nessuno di essi nomina la macchina, ma insieme la descrivono abbastanza da distinguerla dalla maggior parte delle altre.
La stringa del renderer
WebGL espone un'estensione chiamata WEBGL_debug_renderer_info con due valori: il produttore non mascherato e il renderer non mascherato. Su Windows con Chromium il renderer riporta di solito qualcosa come ANGLE (NVIDIA, NVIDIA GeForce RTX 2060 SUPER (0x00001F06) Direct3D11 vs_5_0 ps_5_0, D3D11). Quell'unica riga fornisce il produttore della GPU, il modello esatto, il suo identificatore di dispositivo PCI, l'API grafica e il modello di shader, che è anche un forte indizio sul sistema operativo, perché quella stringa esiste solo su Windows.
Firefox e Safari hanno in vari momenti mascherato o generalizzato questa stringa; Chromium la espone. Un browser che la maschera restituisce un valore generico, e una diagnostica mostra "informazioni sul renderer mascherate" invece di tirare a indovinare.
Conteggi e dimensioni
navigator.hardwareConcurrency restituisce il numero di thread logici della CPU. navigator.deviceMemory restituisce una quantità approssimativa di RAM, arrotondata a un piccolo insieme di valori e limitata a 8 in Chromium, quindi una macchina con 32 GB riporta 8. screen.width e screen.height danno la dimensione dello schermo, availWidth e availHeight sottraggono la barra delle applicazioni e devicePixelRatio rivela il ridimensionamento. screen.colorDepth è quasi sempre 24. navigator.maxTouchPoints distingue i dispositivi touch dagli altri.
Alcuni di questi hanno un potere identificativo insolitamente alto rispetto a quanto appaiono innocui. Il numero di thread ha solo una manciata di valori comuni, ma è uno dei campi a cui un noto servizio commerciale di fingerprinting dà grande peso, proprio perché è economico e stabile. La dimensione dello schermo combinata con il rapporto di pixel e l'altezza disponibile restringe una macchina più di quanto faccia uno user agent.
Dispositivi multimediali
navigator.mediaDevices.enumerateDevices() restituisce le fotocamere, i microfoni e gli altoparlanti che il sistema possiede. Senza autorizzazione, i browser moderni restituiscono i tipi e i conteggi ma etichette vuote, così una pagina apprende "una fotocamera, un microfono, un'uscita" e nient'altro. Concedere l'accesso a un qualsiasi sito rivela le etichette. Una diagnostica che mostra solo i conteggi si comporta come farebbe una pagina senza autorizzazione.
Ancora il tema della coerenza
I segnali hardware sono il punto in cui lo spoofing sbaglia più spesso. Un profilo che dichiara un MacBook con un renderer NVIDIA Direct3D, 24 thread e uno schermo 1366×768 sta descrivendo una macchina che non esiste. I siti non hanno bisogno di un database per accorgersene; bastano poche regole. Se un profilo modifica uno qualsiasi di questi valori, deve modificarli tutti in una combinazione che un dispositivo reale offre davvero, e mantenerla tale tra una visita e l'altra.
Che cosa verificare
Leggi la stringa del renderer e chiediti se corrisponde al sistema operativo indicato nello user agent. Leggi la dimensione dello schermo e chiediti se corrisponde al rapporto di pixel e all'altezza disponibile. Leggi il numero di thread e la memoria e chiediti se la coppia è plausibile per quella GPU. Una diagnostica li dispone uno accanto all'altro proprio per questo scopo; il giudizio spetta a te.


