Empreinte

Empreinte audio expliquee : comment AudioContext vous piste

Comprenez comment AudioContext et OfflineAudioContext creent des empreintes audio uniques, et comment controler la sortie audio au niveau du moteur du navigateur.

Documentation

Vous préférez la doc produit maintenue ?

Cet article a une page équivalente dans le centre de documentation. Utilisez les docs pour le flux canonique, les flags à jour et la référence durable.

Introduction

Chaque navigateur web contient un moteur de traitement audio integre. L'API Web Audio, en particulier AudioContext et OfflineAudioContext, permet aux sites web de creer, manipuler et analyser des signaux audio entierement en logiciel. Aucun acces au microphone n'est necessaire, aucun son n'est joue et aucune invite de permission n'apparait. L'API a ete concue pour des usages legitimes : jeux, applications musicales, effets audio en temps reel. Mais le meme pipeline de traitement qui fait fonctionner les applications audio produit egalement une sortie qui varie d'un appareil a l'autre. Les systemes de pistage exploitent cette variation pour generer un identifiant stable, une empreinte audio, qui persiste entre les sessions et survit a la suppression des cookies. Comprendre comment cela fonctionne est la premiere etape vers la protection de votre vie privee.

Impact sur la vie privee

L'empreinte audio est l'un des signaux de pistage les plus efficaces disponibles pour les sites web aujourd'hui. La recherche du projet WebTap de l'Universite de Princeton a revele que plus de 500 des un million de sites web les plus visites deployaient des scripts d'empreinte audio. La technique est particulierement preoccupante car elle opere silencieusement en arriere-plan. Les utilisateurs ne recoivent aucune notification, aucune boite de dialogue de permission et aucune indication visuelle que le traitement audio a lieu.

Contrairement aux cookies, les empreintes audio ne peuvent pas etre effacees par l'utilisateur. Contrairement aux adresses IP, elles ne changent pas lorsque vous changez de reseau. Une etude de 2019 publiee au IEEE Symposium on Security and Privacy a demontre que les empreintes audio restent stables entre les sessions de navigateur et peuvent atteindre des taux d'unicite superieurs a 95 % lorsqu'elles sont combinees avec seulement deux ou trois autres signaux. Le projet Panopticlick de l'Electronic Frontier Foundation a confirme que les resultats du traitement audio contribuent de maniere significative a l'unicite globale du navigateur, meme sur des configurations materielles courantes.

Le diagramme ci-dessous montre le pipeline complet qu'un traceur utilise pour convertir un rendu audio silencieux en un identifiant stable inter-sites. Chaque etape s'execute entierement en JavaScript, sans invite de permission ni son audible.

How a tracker turns AudioContext into a stable device ID 1. Tracker script loads Bundled with ad / analytics SDK 2. Build audio graph Oscillator → Compressor 3. Render silently OfflineAudioContext.startRendering 4. Sum sample buffer Σ Float32Array → SHA-256 5. POST to collector Beacon · navigator.sendBeacon 6. Match in device graph Cross-site identity link No prompt · no permission · no audible sound The full pipeline runs in under 30 ms inside any iframe. Clearing cookies, switching IP, or opening incognito does not change the sample sum.

L'etape de collecte est peu couteuse et silencieuse. La valeur reelle reside en aval dans le graphe d'appareils : chaque site qui embarque le meme traceur contribue avec la meme somme d'echantillons pour le meme appareil, et ces grappes sont reliees entre des domaines non lies. La tache du defenseur n'est donc pas de bloquer AudioContext, mais de rendre les echantillons rendus stables, realistes et coherents avec le reste de l'identite du navigateur.

Contexte technique

L'API Web Audio fournit deux interfaces principales pertinentes pour l'empreinte : AudioContext et OfflineAudioContext.

AudioContext gere le traitement audio en temps reel. Il cree un graphe audio ou les noeuds representent des operations comme l'oscillation, le controle de gain, la compression et l'analyse. Chaque noeud traite des echantillons audio, et la sortie depend du sous-systeme audio sous-jacent.

OfflineAudioContext effectue le rendu audio dans un tampon sans produire de sortie audible. C'est l'interface la plus couramment utilisee pour l'empreinte car elle s'execute rapidement et silencieusement. Une routine d'empreinte typique cree un OfflineAudioContext, connecte un OscillatorNode a un DynamicsCompressorNode, effectue le rendu d'un court tampon et lit les echantillons flottants resultants.

Pourquoi cette sortie varie-t-elle entre les appareils ? Plusieurs facteurs contribuent :

  • Differences de materiel audio. Differentes cartes son et chipsets audio implementent le traitement du signal numerique avec de legeres variations de precision en virgule flottante et de comportement d'arrondi.
  • Piles audio du systeme d'exploitation. Windows (WASAPI, DirectSound), macOS (CoreAudio) et Linux (PulseAudio, ALSA) appliquent chacun leurs propres algorithmes de reechantillonnage, gestion de tampon et strategies de mixage.
  • Implementation du moteur de navigateur. Chromium, Firefox et WebKit implementent chacun la specification Web Audio avec une precision interne differente, des optimisations de chemin rapide differentes et des flags de compilation differents.
  • Negociation du taux d'echantillonnage. Le taux d'echantillonnage par defaut varie selon l'OS et le materiel. Un systeme a 44100 Hz produit une sortie de compresseur differente d'un systeme a 48000 Hz, meme avec des noeuds et parametres identiques.

La combinaison de ces facteurs signifie que le tampon audio rendu contient des differences numeriques subtiles. Additionner tous les echantillons flottants du tampon, ou hacher une plage specifique, produit une valeur remarquablement stable pour un appareil donne mais differente entre les appareils.

Le tableau ci-dessous montre ce que les traceurs voient reellement quand la meme routine OfflineAudioContext s'execute sur quatre classes d'appareils courantes. Chaque ligne est une configuration reelle dont la somme d'echantillons devient une entree dans une base de donnees d'empreintes.

Same audio code, four device classes, four fingerprints Device class sampleRate · stack Σ samples (compressor render) Windows + Realtek HDA Win10 + Chrome desktop 44100 Hz · WASAPI shared channelCount: 2 · channelCountMode: explicit 35.7383295... SHA prefix: 4f8e21a9 macOS + CoreAudio (M2) macOS 14 + Chrome desktop 48000 Hz · CoreAudio HAL channelCount: 2 · arm64 fast path 35.7459816... SHA prefix: 7c9bd33f Linux + PulseAudio Ubuntu + Chrome desktop 44100 Hz · PulseAudio sink channelCount: 2 · resampler: speex 35.7484201... SHA prefix: a2d014be Android Chrome (Pixel) Android 14 + Chrome mobile 48000 Hz · AAudio channelCount: 2 · arm64 mobile path 35.7491672... SHA prefix: e84427d1 Un profil qui retourne le sampleRate de la ligne B tout en emettant les echantillons de la ligne A est detecte par une seule verification croisee.

Approches de protection courantes et leurs limites

Plusieurs approches tentent de traiter l'empreinte audio, mais chacune a des inconvenients significatifs.

Les VPN changent votre adresse IP mais n'ont aucun effet sur la sortie du traitement audio. L'API Web Audio fonctionne entierement au sein du navigateur, sans composant reseau. Votre empreinte audio est identique que vous vous connectiez via un VPN, un proxy ou directement.

Les extensions de navigateur qui pretendent proteger les empreintes audio fonctionnent generalement en interceptant les appels JavaScript et en ajoutant du bruit aleatoire au tampon retourne. Cette approche a trois problemes. Premierement, le motif de bruit lui-meme peut etre detecte : si un site appelle la meme routine audio deux fois et obtient des resultats differents, il sait que l'injection de bruit est active. Deuxiemement, de nombreuses extensions n'interceptent que des methodes API specifiques tout en laissant d'autres (comme AnalyserNode.getFloatFrequencyData) non modifiees, creant des incoherences detectables. Troisiemement, les extensions operent dans l'espace JavaScript et ne peuvent pas modifier le pipeline de rendu reel.

La randomisation des parametres audio (taux d'echantillonnage, nombre de canaux, etc.) casse souvent les applications web qui dependent d'une lecture audio precise. Les outils de production musicale, la videoconference et l'audio de jeu dependent tous d'un comportement audio coherent. Les valeurs aleatoires echouent egalement aux verifications de coherence : un site peut verifier que le taux d'echantillonnage rapporte correspond a la sortie de rendu reelle.

Tor Browser adopte une approche plus rigoureuse en standardisant la sortie audio pour tous les utilisateurs. Cependant, cela cree une empreinte partagee unique qui devient elle-meme un identifiant, signalant que vous etes un utilisateur Tor.

Le probleme fondamental est qu'une protection efficace de l'empreinte audio necessite un controle sur le moteur de rendu reel, pas seulement sur la surface de l'API JavaScript.

Le diagramme ci-dessous empile les quatre modeles courants de defense audio face a la verification croisee qu'effectue un systeme moderne d'empreinte. Chaque modele au-dessus de la couche moteur laisse une incoherence mesurable entre les parametres rapportes et les echantillons rendus.

Defense layers and the cross-check that breaks each one 1. Block AudioContext entirely new AudioContext() throws. Real browsers almost always succeed. Detection: presence of working Web Audio API is itself a baseline check. 2. JS shim noise on getFloatFrequencyData Wraps a few methods, leaves OfflineAudioContext rendering native. Detection: render twice, hashes diverge → noise wrapper detected. 3. Randomize sampleRate or channelCount Reported rate drifts but compressor output still uses real engine numerics. Detection: claimed 48000 Hz · macOS, sample sum matches Windows 44100 Hz row. 4. Engine-level rendering control (BotBrowser) Sample rate, compressor numerics, and AnalyserNode all bound to the same profile. No JavaScript wrapper to detect. No mismatch between reported rate and rendered samples. Same profile + same noise seed reproduces identical sample sums across hosts.

L'approche au niveau du moteur de BotBrowser

BotBrowser traite l'empreinte audio a la source : le moteur de rendu Chromium lui-meme. Plutot que d'intercepter les appels JavaScript ou d'injecter du bruit depuis une extension, BotBrowser modifie la facon dont l'audio est traite en interne.

Lorsque vous chargez un profil d'empreinte, BotBrowser configure le sous-systeme audio pour correspondre a l'appareil cible. Cela inclut :

Alignement du taux d'echantillonnage. La propriete AudioContext.sampleRate et le taux d'echantillonnage de rendu reel correspondent a la plateforme cible du profil. Un profil Windows 10 rapporte et effectue le rendu au taux d'echantillonnage typique pour cette configuration.

Controle du pipeline de traitement. Les noeuds internes de traitement audio (OscillatorNode, DynamicsCompressorNode, BiquadFilterNode et autres) produisent une sortie coherente avec l'appareil profile. Il ne s'agit pas de changer un seul nombre. Toute la chaine de traitement, y compris la precision flottante intermediaire et le comportement d'arrondi, s'aligne avec la plateforme cible.

Rendu OfflineAudioContext. Le tampon rendu par OfflineAudioContext contient des valeurs d'echantillons qui correspondent a ce que l'appareil profile produirait. Parce que BotBrowser controle le rendu au niveau du moteur, la sortie est coherente quel que soit votre materiel reel.

Coherence AnalyserNode. Les methodes comme getFloatFrequencyData, getByteFrequencyData, getFloatTimeDomainData et getByteTimeDomainData retournent toutes des valeurs derivees du meme pipeline de traitement controle. Il n'y a pas de lacune ou une API retourne une sortie controlee et une autre retourne une sortie native.

Integration de graine de bruit. Avec le flag --bot-noise-seed, BotBrowser applique une variation deterministe a la sortie audio. La meme graine produit toujours la meme empreinte audio, ce qui est utile pour maintenir des identites stables entre les sessions. Des graines differentes produisent des empreintes differentes mais coherentes en interne.

L'avantage cle de cette approche est la completude. Chaque surface API liee a l'audio retourne des valeurs derivees du meme moteur controle. Il n'y a pas d'incoherences entre ce que AudioContext rapporte et ce que OfflineAudioContext rend.

Configuration et utilisation

Chargement de profil de base

La configuration la plus simple charge un profil d'empreinte qui inclut les parametres audio :

chrome --bot-profile="/path/to/profile.enc" \
       --user-data-dir="$(mktemp -d)"

Ce seul flag configure tout le comportement lie a l'audio pour correspondre a l'appareil profile.

Audio deterministe avec graine de bruit

Pour des empreintes audio reproductibles entre les sessions :

chrome --bot-profile="/path/to/profile.enc" \
       --bot-noise-seed=42 \
       --user-data-dir="$(mktemp -d)"

La meme combinaison de profil et de graine produit toujours la meme empreinte audio. Changez la graine pour obtenir une empreinte differente mais toujours coherente.

Integration Playwright

const { chromium } = require('playwright');

const browser = await chromium.launch({
  executablePath: '/path/to/botbrowser/chrome',
  args: [
    '--bot-profile=/path/to/profile.enc',
    '--bot-noise-seed=42'
  ]
});

const page = await browser.newPage();
await page.goto('https://example.com');

Integration Puppeteer

const puppeteer = require('puppeteer');

const browser = await puppeteer.launch({
  executablePath: '/path/to/botbrowser/chrome',
  defaultViewport: null,
  args: [
    '--bot-profile=/path/to/profile.enc',
    '--bot-noise-seed=42'
  ]
});

const page = await browser.newPage();
await page.goto('https://example.com');

Desactivation du bruit audio

Si vous avez besoin de l'empreinte audio de base du profil sans variation de bruit supplementaire :

chrome --bot-profile="/path/to/profile.enc" \
       --bot-config-noise-audio-context=false \
       --user-data-dir="$(mktemp -d)"

Verification

Pour confirmer que la protection de l'empreinte audio fonctionne, vous pouvez comparer la sortie entre les sessions.

Verification de coherence. Executez la meme routine d'empreinte audio (creer un OfflineAudioContext, rendre un tampon, additionner les echantillons) dans deux sessions de navigateur separees avec le meme profil et la meme graine de bruit. Les resultats doivent etre identiques.

Verification inter-materiel. Executez le meme test sur deux machines physiques differentes avec le meme profil et la meme graine. L'empreinte audio doit correspondre, confirmant que votre materiel reel n'influence pas la sortie.

Verification de completude API. Verifiez que AudioContext.sampleRate, la sortie de tampon OfflineAudioContext et les donnees de frequence AnalyserNode s'alignent tous avec le profil charge. Des incoherences entre ces API indiqueraient une protection incomplete.

Vous pouvez visiter des sites de test d'empreinte comme BrowserLeaks ou CreepJS pour comparer votre empreinte audio aux valeurs attendues pour votre profil charge.

La matrice de verification ci-dessous montre a quoi ressemble le succes sur trois hotes executant le meme profil. sampleRate identique, somme d'echantillons du compresseur identique, hash AnalyserNode identique, quel que soit le materiel hote ou le systeme d'exploitation.

Cross-platform verification: same profile, identical audio signature Windows host running BotBrowser profile = mac_arm64.enc seed = 100 sampleRate · channelCount 48000 Hz · 2 CoreAudio (profile) Σ samples: 35.7459816 analyser hash: 7c9bd33f macOS host running BotBrowser profile = mac_arm64.enc seed = 100 sampleRate · channelCount 48000 Hz · 2 CoreAudio (profile) Σ samples: 35.7459816 analyser hash: 7c9bd33f Linux host (Xvfb) running BotBrowser profile = mac_arm64.enc seed = 100 sampleRate · channelCount 48000 Hz · 2 CoreAudio (profile) Σ samples: 35.7459816 analyser hash: 7c9bd33f Meme profil + meme graine = sampleRate identique, somme du compresseur identique, hash AnalyserNode identique. Valeurs rapportees et rendues restent alignees.

Bonnes pratiques

  • Utilisez toujours un profil. Executer BotBrowser sans --bot-profile signifie que la sortie audio provient de votre materiel natif. Le profil est ce qui fournit la protection.
  • Utilisez --bot-noise-seed pour des identites stables. Si vous avez besoin de la meme empreinte entre les sessions, definissez une graine coherente. Sans graine, le bruit varie entre les lancements.
  • Faites correspondre votre profil a votre cas d'utilisation. Un profil Windows produit une sortie audio typique de Windows. Si l'IP de votre proxy geolocalisee dans une region ou macOS est courant, envisagez un profil macOS.
  • Ne desactivez pas le bruit audio sans raison. Le flag --bot-config-noise-audio-context=false supprime une couche importante de variation. Gardez-le active a moins d'avoir un besoin specifique de l'empreinte de base du profil.
  • Combinez avec d'autres protections. L'empreinte audio est un signal parmi d'autres. Utilisez un profil complet qui controle egalement Canvas, WebGL, les polices et les proprietes du navigator.

FAQ

Q : L'empreinte audio necessite-t-elle un acces au microphone ? R : Non. L'empreinte audio utilise les capacites de synthese et de traitement de l'API Web Audio. Aucun microphone, aucune permission et aucun son audible ne sont impliques. Elle fonctionne entierement en logiciel.

Q : Puis-je detecter si un site web execute un script d'empreinte audio ? R : En principe, vous pourriez surveiller la creation d'AudioContext et d'OfflineAudioContext dans DevTools. En pratique, les scripts de pistage obfusquent souvent leurs appels. BotBrowser vous protege que vous detectiez le script ou non.

Q : La graine de bruit affecte-t-elle la qualite de lecture audio ? R : Non. La graine de bruit controle la variation numerique subtile dans les sorties API pertinentes pour l'empreinte. La lecture audio normale (musique, video, appels vocaux) n'est pas affectee.

Q : A quel point l'empreinte audio est-elle stable avec une graine de bruit fixe ? R : Completement stable. Le meme profil et la meme graine produisent toujours les memes valeurs d'empreinte audio entre les sessions, les redemarrages et les differentes machines.

Q : Que se passe-t-il si j'utilise des graines de bruit differentes avec le meme profil ? R : Chaque graine produit une empreinte audio differente mais toujours coherente en interne. C'est utile pour executer plusieurs sessions qui ont besoin d'empreintes distinctes mais valides.

Q : BotBrowser protege-t-il contre l'empreinte basee sur AudioWorklet ? R : Oui. AudioWorklet s'execute dans le meme pipeline de traitement audio que BotBrowser controle. La sortie du worklet est derivee des memes composants internes du moteur controle.

Q : L'empreinte audio est-elle coherente entre les modes headless et avec interface ? R : Oui. Le controle audio de BotBrowser opere au niveau du moteur, independamment de la visibilite de la fenetre du navigateur.

Resume

L'empreinte audio exploite la variation naturelle de la facon dont differents appareils traitent les signaux audio via l'API Web Audio. Parce qu'elle ne necessite aucune permission et ne produit aucun effet visible, c'est l'une des methodes de pistage les plus difficiles a detecter ou prevenir pour les utilisateurs. BotBrowser controle la sortie audio au niveau du moteur Chromium, garantissant que AudioContext, OfflineAudioContext et AnalyserNode produisent tous des resultats coherents avec le profil d'empreinte charge. Combine avec le flag --bot-noise-seed pour une sortie deterministe, BotBrowser fournit une protection des empreintes numeriques audio complete et verifiable.

Pour des sujets connexes, consultez Qu'est-ce que l'empreinte de navigateur, Protection de l'empreinte WebGL, Empreinte Canvas et Comportement deterministe du navigateur.

#Audio#fingerprinting#Audiocontext#Privacy

Faites passer BotBrowser de la recherche à la production

Utilisez ces guides pour comprendre le modèle, puis passez à la validation multi-plateforme, aux contextes isolés et au déploiement navigateur prêt pour l'échelle.