Categoría: Hardware / Procesamiento de Audio
1. Descripción
El fingerprinting de audio usa la Web Audio API para medir cómo el hardware de audio y la pila de software de un dispositivo procesan el sonido. El AudioContext, OscillatorNode y DynamicsCompressorNode producen una salida que varía según:
- Implementación del controlador de audio (ALSA, PulseAudio, PipeWire, CoreAudio, WASAPI)
- Características del hardware DAC/ADC
- Algoritmos de conversión de frecuencia de muestreo
- Comportamiento de compresión de dinámicas (curvas de threshold, knee, ratio)
- Manejo de búferes de audio y latencia
- Diferencias de implementación FFT
2. Vectores
2.1 Fingerprinting de 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)
Entropía: ~8-12 bits
Estabilidad: Alta entre sesiones, moderada entre actualizaciones del navegador
2.2 Latencia Base de AudioContext
const ctx = new AudioContext()
const latency = ctx.baseLatency
Entropía: ~4-6 bits
Estabilidad: Muy Alta — dependiente del hardware
2.3 Señales de Audio Adicionales
| Señal |
Descripción |
Entropía |
sampleRate |
Frecuencia de muestreo del contexto de audio (44100, 48000, etc.) |
~1-2 bits |
maxChannelCount |
Máximo de canales de audio soportados |
~1-2 bits |
| Channel count mode |
'explicit' vs 'clamped-max' vs 'max' |
~1-2 bits |
| Variaciones de FFT size |
Diferentes implementaciones FFT |
~2-3 bits |
3. Fortalezas del Atacante
| Fortaleza |
Explicación |
| Bloqueado al hardware |
El fingerprint de audio está determinado por el hardware y controladores de audio |
| Sin permiso requerido |
AudioContext puede crearse sin consentimiento del usuario |
| Rápido |
La generación de fingerprint toma ~50-100ms |
| Segundo plano |
No reproduce sonido audible |
| Usuario pasivo |
El usuario no puede saber que está ocurriendo |
4. Debilidades del Atacante
| Debilidad |
Explicación |
| Bloqueable |
AudioContext puede deshabilitarse (Firefox resistFingerprinting lo bloquea por completo) |
| Dependiente del navegador |
Mismo hardware + diferentes navegadores pueden producir diferentes salidas |
| Las actualizaciones de controladores lo cambian |
Las actualizaciones de controladores de audio pueden invalidar fingerprints almacenados |
| El piso de ruido cambia |
El ruido de fondo afecta la salida de DynamicsCompressor |
| Menor entropía que GPU |
~8-12 bits vs ~20+ bits para WebGL |
5. Detección de Manipulación
| Técnica |
Cómo Funciona |
| Detección de salida aplanada |
Todos los valores devolviendo -100dB no es natural |
| Comparación entre lecturas |
Leer el búfer de audio dos veces, comparar patrones de ruido inyectado |
| Verificación de latencia base |
Valores de latencia inusuales sugieren anulación |
| Consistencia de frecuencia de muestreo |
Contradice otras señales (frecuencia de muestreo rara + navegador común) |
6. Mitigaciones para Obscura
6.1 Lo Que Obscura Puede Hacer
| Mitigación |
Efectividad |
Detectabilidad |
Implementación |
| Bloquear AudioContext por completo |
Alta |
Media |
JS: AudioContext → undefined |
| Aplanar salida del compresor |
Media |
Alta |
Anular getFloatFrequencyData |
| Bloquear latencia base de audio |
Baja |
Media |
Anular getter de baseLatency |
| Redondear frecuencia de muestreo |
Baja |
Baja |
Anular getter de sampleRate |
6.2 Lo Que Obscura No Puede Hacer
| No Puede |
Por Qué |
| Cambiar el procesamiento de audio real |
El procesamiento de audio es hardware local |
| Falsificar la salida de DynamicsCompressor |
La salida depende del DSP de audio físico |
| Normalizar entre usuarios |
Diferente hardware → diferente procesamiento |
| Eliminar canales laterales de temporización |
La temporización de audio es medible incluso con la API bloqueada |
6.3 Enfoque Recomendado
1. Bloquear AudioContext por completo (alto valor, bajo costo)
2. Aceptar riesgo residual (solo audio es ~8-12 bits, insuficiente solo)
7. Referencias de Investigación
- 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). Código fuente:
src/sources/audio.ts.