Huella digital

Huella de audio explicada: Cómo AudioContext te rastrea

Comprende cómo AudioContext y OfflineAudioContext crean huellas de audio únicas, y cómo controlar la salida de audio a nivel del motor del navegador.

Documentación

Prefieres la documentación del producto mantenida?

Este artículo tiene una página equivalente en el centro de documentación. Usa los docs para el flujo canónico, las flags actuales y la referencia duradera.

Introducción

Cada navegador web contiene un motor de procesamiento de audio integrado. La Web Audio API, específicamente AudioContext y OfflineAudioContext, permite a los sitios web crear, manipular y analizar señales de audio completamente en software. No se necesita acceso al micrófono, no se reproduce ningún sonido y no aparece ningún aviso de permiso. La API fue diseñada para propósitos legítimos: juegos, aplicaciones musicales, efectos de audio en tiempo real. Pero el mismo pipeline de procesamiento que hace funcionar las aplicaciones de audio también produce una salida que varía de un dispositivo a otro. Los sistemas de rastreo explotan esta variación para generar un identificador estable, una huella de audio, que persiste entre sesiones y sobrevive a la eliminación de cookies. Comprender cómo funciona esto es el primer paso para proteger tu privacidad.

Impacto en la privacidad

La huella de audio es una de las señales de rastreo más efectivas disponibles para los sitios web actualmente. La investigación del proyecto WebTap de la Universidad de Princeton encontró que más de 500 de los principales 1 millón de sitios web desplegaban scripts de huella de audio. La técnica es particularmente preocupante porque opera silenciosamente en segundo plano. Los usuarios no reciben notificación, ni diálogo de permisos, ni indicación visual de que se está realizando procesamiento de audio.

A diferencia de las cookies, las huellas de audio no pueden ser borradas por el usuario. A diferencia de las direcciones IP, no cambian cuando cambias de red. Un estudio de 2019 publicado en el IEEE Symposium on Security and Privacy demostró que las huellas de audio permanecen estables entre sesiones del navegador y pueden alcanzar tasas de unicidad superiores al 95% cuando se combinan con solo dos o tres señales adicionales. El proyecto Panopticlick de la Electronic Frontier Foundation confirmó que los resultados del procesamiento de audio contribuyen significativamente a la unicidad general del navegador, incluso en configuraciones de hardware comunes.

El diagrama siguiente muestra el pipeline completo que un rastreador usa para convertir el renderizado silencioso de audio en un identificador estable entre sitios. Cada paso se ejecuta enteramente en JavaScript, sin aviso de permiso ni sonido 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.

El paso de recolección es barato y silencioso. El valor real está aguas abajo en el grafo de dispositivos: cada sitio que incluye el mismo rastreador aporta la misma suma de muestras para el mismo dispositivo, y esos clústers se enlazan entre dominios no relacionados. La tarea del defensor no es bloquear AudioContext, sino hacer que las muestras renderizadas sean estables, realistas y consistentes con el resto de la identidad del navegador.

Antecedentes técnicos

La Web Audio API proporciona dos interfaces principales relevantes para la generación de huellas: AudioContext y OfflineAudioContext.

AudioContext gestiona el procesamiento de audio en tiempo real. Crea un grafo de audio donde los nodos representan operaciones como oscilación, control de ganancia, compresión y análisis. Cada nodo procesa muestras de audio, y la salida depende del subsistema de audio subyacente.

OfflineAudioContext renderiza audio en un búfer sin producir salida audible. Esta es la interfaz más utilizada para generar huellas porque se ejecuta rápidamente y en silencio. Una rutina típica de huella crea un OfflineAudioContext, conecta un OscillatorNode a un DynamicsCompressorNode, renderiza un búfer corto y lee las muestras float resultantes.

¿Por qué varía esta salida entre dispositivos? Varios factores contribuyen:

  • Diferencias de hardware de audio. Diferentes tarjetas de sonido y chipsets de audio implementan el procesamiento de señal digital con ligeras variaciones en la precisión de punto flotante y el comportamiento de redondeo.
  • Pilas de audio del sistema operativo. Windows (WASAPI, DirectSound), macOS (CoreAudio) y Linux (PulseAudio, ALSA) cada uno aplica sus propios algoritmos de remuestreo, manejo de búfer y estrategias de mezcla.
  • Implementación del motor del navegador. Chromium, Firefox y WebKit implementan la especificación Web Audio con diferente precisión interna, diferentes optimizaciones de ruta rápida y diferentes flags de compilación.
  • Negociación de tasa de muestreo. La tasa de muestreo predeterminada varía según el sistema operativo y hardware. Un sistema de 44100 Hz produce una salida de compresor diferente a un sistema de 48000 Hz, incluso con nodos y parámetros idénticos.

La combinación de estos factores significa que el búfer de audio renderizado contiene diferencias numéricas sutiles. Sumar todas las muestras float del búfer, o hacer un hash de un rango específico, produce un valor que es notablemente estable para un dispositivo dado pero diferente entre dispositivos.

La tabla siguiente muestra lo que los rastreadores realmente ven cuando la misma rutina OfflineAudioContext se ejecuta en cuatro clases de dispositivo comunes. Cada fila es una configuración real cuya suma de muestras se convierte en una entrada en una base de datos de huellas.

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 perfil que devuelve la sampleRate de la fila B mientras emite muestras de la fila A queda detectado con una sola verificación cruzada.

Enfoques comunes de protección y sus limitaciones

Varios enfoques intentan abordar la huella de audio, pero cada uno tiene inconvenientes significativos.

Las VPN cambian tu dirección IP pero no tienen ningún efecto en la salida del procesamiento de audio. La Web Audio API opera completamente dentro del navegador, sin componente de red. Tu huella de audio es idéntica ya sea que te conectes a través de una VPN, un proxy o directamente.

Las extensiones de navegador que dicen proteger las huellas de audio típicamente funcionan interceptando llamadas JavaScript y añadiendo ruido aleatorio al búfer devuelto. Este enfoque tiene tres problemas. Primero, el patrón de ruido en sí puede ser detectado: si un sitio llama a la misma rutina de audio dos veces y obtiene resultados diferentes, sabe que la inyección de ruido está activa. Segundo, muchas extensiones solo interceptan métodos específicos de la API dejando otros (como AnalyserNode.getFloatFrequencyData) sin modificar, creando inconsistencias detectables. Tercero, las extensiones operan en el espacio JavaScript y no pueden modificar el pipeline de renderizado real.

La aleatorización de parámetros de audio (tasa de muestreo, conteo de canales, etc.) frecuentemente rompe aplicaciones web que dependen de la reproducción precisa de audio. Las herramientas de producción musical, videoconferencia y audio de juegos dependen de un comportamiento de audio consistente. Los valores aleatorios también fallan en las comprobaciones de consistencia: un sitio puede verificar que la tasa de muestreo reportada coincida con la salida de renderizado real.

Tor Browser toma un enfoque más principista estandarizando la salida de audio en todos los usuarios. Sin embargo, esto crea una única huella compartida que en sí misma se convierte en un identificador, señalando que eres un usuario de Tor.

El problema fundamental es que la protección efectiva de huellas de audio requiere control sobre el motor de renderizado real, no solo sobre la superficie de la API JavaScript.

El diagrama siguiente apila los cuatro modelos comunes de defensa de audio frente a la verificación cruzada que ejecuta un sistema moderno de huella. Cada modelo por encima de la capa del motor deja una discrepancia medible entre los parámetros reportados y las muestras renderizadas.

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.

Enfoque a nivel del motor de BotBrowser

BotBrowser aborda la huella de audio en la fuente: el motor de renderizado de Chromium. En lugar de interceptar llamadas JavaScript o inyectar ruido desde una extensión, BotBrowser modifica cómo se procesa el audio internamente.

Cuando cargas un perfil de huella, BotBrowser configura el subsistema de audio para coincidir con el dispositivo objetivo. Esto incluye:

Alineación de tasa de muestreo. La propiedad AudioContext.sampleRate y la tasa de muestreo de renderizado real coinciden con la plataforma objetivo del perfil. Un perfil de Windows 10 reporta y renderiza a la tasa de muestreo típica para esa configuración.

Control del pipeline de procesamiento. Los nodos internos de procesamiento de audio (OscillatorNode, DynamicsCompressorNode, BiquadFilterNode y otros) producen una salida consistente con el dispositivo perfilado. No se trata de cambiar un solo número. Toda la cadena de procesamiento, incluyendo la precisión float intermedia y el comportamiento de redondeo, se alinea con la plataforma objetivo.

Renderizado de OfflineAudioContext. El búfer renderizado por OfflineAudioContext contiene valores de muestra que coinciden con lo que produciría el dispositivo perfilado. Debido a que BotBrowser controla el renderizado a nivel del motor, la salida es consistente independientemente de tu hardware real.

Consistencia de AnalyserNode. Métodos como getFloatFrequencyData, getByteFrequencyData, getFloatTimeDomainData y getByteTimeDomainData devuelven valores derivados del mismo pipeline de procesamiento controlado. No hay brechas donde una API devuelva salida controlada y otra devuelva salida nativa.

Integración de semilla de ruido. Con el flag --bot-noise-seed, BotBrowser aplica variación determinista a la salida de audio. La misma semilla siempre produce la misma huella de audio, lo cual es útil para mantener identidades estables entre sesiones. Diferentes semillas producen huellas diferentes pero internamente consistentes.

La ventaja clave de este enfoque es la completitud. Toda la superficie de API relacionada con audio devuelve valores derivados del mismo motor controlado. No hay inconsistencias entre lo que AudioContext reporta y lo que OfflineAudioContext renderiza.

Configuración y uso

Carga básica de perfil

La configuración más simple carga un perfil de huella que incluye parámetros de audio:

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

Este único flag configura todo el comportamiento relacionado con audio para coincidir con el dispositivo perfilado.

Audio determinista con semilla de ruido

Para huellas de audio reproducibles entre sesiones:

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

La misma combinación de perfil y semilla siempre produce la misma huella de audio. Cambia la semilla para obtener una huella diferente pero igualmente consistente.

Integración con 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');

Integración con 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');

Desactivar ruido de audio

Si necesitas la huella de audio base del perfil sin variación de ruido adicional:

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

Verificación

Para confirmar que la protección de huella de audio está funcionando, puedes comparar la salida entre sesiones.

Comprobación de consistencia. Ejecuta la misma rutina de huella de audio (crea un OfflineAudioContext, renderiza un búfer, suma las muestras) en dos sesiones separadas del navegador con el mismo perfil y semilla de ruido. Los resultados deben ser idénticos.

Comprobación entre hardware. Ejecuta la misma prueba en dos máquinas físicas diferentes con el mismo perfil y semilla. La huella de audio debe coincidir, confirmando que tu hardware real no está influyendo en la salida.

Comprobación de completitud de API. Verifica que AudioContext.sampleRate, la salida del búfer de OfflineAudioContext y los datos de frecuencia de AnalyserNode se alineen con el perfil cargado. Las inconsistencias entre estas APIs indicarían protección incompleta.

Puedes visitar sitios de prueba de huellas como BrowserLeaks o CreepJS para comparar tu huella de audio con los valores esperados para tu perfil cargado.

La matriz de verificación siguiente muestra cómo se ve el éxito en tres hosts ejecutando el mismo perfil. sampleRate idéntico, suma de muestras del compresor idéntica, hash de AnalyserNode idéntico, independientemente del hardware del host o del sistema operativo.

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 Mismo perfil + misma semilla = sampleRate idéntico, suma de compresor idéntica, hash de AnalyserNode idéntico. Valores reportados y renderizados permanecen alineados.

Mejores prácticas

  • Siempre usa un perfil. Ejecutar BotBrowser sin --bot-profile significa que la salida de audio proviene de tu hardware nativo. El perfil es lo que proporciona protección.
  • Usa --bot-noise-seed para identidades estables. Si necesitas la misma huella entre sesiones, configura una semilla consistente. Sin semilla, el ruido varía entre lanzamientos.
  • Asocia tu perfil con tu caso de uso. Un perfil de Windows produce salida de audio típica de Windows. Si tu IP de proxy geolocaliza a una región donde macOS es común, considera un perfil de macOS.
  • No desactives el ruido de audio sin razón. El flag --bot-config-noise-audio-context=false elimina una capa importante de variación. Mantenlo habilitado a menos que tengas una necesidad específica de la huella base del perfil.
  • Combina con otras protecciones. La huella de audio es una señal entre muchas. Usa un perfil completo que también controle Canvas, WebGL, fuentes y propiedades del navigator.

FAQ

P: ¿La huella de audio requiere acceso al micrófono? R: No. La huella de audio utiliza las capacidades de síntesis y procesamiento de la Web Audio API. No se involucra ningún micrófono, ningún permiso y ningún sonido audible. Opera completamente en software.

P: ¿Puedo detectar si un sitio web está ejecutando un script de huella de audio? R: En principio, podrías monitorear la creación de AudioContext y OfflineAudioContext en DevTools. En la práctica, los scripts de rastreo frecuentemente ofuscan sus llamadas. BotBrowser te protege independientemente de si detectas el script.

P: ¿La semilla de ruido afecta la calidad de reproducción de audio? R: No. La semilla de ruido controla la variación numérica sutil en las salidas de API relevantes para huellas. La reproducción normal de audio (música, video, llamadas de voz) no se ve afectada.

P: ¿Qué tan estable es la huella de audio con una semilla de ruido fija? R: Completamente estable. El mismo perfil y semilla siempre producen los mismos valores de huella de audio entre sesiones, reinicios y diferentes máquinas.

P: ¿Qué pasa si uso diferentes semillas de ruido con el mismo perfil? R: Cada semilla produce una huella de audio diferente que sigue siendo internamente consistente. Esto es útil para ejecutar múltiples sesiones que necesitan huellas distintas pero válidas.

P: ¿BotBrowser protege contra la huella basada en AudioWorklet? R: Sí. AudioWorklet se ejecuta dentro del mismo pipeline de procesamiento de audio que BotBrowser controla. La salida del worklet se deriva de los mismos componentes internos controlados del motor.

P: ¿La huella de audio es consistente entre el modo headless y con ventana? R: Sí. El control de audio de BotBrowser opera a nivel del motor, independientemente de si la ventana del navegador es visible.

Resumen

La huella de audio explota la variación natural en cómo diferentes dispositivos procesan señales de audio a través de la Web Audio API. Debido a que no requiere permisos y no produce efectos visibles, es uno de los métodos de rastreo más difíciles de detectar o prevenir para los usuarios. BotBrowser controla la salida de audio a nivel del motor de Chromium, asegurando que AudioContext, OfflineAudioContext y AnalyserNode produzcan resultados consistentes con el perfil de huella cargado. Combinado con el flag --bot-noise-seed para salida determinista, BotBrowser proporciona protección de huella de audio completa y verificable.

Para temas relacionados, consulta Qué es la huella del navegador, Protección de huella WebGL, Huella Canvas y Comportamiento determinista del navegador.

#Audio#fingerprinting#Audiocontext#Privacy

Lleva BotBrowser de la investigación a producción

Usa estas guías para entender el modelo y después avanzar hacia validación multiplataforma, contextos aislados y despliegue de navegador preparado para escalar.