Saltar al contenido principal
es/blog/obscura/research/uncontrollable/audio-hardware/

obscura/research/uncontrollable/audio-hardware

4 min de lectura

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) // Específico del hardware

Entropía: ~8-12 bits

Estabilidad: Alta entre sesiones, moderada entre actualizaciones del navegador

2.2 Latencia Base de AudioContext

const ctx = new AudioContext()
// baseLatency refleja la latencia del hardware de audio en segundos
const latency = ctx.baseLatency  // ej., 0.0026666666666666665

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.