Saltar al contenido principal
it/blog/obscura/research/uncontrollable/cpu-platform/

obscura/research/uncontrollable/cpu-platform

5 min di lettura

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).