El 20 de enero de 2026 a las 18:03 UTC, nuestro sistema empezó a alertarnos sobre un nuevo paquete npm llamado flockiali. En 26 minutos, el atacante publicó cuatro versiones. Dos días después, se lanzó a una frenética actividad de publicación: opresc, prndn, oprnm, y operni. Cuando lo analizamos más de cerca, habíamos descubierto una campaña de spear-phishing altamente dirigida que afectaba a empleados de empresas industriales y energéticas de Europa, Oriente Medio y Estados Unidos.
¿Y el mecanismo de entrega? npm + jsDelivr. ¿Por qué alojar tu propia infraestructura de phishing cuando puedes aprovecharte de la CDN de otro?
Lo que encontramos
Los paquetes contienen un único archivo JavaScript que, al cargarse, reemplaza completamente la página web con un kit de phishing. Pero lo que lo hace interesante es esto: cada versión se dirige a una persona específica.
Encontramos cinco objetivos en cinco empresas:
flockialiLa v1.2.5 se dirige a alguien de CQFD Composites, un fabricante francés de compositesflockialiLa v1.2.6 se dirige a alguien de Ingeteam, una empresa española de aerogeneradoresoprescLa v1.0.0 se dirige a alguien de Emagine, una empresa de carga de vehículos eléctricos de los EAUprndnyoprnmambas se dirigen a la misma persona de Amixon GmbH, una empresa alemana de mezcladoras industrialesoperniLa v1.2.7 se dirige a alguien de CMC America, una empresa estadounidense de equipos de panadería
El atacante no está lanzando ataques indiscriminados. Está publicando nuevos paquetes para cada objetivo. Y cuando un objetivo es particularmente interesante, publica múltiples paquetes con diferentes rutas de entrega.
El flujo del ataque
Esto es lo que sucede cuando una víctima abre el enlace de phishing.
La página se carga mostrando una interfaz falsa de intercambio de archivos "Micro-Share":
📁 Micro-Share
intercambio seguro de archivos
Documentos compartidos de forma segura, por favor, verifique su correo electrónico y continúe.
Los siguientes documentos han sido compartidos de forma segura con [victim]@ingeteam.com
📄 Specification.pdf
- RFQ.pdf
- Project descriptions.pdf
- destino final del equipo.pdf
[ Descargar ]
Los documentos tienen temática de ingeniería: RFQs, especificaciones de proyectos, archivos CAD. Exactamente lo que cabría esperar que recibiera alguien de una empresa industrial.
Cuando la víctima hace clic en "Descargar", la página pasa a una pantalla de inicio de sesión con la marca Microsoft:
⊞ Microsoft
Iniciar sesión
⚠ Autenticación requerida. Haga clic en siguiente para iniciar sesión y continuar la descarga.
┌────────────────────────────────────────┐
│ [victim]@ingeteam.com │ (solo lectura)
└────────────────────────────────────────┘
¿No tiene cuenta? Cree una
¿No puede acceder a su cuenta?
[ Siguiente ]
El correo electrónico de la víctima ya está rellenado y marcado como solo lectura. Cuando hacen clic en "Siguiente", son redirigidos al servidor de recolección de credenciales:
window.location.href = "https://login.siemensergy[.]icu/DIVzTaSF";Sí, siemensergy[.]icu. Se trata de un typosquatting de Siemens Energy. El atacante ha investigado a fondo con quién hacen negocios sus objetivos.
Técnicas anti-bot
El kit de phishing va en serio. Incluye varias técnicas para evitar el análisis automatizado.
Verifica la presencia de WebDriver (navigator.webdriver), listas de plugins vacías y dimensiones de pantalla nulas. Filtra los user-agents que coinciden con /bot|crawl|spider|headless|HeadlessChrome/i. Incluye campos de formulario honeypot que, si son rellenados por bots, activan el interruptor de seguridad (kill switch). Además, el botón de descarga permanece deshabilitado hasta que la página detecta movimiento del ratón o eventos táctiles. Sin interacción, no hay phishing.
v1.2.5 va más allá con un analizador de trayectoria del ratón sorprendentemente sofisticado:
isLegitimateTrajectory() {
if (this.mouseTrail.length < 20) return false;
const t = this.mouseTrail.slice(-10);
const variance = t.reduce((acc, p) =>
acc + Math.pow(p.x - t[0].x, 2), 0) / 10;
return variance > 100;
}
Esto calcula la varianza de las últimas 10 posiciones del ratón. Si el cursor se movió en una línea sospechosamente recta (como lo haría un bot), la varianza se mantiene baja y el botón nunca se activa. Los humanos reales se mueven de forma irregular.
Alguien ha puesto un gran esfuerzo en este kit de phishing.
Cinco paquetes, cinco objetivos, dos plantillas
Las versiones del payload no solo están dirigidas a personas diferentes. Utilizan dos diseños de kits de phishing distintos.
El v1.2.5 El payload (dirigido a CQFD Composites) utiliza la marca "MicroSecure Pro" con un degradado púrpura y la fuente Inter. Muestra archivos CAD y entregables de ingeniería como cebo, cuenta con el sofisticado analizador de trayectoria del ratón y envía las credenciales a oprsys.deno[.]dev.
El resto (v1.2.6, opresc, prndn, oprnm, operni) utilizan un diseño más limpio de "Micro-Share" con fondos blancos y Segoe UI. Muestran RFQs y especificaciones de proyectos, emplean comprobaciones de interacción básicas y envían las credenciales a los typosquats de Siemens Energy.
El v1.2.5 El kit es más llamativo, con animaciones y fondos degradados. Los kits más recientes son más minimalistas, más parecidos a la apariencia real de Microsoft. Quizás el atacante realizó pruebas A/B y descubrió que lo más simple convierte mejor. O quizás simplemente están iterando.
El payload de CMC America (operni) tiene documentos señuelo personalizados para la industria alimentaria: "Especificaciones de producto y detalles de ingredientes", "Objetivos de capacidad de producción y parámetros operativos". El atacante está personalizando su cebo.
Lo interesante es la elección del C2. Todos los objetivos recientes son enviados a typosquats de Siemens Energy. Esto no es aleatorio. Ingeteam fabrica turbinas eólicas. Emagine se dedica a la infraestructura de carga de vehículos eléctricos. Amixon y CMC America fabrican equipos de mezcla industrial (Amixon incluso trabaja con materiales para baterías). Todos operan en mercados donde Siemens Energy es un actor principal. El atacante investigó las relaciones comerciales de sus objetivos.
Nótese la sutil evolución: siemensergy[.]icu (sin guion) se convirtió en siemens-energy[.]icu (con guion). La segunda variante está más cerca del real siemens-energy[.]com dominio. Confirmamos vía DNS que el dominio sin guion no tenía ningún registro. El atacante lo abandonó.
La infraestructura cuenta una historia
Aquí es donde se pone interesante. Utilizamos los registros de transparencia de certificados para ver cuándo se configuró la infraestructura C2. El primer certificado SSL para *.siemens-energy[.]icu se emitió el 24 de octubre de 2025. Luego, renovaciones el 14, 16 y 17 de enero. La campaña de npm comenzó el 20 de enero.
El atacante registró el dominio y obtuvo certificados SSL tres meses antes de que aparecieran los paquetes npm. Piénsalo. Esto no es oportunista. Alguien planeó esta operación, configuró la infraestructura en octubre de 2025 y luego esperó.
El servidor C2 (163.123.236[.]118) está alojado por RackGenius, un pequeño proveedor de hosting en Muskegon, Michigan. Mientras tanto, la carga útil anterior v1.2.5 utiliza oprsys.deno[.]dev, que se resuelve en la infraestructura de Google Cloud (Deno Deploy). Hosting serverless gratuito para phishing. Un clásico. Notificamos al equipo de Deno sobre esta campaña cuando la observamos, y fueron muy rápidos en deshabilitarla.
¿Por qué npm + jsDelivr?
El package.json cuenta la historia:
{
"keywords": ["jsdelivr", "cdn", "template"],
"main": "resp/template.min.js"
}
jsDelivr replica automáticamente los paquetes npm. Publica en npm y obtén hosting CDN instantáneo en cdn.jsdelivr[.]net/npm/flockiali@1.2.6/resp/template.min.js. Sin servidores que mantener, sin hosting que pagar, y la víctima ve una URL de CDN de aspecto legítimo en lugar de un dominio de phishing sospechoso.
La cronología
20 de enero (cuatro versiones en 26 minutos):
- 18:03 UTC:
flockialiv1.2.3 (marcador de posición vacío) - 18:10 UTC:
flockialiv1.2.4 (actualización de metadatos) - 18:15 UTC:
flockialiv1.2.5 (objetivo CQFD Composites) - 18:29 UTC:
flockialiv1.2.6 (objetivo Ingeteam)
22 de enero (cinco paquetes más):
- 09:52 UTC:
oprescv1.0.0 (objetivo Emagine) - 12:29 UTC:
prndnv1.0.0 (objetivo Amixon) - 12:49 UTC:
oprnmv1.0.0 (Amixon de nuevo) - 13:11 UTC:
operniv1.2.6 (roto, vacío) - 13:16 UTC:
operniv1.2.7 (objetivo CMC America)
El atacante tiene una lista de objetivos y está trabajando en ella. El empleado de Amixon recibió dos paquetes con 20 minutos de diferencia (¿exagerado, no?). El paquete de CMC America tenía un error tipográfico (reps/ en lugar de resp/) y una primera versión defectuosa. Vaya. Este atacante se mueve rápido y comete errores.
¿Qué hacer?
Si trabaja en una de las empresas objetivo, compruebe si alguien recibió enlaces a URLs de jsDelivr o hizo clic en algo relacionado con el uso compartido de documentos "Micro-Share".
Busque en los registros de correo electrónico enlaces que contengan cdn.jsdelivr[.]net/npm/flockiali, cdn.jsdelivr[.]net/npm/opresc, cdn.jsdelivr[.]net/npm/prndn, cdn.jsdelivr[.]net/npm/oprnm, o cdn.jsdelivr[.]net/npm/operni. Bloquee los dominios IOC en su perímetro. Si se introdujeron credenciales, rótelas inmediatamente.
Indicadores de Compromiso
Dominios C2:
login.siemens-energy[.]icu(163.123.236[.]118, RackGenius)login.siemensergy[.]icu(abandonado, sin DNS)oprsys.deno[.]dev(34.120.54[.]55, Deno Deploy)
URLs de phishing:
https://login.siemensergy[.]icu/DIVzTaSFhttps://login.siemens-energy[.]icu/DIVzTaSF
URLs de jsDelivr:
hxxps://cdn.jsdelivr[.]net/npm/flockiali@1.2.6/resp/template.min.jshxxps://cdn.jsdelivr[.]net/npm/flockiali@1.2.5/resp/template.min.jshxxps://cdn.jsdelivr[.]net/npm/opresc@1.0.0/resp/template.min.jshxxps://cdn.jsdelivr[.]net/npm/prndn@1.0.0/template.min.jshxxps://cdn.jsdelivr[.]net/npm/oprnm@1.0.0/resp/template.min.jshxxps://cdn.jsdelivr[.]net/npm/operni@1.2.7/reps/template.min.js
Paquetes:
flockiali(1.2.3-1.2.6)opresc(1.0.0)prndn(1.0.0)oprnm(1.0.0)operni(1.2.6-1.2.7)
Hashes de payload (SHA256):
3ceb182fb32a8fb0f0fcf056d6ab8de1cf6e789053f1aadc98ba315ae9a96f0c– flockiali 1.2.6fdb6c79a8d01b528698c53ebd5030f875242e6af93f6ae799dee7f66b452bf3e– flockiali 1.2.54631584783d84758ae58bc717b08ac67d99dee30985db18b9d2b08df8721348e– opresc211f88a55e8fe9254f75c358c42bb7e78e014b862de7ea6e8b80ed1f78d13add– prndn/oprnm7d7f795ac1fcb5623731a50999f518877fd423a5a98219d0f495c488564a1554– operni 1.2.7

