Categoria: Hardware / Elaborazione Audio
1. Descrizione
Il fingerprinting audio utilizza l'API Web Audio per misurare come l'hardware audio e lo stack software di un dispositivo elaborano il suono. AudioContext, OscillatorNode e DynamicsCompressorNode producono output che variano per:
- Implementazione del driver audio (ALSA, PulseAudio, PipeWire, CoreAudio, WASAPI)
- Caratteristiche DAC/ADC hardware
- Algoritmi di conversione frequenza di campionamento
- Comportamento della compressione dinamica (curve di threshold, knee, ratio)
- Gestione del buffer audio e latenza
- Differenze implementative FFT
2. Vettori
2.1 Fingerprinting DynamicsCompressor
const ctx = new AudioContext()
const osc = ctx.createOscillator()
const compressor = ctx.createDynamicsCompressor()
compressor.threshold.value = -50
compressor.knee.value = 40
compressor.ratio.value = 12
osc.frequency.value = 1000
osc.type = 'sawtooth'
osc.connect(compressor)
const dest = ctx.createAnalyser()
compressor.connect(dest)
const buffer = new Float32Array(dest.fftSize)
dest.getFloatFrequencyData(buffer)
const hash = md5(buffer)
Entropia: ~8-12 bit
Stabilità: Alta tra sessioni, moderata tra aggiornamenti del browser
2.2 Latenza Base AudioContext
const ctx = new AudioContext()
const latency = ctx.baseLatency
Entropia: ~4-6 bit
Stabilità: Molto Alta: dipendente dall'hardware
2.3 Segnali Audio Aggiuntivi
| Segnale |
Descrizione |
Entropia |
sampleRate |
Frequenza di campionamento AudioContext (44100, 48000, ecc.) |
~1-2 bit |
maxChannelCount |
Canali audio massimi supportati |
~1-2 bit |
| Modalità conteggio canali |
'explicit' vs 'clamped-max' vs 'max' |
~1-2 bit |
| Variazioni dimensione FFT |
Diverse implementazioni FFT |
~2-3 bit |
3. Punti di Forza dell'Attaccante
| Forza |
Spiegazione |
| Ancorato all'hardware |
Il fingerprint audio è determinato da hardware e driver audio |
| Nessun permesso richiesto |
AudioContext può essere creato senza consenso utente |
| Veloce |
La generazione del fingerprint richiede ~50-100ms |
| In background |
Non riproduce suono udibile |
| Utente passivo |
L'utente non può sapere che sta accadendo |
4. Debolezze dell'Attaccante
| Debolezza |
Spiegazione |
| Bloccabile |
AudioContext può essere disabilitato (Firefox resistFingerprinting lo blocca completamente) |
| Dipendente dal browser |
Stesso hardware + browser diversi possono produrre output diversi |
| Gli aggiornamenti driver lo cambiano |
Gli aggiornamenti del driver audio possono invalidare i fingerprint memorizzati |
| Il rumore di fondo cambia |
Il rumore ambientale influisce sull'output di DynamicsCompressor |
| Entropia inferiore alla GPU |
~8-12 bit vs ~20+ bit per WebGL |
5. Rilevamento della Manipolazione
| Tecnica |
Come Funziona |
| Rilevamento output appiattito |
Tutti i valori che restituiscono -100dB non sono naturali |
| Confronto tra letture |
Leggi il buffer audio due volte, confronta per pattern di rumore iniettato |
| Verifica latenza base |
Valori di latenza insoliti suggeriscono override |
| Coerenza frequenza campionamento |
Contraddice altri segnali (frequenza rara + browser comune) |
6. Mitigazioni per Obscura
6.1 Cosa Può Fare Obscura
| Mitigazione |
Efficacia |
Rilevabilità |
Implementazione |
| Blocca AudioContext completamente |
Alta |
Media |
JS: AudioContext → undefined |
| Appiattisci output compressore |
Media |
Alta |
Override getFloatFrequencyData |
| Blocca latenza base audio |
Bassa |
Media |
Override getter baseLatency |
| Arrotonda frequenza campionamento |
Bassa |
Bassa |
Override getter sampleRate |
6.2 Cosa Non Può Fare Obscura
| Non Può |
Perché |
| Cambiare l'elaborazione audio reale |
L'elaborazione audio è hardware locale |
| Falsificare output DynamicsCompressor |
L'output dipende dal DSP audio fisico |
| Normalizzare tra utenti |
Hardware diverso = elaborazione diversa |
| Rimuovere canali laterali di temporizzazione |
La temporizzazione audio è misurabile anche con API bloccata |
6.3 Approccio Raccomandato
1. Blocca AudioContext completamente (alto valore, basso costo)
2. Accetta rischio residuo (l'audio da solo è ~8-12 bit, insufficiente da solo)
7. Riferimenti di Ricerca
- Acar, G. et al. (2014). "The Web Never Forgets: Persistent Tracking Mechanisms in the Wild." CCS 2014.
- Englehardt, S. & Narayanan, A. (2016). "Online Tracking: A 1-million-site Measurement and Analysis." CCS 2016.
- FingerprintJS (2026). Source code:
src/sources/audio.ts.