Categoria: Hardware / Architettura del Processore
1. Descrizione
Il fingerprinting CPU misura le caratteristiche del processore e della piattaforma che vengono esposte attraverso JavaScript e WebAssembly. Questi segnali derivano da:
- Comportamento dell'unità a virgola mobile (FPU)
- Estensioni del set di istruzioni CPU (SIMD, AES-NI, AVX, BMI, POPCNT)
- Gerarchia cache e temporizzazione
- Risoluzione
performance.now()(timer hardware) - Velocità di esecuzione WebAssembly (benchmark relativo)
2. Vettori
2.1 Fingerprinting Matematico / FPU
// Differenze di precisione in virgola mobile
function mathFingerprint() {
const inputs = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
return inputs.map(x => {
// Operazioni che espongono differenze di precisione
return Math.sin(x) * Math.cos(x) + Math.tan(x) - Math.asin(x) * Math.atan(x)
}).join(',')
}
// CPU diverse producono risultati leggermente diversi
Entropia: ~4-6 bit
Stabilità: Molto Alta: il comportamento FPU della CPU è fisso
Meccanismo: La conformità IEEE 754 varia leggermente tra produttori e modelli di CPU. Le istruzioni FMA (fused multiply-add) producono risultati diversi rispetto a operazioni separate di moltiplicazione e addizione.
2.2 Rilevamento Funzionalità WebAssembly
// Modulo Wasm che testa il supporto funzionalità CPU
const wasmCode = new Uint8Array([
0x00, 0x61, 0x73, 0x6d, // magic
0x01, 0x00, 0x00, 0x00, // version
// ... rilevamento SIMD, AES-NI tramite istruzioni wasm
])
const module = await WebAssembly.instantiate(wasmCode)
const result = module.instance.exports.test()
Funzionalità rilevabili:
- SIMD (istruzioni vettoriali a 128 bit)
- Operazioni di estensione del segno
- Globali mutabili
- Operazioni di memoria bulk
- Tipi di riferimento
- Tail call
- SIMD a larghezza fissa
Entropia: ~8-12 bit (quali funzionalità sono supportate)
Stabilità: Molto Alta: le funzionalità CPU sono fisse
2.3 Risoluzione Performance.now()
// Misura risoluzione timer
const t1 = performance.now()
const t2 = performance.now()
const resolution = t2 - t1 // Intervallo minimo misurabile
Entropia: ~2-3 bit
Stabilità: Moderata: il SO e il browser possono cambiare la risoluzione
2.4 Benchmark WebAssembly
// Benchmark velocità CPU relativa
const start = performance.now()
// Esegui codice wasm CPU-intensive
const elapsed = performance.now() - start
// La velocità relativa è identificativa
Entropia: ~4-8 bit
Stabilità: Bassa-Moderata: influenzata da throttling CPU, processi in background, gestione energetica
3. Punti di Forza dell'Attaccante
| Forza | Spiegazione |
|---|---|
| Ancorato all'hardware | Le funzionalità CPU non possono essere cambiate senza sostituire l'hardware |
| Wasm è veloce | Rilevamento funzionalità in <1ms |
| Nessun permesso necessario | Wasm e API Math non richiedono consenso utente |
| Cross-browser | La stessa CPU produce fingerprint simili su browser diversi |
| Passivo | Nessuna interazione utente richiesta |
4. Debolezze dell'Attaccante
| Debolezza | Spiegazione |
|---|---|
| Bassa entropia per vettore | Il fingerprint matematico da solo è insufficiente |
| Il browser riduce la precisione timer | La risoluzione di performance.now() è intenzionalmente ridotta |
| Wasm può essere bloccato | Le impostazioni del browser possono disabilitare WebAssembly |
| Varianza benchmark | Il throttling CPU rende le misurazioni rumorose |
| Raggruppa utenti per classe CPU | Tutti gli utenti con la stessa CPU appaiono uguali |
5. Rilevamento della Manipolazione
| Tecnica | Come Funziona |
|---|---|
| Confronto risultati matematici | I metodi Math sovrascritti restituiscono valori sospetti |
| Tempo di esecuzione Wasm | Il blocco di Wasm è rilevabile (istanziazione fallisce) |
| Risoluzione timer | Una risoluzione insolitamente arrotondata suggerisce override |
6. Mitigazioni per Obscura
6.1 Cosa Può Fare Obscura
| Mitigazione | Efficacia | Rilevabilità | Implementazione |
|---|---|---|---|
Sovrascrivi precisione performance.now() |
Bassa | Bassa | Arrotonda a 100ms |
| Blocca Wasm completamente | Alta | Media | JS: WebAssembly → undefined |
Sovrascrivi hardwareConcurrency |
Alta | Bassa | Iniezione JS (già nell'elenco controllabile) |
Sovrascrivi deviceMemory |
Alta | Bassa | Iniezione JS (già nell'elenco controllabile) |
6.2 Cosa Non Può Fare Obscura
| Non Può | Perché |
|---|---|
| Cambiare il comportamento FPU | L'hardware CPU esegue le istruzioni direttamente |
| Prevenire rilevamento CPU tramite Wasm | Wasm viene eseguito nativamente, il proxy non può intercettare |
| Normalizzare la velocità di esecuzione | La velocità CPU è fisica |
| Rimuovere canali laterali di temporizzazione | Qualsiasi esecuzione JS rivela temporizzazione |
6.3 Approccio Raccomandato
1. Sovrascrivi hardwareConcurrency + deviceMemory (già pianificato)
2. Sovrascrivi precisione performance.now() (basso sforzo, beneficio parziale)
3. Accetta rilevamento matematico FPU + Wasm CPU (bassa entropia individuale)
7. Riferimenti di Ricerca
- Mowery, K. et al. (2011). "Are These Your Keys? Using Cryptographic Fingerprints to Detect Malicious Applets." IEEE S&P 2011.
- Mulazzani, M. et al. (2013). "Fast and Reliable Browser Fingerprinting." ACSAC 2013.
- Olejnik, L. et al. (2015). "The Web Never Forgets: Persistent Tracking Mechanisms in the Wild." CCS 2014 (sezione temporizzazione CPU).