⏱️ Lectura: 15 min

Un teléfono conectado por Bluetooth a unos audífonos con soporte multipunto dejó de reproducir audio apenas se abrió una pestaña de AliExpress en Firefox, sin video, sin música y con la pestaña completamente muda. El hallazgo, documentado por el desarrollador que firma como laserphile, señala a dos objetos AudioContext ocultos que la página crea para aplicar fingerprinting con WebAudio sobre el navegador.

📑 En este artículo
  1. TL;DR
  2. Qué pasó
  3. Contexto e historia
  4. Detalles técnicos: cómo arma AliExpress el fingerprinting con WebAudio
  5. Cómo probarlo en tu propio navegador
  6. Impacto y análisis: fraude legítimo, rastreo sin aviso
  7. Qué sigue
  8. Preguntas frecuentes
    1. ¿Qué es el fingerprinting con WebAudio?
    2. ¿Por qué se corta el audio de mis audífonos Bluetooth?
    3. ¿Cómo puedo bloquear este tipo de scripts?
    4. ¿Es ilegal que AliExpress haga esto?
    5. ¿Qué otros datos recolectan estos scripts?
    6. ¿Afecta solo a AliExpress?
  9. Referencias

El efecto colateral, cortar el audio del teléfono, resultó ser la pista que llevó a destapar el mecanismo. No hay ningún elemento <audio> ni <video> en el DOM, ni llamadas visibles a reproducir contenido: el rastreo corre en silencio, literalmente con el volumen en cero.

TL;DR

  • Un desarrollador detectó que AliExpress corta el audio Bluetooth de su teléfono al abrir la página en Firefox o Chrome.
  • La causa no es un video oculto: son dos objetos AudioContext creados por los scripts collina.js y fireyejs.js de Alibaba.
  • Ambos AudioContext arman un grafo: oscilador sawtooth, AnalyserNode, ScriptProcessorNode y GainNode en cero conectado al destino de audio.
  • El volumen final es cero, pero el navegador igual procesa el audio en tiempo real, lo que mantiene activo el canal de sonido del sistema.
  • Los mismos scripts también miden canvas, WebGL, memoria del dispositivo, hardwareConcurrency, WebRTC y eventos de mouse y touch.
  • Los scripts residen bajo un directorio identificado como AWSC, asociado a las herramientas antifraude de Alibaba.
  • El hallazgo se reprodujo interceptando el constructor de AudioContext y el método connect() de AudioNode con JavaScript.

Qué pasó

El autor del hallazgo usa audífonos Bluetooth con soporte multipunto, la función que permite mantener dos conexiones activas a la vez, por ejemplo una PC y un teléfono. En su configuración habitual, la PC tiene prioridad para reproducir audio (notificaciones, video de YouTube) mientras el teléfono queda disponible para música cuando la PC está en silencio. Ese esquema funcionaba de forma confiable hasta que abría una pestaña de AliExpress en Firefox o Chrome: poco después de cargar la página de inicio, el audio del teléfono se detenía por completo. Cerrar la pestaña de AliExpress resolvía el problema de inmediato. Silenciar la pestaña, el navegador o el volumen de Windows no cambiaba nada, y no había ningún video, música ni otro medio visible reproduciéndose en la página.

La primera hipótesis fue la más obvia: un video autoreproducible de producto o un banner publicitario. La revisión descartó esa opción rápido. No había elementos <audio> ni <video> en el DOM, ninguna llamada a HTMLMediaElement.play(), la Media Session API reportaba navigator.mediaSession.playbackState en 'none', y tampoco había peticiones de red hacia archivos multimedia ni iframes con contenido reproducible.

Una pista importante: el problema no aparecía al instante, sino después de que la página llevara varios segundos inactiva. Eso llevó a instrumentar el navegador antes de cargar la página, esta vez observando directamente la Web Audio API en lugar de los elementos de medios tradicionales. El método consistió en envolver el constructor de AudioContext para registrar cada instancia creada, junto con su estado y el stack trace de dónde se originaba la llamada, y envolver también AudioNode.prototype.connect() para ver qué se conectaba al destino de audio.

Con esa instrumentación activa, la captura reveló dos objetos AudioContext separados durante una carga en reposo de la página de inicio de AliExpress. Ambos entraban en estado running y ambos conectaban nodos al destino de audio del navegador, todo mientras seguía sin haber elementos de video o audio visibles, llamadas a reproducir, actividad de Media Session ni sonido audible. Los stack traces de ambos contextos apuntaban a dos scripts: uno servido como collina.js y otro como fireyejs.js, ambos alojados bajo un directorio identificado como AWSC en la infraestructura de Alibaba.

Diagrama conceptual de fingerprinting de audio en el navegador
El grafo de audio corre en segundo plano, sin ningún audio visible en el DOM. Foto de Vitaly Gariev en Unsplash

Contexto e historia

El fingerprinting con WebAudio no es una técnica nueva. Desde hace cerca de una década, investigadores de privacidad la documentan junto a canvas fingerprinting y WebGL fingerprinting como parte del arsenal de identificación de navegadores sin depender de cookies. La idea de base es simple: generar una señal de audio conocida, procesarla con la implementación de audio del sistema operativo y el navegador, y leer el resultado. Pequeñas diferencias de hardware, drivers de audio, sistema operativo y versión del navegador producen salidas ligeramente distintas frente a la misma entrada, lo suficiente para diferenciar dispositivos aunque el usuario borre cookies o use una ventana privada.

Lo distinto en este caso es dónde y cómo se ejecuta. Los scripts collina.js y fireyejs.js están extremadamente ofuscados, algo habitual en herramientas antifraude que buscan dificultar que bots y scrapers detecten y evadan la detección. Aun así, suficientes nombres de funciones y operaciones sobrevivieron a la ofuscación como para reconstruir qué hace el código de audio. Ambos scripts pertenecen a un directorio identificado como AWSC, asociado a las herramientas de seguridad y prevención de abuso del navegador que usa Alibaba en sus propiedades, entre ellas AliExpress. Este tipo de scripts se volvió común en comercio electrónico a gran escala, donde el scraping de precios, la creación masiva de cuentas falsas y los bots de compra son un problema constante. El costo, sin embargo, lo paga cualquier visitante cuyo navegador ejecute ese código, tenga o no intenciones de abusar del sitio.

Detalles técnicos: cómo arma AliExpress el fingerprinting con WebAudio

Ambos scripts construyen un grafo de audio casi idéntico. Un oscilador tipo sawtooth (diente de sierra) genera una onda conocida. Esa señal pasa por un AnalyserNode, que expone datos de frecuencia y forma de onda ya procesados por la implementación de audio del navegador. De ahí sigue a un ScriptProcessorNode, que permite leer el buffer de audio en JavaScript en cada bloque de procesamiento. El resultado final llega a un GainNode con la ganancia fijada en cero, y ese nodo sí se conecta a AudioContext.destination, la salida real de audio del sistema.

La clave está en ese último paso. Fijar la ganancia en cero significa que el usuario no escucha nada, pero conectar el grafo a destination obliga al navegador a procesar el audio de forma activa, igual que si estuviera sonando a volumen normal. Eso es muy distinto de un video con autoplay: ahí existe un elemento de medios que el control de silenciar la pestaña puede pausar. Acá no hay ningún elemento de medios que pausar, porque técnicamente la página está haciendo procesamiento de audio en vivo, no reproducción.

Un ejemplo simplificado del mismo patrón, sin la ofuscación ni la lógica de fingerprinting, se ve así:

const ctx = new AudioContext();
const oscillator = ctx.createOscillator();
oscillator.type = 'sawtooth';

const analyser = ctx.createAnalyser();
const processor = ctx.createScriptProcessor(4096, 1, 1);
const silentGain = ctx.createGain();
silentGain.gain.value = 0;

oscillator.connect(analyser);
analyser.connect(processor);
processor.connect(silentGain);
silentGain.connect(ctx.destination);
oscillator.start();

processor.onaudioprocess = (event) => {
  const data = new Uint8Array(analyser.frequencyBinCount);
  analyser.getByteFrequencyData(data);
  // 'data' varía levemente según el hardware de audio, el driver y el sistema operativo
};

El vector data es lo que un script de fingerprinting normalmente convierte en un hash y envía a un servidor junto con otras señales. La instrumentación que permitió detectar los dos AudioContext ocultos en AliExpress sigue un enfoque distinto: en lugar de generar la huella, intercepta cualquier intento de crearla.

const NativeAudioContext = window.AudioContext;
window.AudioContext = class extends NativeAudioContext {
  constructor(...args) {
    super(...args);
    console.log('AudioContext creado', {
      estado: this.state,
      stack: new Error().stack
    });
  }
};

const nativeConnect = AudioNode.prototype.connect;
AudioNode.prototype.connect = function (...args) {
  if (this instanceof GainNode || args[0] instanceof AudioDestinationNode) {
    console.log('Nodo conectado hacia el destino de audio', new Error().stack);
  }
  return nativeConnect.apply(this, args);
};

Pegar ese fragmento en la consola de DevTools antes de navegar a la página, y luego dejarla inactiva unos segundos, es lo que expuso los dos AudioContext y sus stack traces apuntando a collina.js y fireyejs.js.

La medición de audio no viaja sola. La misma inspección de los bundles encontró código que también consulta canvas y su método toDataURL(), información del renderer y extensiones de WebGL, dimensiones de pantalla y viewport, devicePixelRatio, navigator.hardwareConcurrency y navigator.deviceMemory, plugins instalados, formatos de audio y video soportados, comportamiento de WebRTC, tiempos de rendimiento del navegador, eventos de mouse, touch, foco y scroll, orientación y movimiento del dispositivo, y propiedades que suelen delatar automatización del navegador. La siguiente tabla ubica el fingerprinting con WebAudio junto a las otras técnicas encontradas:

TécnicaQué mideVisible para el usuarioPresente en este caso
Canvas fingerprintingDiferencias de renderizado 2D al dibujar texto o formasNoSí, en ambos scripts
WebGL fingerprintingRenderer, extensiones y precisión de shaders de la GPUNo
Fingerprinting con WebAudioVariaciones microscópicas al procesar una señal generada por un osciladorNo, ni siquiera activa el ícono de audio de la pestañaSí, con dos AudioContext independientes
Hardware y pantallahardwareConcurrency, deviceMemory, resolución, devicePixelRatioNo

El siguiente diagrama resume el camino que sigue el audio dentro de cada AudioContext oculto:

flowchart TD
A["Oscilador sawtooth"] --> B["AnalyserNode"]
B --> C["ScriptProcessorNode"]
C --> D["GainNode en cero"]
D --> E["AudioContext.destination"]
💭 Clave: silenciar la pestaña, el navegador o el volumen del sistema operativo no detiene el procesamiento: el mute actúa después del grafo de audio, no antes, así que la ruta de audio hacia los audífonos Bluetooth sigue activa aunque no se escuche nada.
Ilustración de scripts de rastreo ejecutándose en segundo plano en un navegador
Cada AudioContext oculto se suma a canvas y WebGL en el mismo fingerprint. Foto de Paymo en Unsplash

Cómo probarlo en tu propio navegador

Reproducir la detección no requiere instalar nada adicional: el snippet de instrumentación corre igual en Firefox y en Chrome, y da el mismo resultado en Windows, macOS y Linux porque depende únicamente del motor de JavaScript y la Web Audio API del navegador, no del sistema operativo.

  1. Abrí una pestaña nueva y entrá a las herramientas de desarrollador (F12 o Ctrl+Shift+I en Windows/Linux, Cmd+Option+I en macOS) antes de cargar AliExpress.
  2. Pegá en la consola el fragmento de instrumentación de la sección anterior, que reemplaza AudioContext y AudioNode.prototype.connect por versiones que registran cada uso.
  3. Navegá a la página de inicio de AliExpress y dejá la pestaña inactiva entre 10 y 15 segundos, sin interactuar.
  4. Revisá la consola: cada entrada 'AudioContext creado' o 'Nodo conectado hacia el destino de audio' confirma que un script generó y conectó un contexto de audio, junto con el stack trace que señala el archivo de origen.

Para confirmar que el navegador realmente está procesando audio en tiempo real, y no solo registrando la creación del objeto, Chrome expone chrome://media-internals en una pestaña separada. Ahí aparece un stream de audio activo del renderer mientras el AudioContext está en estado running, incluso sin ningún elemento <audio> visible en la página.

💡 Tip: un bloqueador de contenido como uBlock Origin que filtre el dominio assets.aliexpress-media.com evita que estos scripts lleguen a ejecutarse, aunque también puede afectar otras funciones de seguridad legítimas del sitio.

Impacto y análisis: fraude legítimo, rastreo sin aviso

Alibaba tiene motivos de negocio reales para invertir en este tipo de detección. AliExpress opera a una escala donde el scraping automatizado de precios, la creación masiva de cuentas para aprovechar cupones, el abuso de programas de referidos y los bots de reventa son un problema constante y costoso. Medir señales de hardware, comportamiento del mouse y procesamiento de audio ayuda a distinguir a un comprador real de un script automatizado, incluso cuando ese script rota direcciones IP y borra cookies entre sesiones.

El problema no es la meta, sino el método y la falta de aviso. El grafo de audio corre sin ningún indicador visible: no aparece el ícono de altavoz que los navegadores muestran normalmente cuando una pestaña reproduce sonido, no hay solicitud de permiso, y ni siquiera silenciar el sistema operativo interrumpe el procesamiento. Un usuario común no tiene forma de saber, sin herramientas de desarrollador, que su navegador está generando y analizando una señal de audio en cada visita.

Tampoco hay forma pública de confirmar qué hace Alibaba con los datos resultantes una vez que llegan a sus servidores. Los mismos bundles incluyen lógica para serializar y cifrar los resultados y enviarlos con fetch() o sendBeacon() a servicios de telemetría de la compañía. Puede tratarse de un identificador persistente de dispositivo, un insumo más dentro de un score de fraude, o ambas cosas a la vez; sin acceso al backend no es posible distinguirlo.

El caso también expone un punto ciego en cómo los navegadores comunican actividad de audio al usuario. El control de silenciar por pestaña, pensado para videos y anuncios molestos, no cubre el caso de un grafo de WebAudio con ganancia cero conectado directamente al destino: técnicamente cumple su función (no hay sonido), pero deja al sistema operativo gestionando una sesión de audio activa que interfiere con otros dispositivos conectados, como en este caso con los audífonos Bluetooth multipunto.

Qué sigue

Los navegadores centrados en privacidad ya tratan la Web Audio API como una superficie de fingerprinting conocida. Tor Browser, por ejemplo, añade ruido aleatorio a la salida de AnalyserNode para que cada sesión entregue una huella distinta, siguiendo el mismo principio que aplica a canvas. No sería extraño que Firefox o Chrome amplíen protecciones similares fuera del modo de navegación privada, sobre todo si más reportes como este documentan efectos colaterales visibles para el usuario.

Del lado de los bloqueadores de contenido, agregar collina.js, fireyejs.js y el dominio assets.aliexpress-media.com a listas de filtrado es la respuesta más inmediata y ya está al alcance de cualquier usuario con una extensión como uBlock Origin. Del lado de Alibaba, la opción más simple para evitar el efecto secundario sobre audífonos Bluetooth, sin renunciar a la detección, sería suspender el AudioContext con ctx.suspend() cuando la pestaña pierde el foco, en lugar de mantenerlo corriendo de forma indefinida en segundo plano.

📖 Resumen en Telegram: Ver resumen

Probalo vos: pegá el snippet de instrumentación en la consola de DevTools antes de cargar aliexpress.com y mirá cuántos AudioContext aparecen en el log.

Preguntas frecuentes

¿Qué es el fingerprinting con WebAudio?

Es una técnica que genera una señal de audio conocida (por ejemplo con un oscilador sawtooth), la procesa con la implementación de audio del navegador y mide diferencias mínimas en el resultado. Esas diferencias varían según el sistema operativo, la tarjeta de sonido y la versión del navegador, lo que sirve como una huella semi única del dispositivo.

¿Por qué se corta el audio de mis audífonos Bluetooth?

Porque aunque el volumen del grafo de WebAudio esté en cero, el navegador igual mantiene activo el procesamiento de audio en tiempo real. En sistemas con audífonos multipunto, eso puede bastar para que el sistema operativo priorice esa sesión de audio y corte la reproducción del otro dispositivo conectado.

¿Cómo puedo bloquear este tipo de scripts?

Extensiones como uBlock Origin pueden bloquear por dominio los archivos servidos desde assets.aliexpress-media.com. Navegadores orientados a privacidad, como Tor Browser, añaden ruido aleatorio a la salida de AudioContext para que cada sesión entregue una huella distinta.

¿Es ilegal que AliExpress haga esto?

Depende de la jurisdicción. En la Unión Europea, el fingerprinting sin consentimiento explícito puede entrar en conflicto con el RGPD y la directiva ePrivacy, que exigen base legal para técnicas de rastreo equivalentes a cookies. La legalidad puntual de este caso no está determinada públicamente.

¿Qué otros datos recolectan estos scripts?

Además del audio, las inspecciones encontraron mediciones de canvas, WebGL, memoria y núcleos del dispositivo, plugins instalados, formatos de audio y video soportados, comportamiento de WebRTC, eventos de mouse y touch, y propiedades asociadas a la automatización del navegador.

¿Afecta solo a AliExpress?

El reporte original se limita a AliExpress, pero collina.js y fireyejs.js forman parte de herramientas de seguridad de Alibaba que podrían reutilizarse en otras propiedades del grupo. No hay confirmación pública de en qué otros sitios corren estos mismos scripts.

Referencias

  • Blog de laserphile: publicación original con el análisis completo y el código de instrumentación usado para detectar los AudioContext ocultos.
  • MDN Web Docs: documentación oficial de la Web Audio API, incluyendo AudioContext, AnalyserNode y GainNode.
  • EFF Cover Your Tracks: herramienta de la Electronic Frontier Foundation para medir qué tan única es la huella de tu navegador.
  • Wikipedia: Device fingerprint: contexto general sobre técnicas de identificación de dispositivos sin cookies.

📱 ¿Te gusta este contenido? Únete a nuestro canal de Telegram @programacion donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.

Imagen destacada: Foto de A Chosen Soul en Unsplash


Andrés Morales

Desarrollador e investigador en inteligencia artificial. Escribe sobre modelos de lenguaje, frameworks, herramientas para devs y lanzamientos open source. Cubre papers de ML, ecosistema de startups tech y tendencias de programación.

0 Comentarios

Deja un comentario

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.