Saltar al contenido principal
fr/blog/obscura/research/audio-fingerprinting/

obscura/research/audio-fingerprinting

2 min de lecture

Aperçu

L'empreinte audio utilise l'API Web Audio (AudioContext) pour générer un identifiant unique basé sur la façon dont le matériel et le logiciel audio de l'appareil traitent un signal généré.

Mécanisme

  1. Créer un AudioContext
  2. Générer un signal d'oscillateur (onde sinusoïdale à une fréquence spécifique)
  3. Traiter via DynamicsCompressorNode
  4. Extraire le signal traité via getChannelData()
  5. Hacher le tableau de nombres à virgule flottante résultant
const ctx = new AudioContext()
const osc = ctx.createOscillator()
const compressor = ctx.createDynamicsCompressor()
osc.connect(compressor)
compressor.connect(ctx.destination)

// Paramètres du compresseur
compressor.threshold.value = -50
compressor.knee.value = 40
compressor.ratio.value = 12
compressor.reduction.value = -20
osc.frequency.value = 1000
osc.type = 'sawtooth'

// Traiter et extraire
const analyser = ctx.createAnalyser()
const buffer = new Float32Array(analyser.fftSize)
analyser.getFloatFrequencyData(buffer)
const hash = md5(buffer) // unique par pile audio

Sources d'Entropie

Source Variabilité
Pilote audio et matériel Élevée
Support du taux d'échantillonnage Moyenne
Implémentation du traitement dynamique Moyenne
Pile audio OS (PulseAudio, ALSA, CoreAudio, WASAPI) Élevée
Nombre de canaux audio Faible

Atténuation

Au niveau du proxy

L'AudioContext s'exécute entièrement dans le navigateur — le proxy ne peut pas modifier sa sortie.

Via JS injecté

Surcharger AudioContext.prototype.getChannelData ou AnalyserNode.prototype.getFloatFrequencyData pour retourner des données génériques/plates.

// Surcharge injectée
const originalGetFloatFrequencyData = AnalyserNode.prototype.getFloatFrequencyData
AnalyserNode.prototype.getFloatFrequencyData = function(array) {
  originalGetFloatFrequencyData.call(this, array)
  // Aplatir/bruiter la sortie
  for (let i = 0; i < array.length; i++) {
    array[i] = -100 // signal plat
  }
}

Problème : Le site peut détecter la manipulation en vérifiant si la sortie est trop uniforme par rapport à une sortie matérielle réelle.

Conclusions

  • L'empreinte audio est spécifique au CPU/OS/matériel
  • Ne peut pas être usurpée au niveau proxy
  • L'injection JS peut l'émousser mais pas complètement
  • Meilleure approche : surcharge + bruit cohérent via JS injecté