Introducción
En julio de 2026, Confiant publicó un análisis detallado sobre SourTrade, una campaña de malvertising que ensambla ejecutables de Windows directamente en el navegador de la víctima, sin necesidad de distribuir un archivo completo en la red. La técnica explota el runtime legítimo de Bun (versión 1.1.30, según los samples analizados) y workers de navegador para generar un binario por sesión, variando su hash y eludiendo detecciones basadas en firmas estáticas. El ataque se dirige a usuarios de TradingView, Solana y Luno, simulando servicios legítimos para robar credenciales, interceptar tráfico y extraer fondos de billeteras de criptomonedas en 12 países y 25 idiomas.
Lo más preocupante no es solo el método de ensamblaje, sino que el malware no existe como archivo completo en la red en ningún momento. Cada víctima recibe una versión única del ejecutable, compuesta en tiempo real a partir de:
- Un runtime de Bun (descargado desde
purelogicbox[.]org). - Secciones de PE (Portable Executable) y bytecode JavaScriptCore cifradas en Base64 en
/config. - Un flujo de bytes aleatorios generado con AES-CTR, que actúa como padding para evadir firmas antivirus.
Este enfoque no requiere explotaciones de navegador ni manipular la Mark of the Web (MotW). El archivo final se descarga con un Content-Disposition que atribuye la fuente a la landing page, no al dominio del runtime, lo que complica el análisis forense.
Qué ocurrió
Evolución desde técnicas previas: de StreamSaver.js a Bun
En abril de 2026, Confiant identificó una variante anterior de SourTrade que utilizaba StreamSaver.js (librería open-source para descargas por streaming) alojada en GitHub Pages para descargar el payload. El tráfico de red mostraba claramente la URL de GitHub como origen de la descarga, lo que facilitaba su bloqueo. Sin embargo, en la versión actual, el mecanismo de streaming se mantiene, pero el código ya no se descarga desde GitHub, sino que está embebido en la página. Esto elimina el rastro en logs de red que apuntaban a un dominio externo conocido.
La nueva técnica reemplaza StreamSaver.js por un SharedWorker que:
- Registra un
ServiceWorkeren/sw.js(página-escoped, no global). - Inicia un worker en segundo plano que:
/config desde un dominio secundario (ej: purelogicbox[.]org).– Recupera un runtime de Bun (archivo .exe limpio) y datos cifrados (PE header, tabla de secciones, bytecode de app.js).
– Ensambla el ejecutable en memoria combinando:
– Fragmentos del runtime de Bun.
– El flujo aleatorio generado con AES-CTR (clave y nonce derivados de valores aleatorios por sesión).
– Los datos del atacante (PE header, secciones, bytecode).
- Transfiere el binario resultante al ServiceWorker como un stream y lo sirve con un
Content-Disposition: attachmentque apunta a la landing page original.
Componentes clave y versiones
| Componente | Versión/Detalle | Rol en la cadena de ataque |
|---|---|---|
| Bun | 1.1.30 (sample analizado) | Runtime legítimo para compilar bytecode en ejecutables. |
| ServiceWorker |
