El código QR se ha convertido en un contenedor plenamente funcional para ejecutar un script malicioso.
El equipo Socket Threat Research descubrió un nuevo paquete NPM malicioso llamado fezbox, publicado por un usuario con el alias janedu. El paquete se presenta como una biblioteca inofensiva, pero alberga un código malicioso inusual y técnicamente sofisticado: utiliza un código QR como portador de una carga útil esteganográficamente cifrada.
fezbox está camuflado como una típica biblioteca de TypeScript/JavaScript con utilidades, cuidadosamente diseñada conforme a las mejores prácticas: con pruebas, tipos, promesas de alto rendimiento y una estructura modular. Todo ello crea la ilusión de un proyecto de código abierto legítimo. En la descripción se destaca un módulo QR, supuestamente destinado a la generación y el análisis de códigos QR. Sin embargo, el archivo README no menciona que, al incluir la biblioteca, se descarga un código QR desde un servidor remoto y se ejecuta el código JavaScript oculto en él. Esa ocultación se implementa mediante una ofuscación multinivel.
El primer nivel de camuflaje es la URL invertida. La dirección de la imagen del código QR en el código fuente aparece en orden inverso, lo que dificulta la detección automática. El segundo nivel es el propio código QR, en el que se ha incrustado el script malicioso. El tercero es el JavaScript ofuscado dentro de ese QR, que utiliza secuencias Unicode y variables sin sentido.
El script se activa solo si se cumplen dos condiciones: en primer lugar, no debe ejecutarse en modo de desarrollo (esto lo determina la función isDevelopment()), y en segundo lugar, solo se dispara con una probabilidad de 1/3. Esta aleatoriedad está diseñada a propósito como defensa contra sandboxes y sistemas de análisis estático. Si el entorno es adecuado y la comprobación chance(2/3) se supera, transcurridos 120 segundos desde la carga de la biblioteca el script inicia una petición a la URL invertida, descarga el código QR, extrae de él el código y lo ejecuta en el lado del cliente.
Una característica importante de la lógica maliciosa es la presencia de la cadena "idbgha", insertada en el código sin afectar su comportamiento. Es una técnica clásica de antiforense destinada a despistar a los investigadores y dificultar el análisis. La propia carga útil, codificada en el QR, es una función ofuscada que extrae los valores de cookies llamadas username y password (esta última mediante la cadena invertida drowssap) y luego envía esos datos al servidor del atacante. La transmisión se realiza en formato JSON, a través de un canal HTTPS protegido, lo que complica aún más la detección.
La función para obtener el valor de una cookie (getC(name)) está implementada de forma muy opaca: todas las cadenas se representan mediante códigos Unicode hexadecimales —desde la palabra cookie hasta los métodos internos split y find. Como resultado, la lectura de cookies parece inofensiva, pero es difícil de analizar. En este contexto, el código QR deja de ser un simple portador de una URL o de datos y se convierte en un contenedor completo para código JavaScript cifrado y ejecutable. Este uso del QR en rol esteganográfico hace que fezbox sea especialmente peligroso: visualmente la imagen parece código ordinario, pero en su interior hay un escenario malicioso completo.
Desde el punto de vista técnico, se trata de un ejemplo de ofuscación en tres capas: primero se oculta la URL, luego el código se empaqueta dentro de la imagen, y después se cifra adicionalmente dentro de la imagen. Tal profundidad de camuflaje indica un alto grado de preparación del atacante y está claramente diseñada para eludir tanto las herramientas automáticas de análisis de dependencias como la auditoría manual. Además, fezbox muestra otra señal característica de actividad maliciosa: comportamiento selectivo. No se ejecuta en entornos de desarrollo y no se inicia inmediatamente, sino con un retraso de 2 minutos. Todo esto lo hace prácticamente invisible en entornos de prueba de corta duración y en sandboxes de CI/CD.
Socket enfatiza que este tipo de ataques no es posible detectarlo con una simple inspección del código fuente. Solo herramientas especializadas que monitoricen llamadas de red, cadenas invertidas, comportamientos sospechosos e intentos de acceso a cookies pueden atrapar esos paquetes antes de que lleguen a producción. Por eso fezbox se clasifica como software malicioso que utiliza métodos no estándar para ocultar código y robar datos.
Por ahora fezbox sigue estando disponible en npm, a pesar de las solicitudes de Socket para su eliminación y del bloqueo de la cuenta del autor. Este caso demuestra cuán flexibles y creativos se vuelven los atacantes. Incluso un código QR que parece visualmente seguro puede convertirse en un punto de entrada para un ataque complejo del lado del cliente. Y npm, como otras plataformas con publicación abierta de paquetes, sigue siendo un eslabón vulnerable si no existe una verificación profunda de las dependencias.