Le 2026-01-20 à 18:03 UTC, notre système a commencé à nous alerter sur un nouveau package npm appelé flockiali. En 26 minutes, l'attaquant a publié quatre versions. Deux jours plus tard, il s'est lancé dans une frénésie de publication : opresc, prndn, oprnm, et operni. Au moment où nous avons examiné de plus près, nous avions découvert une campagne de spear-phishing très ciblée visant des employés d'entreprises industrielles et énergétiques à travers l'Europe, le Moyen-Orient et les États-Unis.
Et le mécanisme de livraison ? npm + jsDelivr. Pourquoi héberger votre propre infrastructure de phishing quand vous pouvez profiter gratuitement du CDN de quelqu'un d'autre ?
Ce que nous avons découvert
Les packages contiennent un seul fichier JavaScript qui, une fois chargé, remplace complètement la page web par un kit de phishing. Mais voici ce qui rend cela intéressant : chaque version cible une personne spécifique.
Nous avons identifié cinq cibles réparties dans cinq entreprises :
flockialiLa version 1.2.5 cible une personne chez CQFD Composites, un fabricant français de composites.flockialiLa version 1.2.6 cible une personne chez Ingeteam, une entreprise espagnole d'éoliennes.oprescLa version 1.0.0 cible une personne chez Emagine, une entreprise émiratie de bornes de recharge pour véhicules électriques.prndnetoprnmles deux ciblent la même personne chez Amixon GmbH, une entreprise allemande de mélangeurs industriels.operniLa version 1.2.7 cible une personne chez CMC America, une entreprise américaine d'équipements de boulangerie.
L'attaquant ne procède pas par « spray-and-pray » (attaque de masse). Il publie de nouveaux packages pour chaque cible. Et lorsqu'une cible est particulièrement intéressante, il publie plusieurs packages avec des chemins de livraison différents.
Le flux d'attaque
Voici ce qui se passe lorsqu'une victime ouvre le lien de phishing.
La page se charge, affichant une fausse interface de partage de fichiers « Micro-Share » :
📁 Micro-Share
partage de fichiers sécurisé
Documents partagés sécurisés, veuillez vérifier votre e-mail et continuer.
Les documents suivants ont été partagés en toute sécurité avec [victim]@ingeteam.com
📄 Specification.pdf
- RFQ.pdf
- Project descriptions.pdf
- destination finale de l'équipement.pdf
[ Télécharger ]
Les documents sont à thème d'ingénierie : RFQ, spécifications de projet, fichiers CAO. Exactement ce à quoi on s'attendrait pour quelqu'un travaillant dans une entreprise industrielle.
Lorsque la victime clique sur « Télécharger », la page passe à un écran de connexion aux couleurs de Microsoft :
⊞ Microsoft
Se connecter
⚠ Authentification requise. Cliquez sur Suivant pour vous connecter et continuer le téléchargement.
┌────────────────────────────────────────┐
│ [victim]@ingeteam.com │ (lecture seule)
└────────────────────────────────────────┘
Pas de compte ? Créez-en un
Impossible d'accéder à votre compte ?
[ Suivant ]
L'e-mail de la victime est déjà pré-rempli et marqué en lecture seule. Lorsqu'elle clique sur « Suivant », elle est redirigée vers le serveur de collecte d'identifiants :
window.location.href = "https://login.siemensergy[.]icu/DIVzTaSF";Effectivement, siemensergy[.]icu. Il s'agit d'un typosquat de Siemens Energy. L'attaquant a clairement fait ses recherches sur les partenaires commerciaux de ses cibles.
Techniques anti-bot
Le kit de phishing ne plaisante pas. Il intègre plusieurs techniques pour éviter l'analyse automatisée.
Il vérifie la présence de WebDriver (navigator.webdriver), les listes de plugins vides et les dimensions d'écran nulles. Il filtre les user-agents correspondant à /bot|crawl|spider|headless|HeadlessChrome/i. Il intègre des champs de formulaire honeypot qui, s'ils sont remplis par des bots, déclenchent le kill switch. De plus, le bouton de téléchargement reste désactivé tant que la page ne détecte pas de mouvement de souris ou d'événements tactiles. Pas d'interaction, pas de phishing.
v1.2.5 va plus loin avec un analyseur de trajectoire de souris étonnamment sophistiqué :
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;
}
Celui-ci calcule la variance des 10 dernières positions de la souris. Si votre curseur s'est déplacé en ligne droite de manière suspecte (comme le ferait un bot), la variance reste faible et le bouton ne s'active jamais. Les vrais humains bougent de manière irrégulière.
Quelqu'un a déployé des efforts considérables pour ce kit de phishing.
Cinq packages, cinq cibles, deux modèles
Les versions du payload ne ciblent pas seulement des personnes différentes. Elles utilisent deux conceptions de kits de phishing différentes.
Le v1.2.5 Le payload (ciblant CQFD Composites) utilise la marque « MicroSecure Pro » avec un dégradé violet et la police Inter. Il présente des fichiers CAO et des livrables d'ingénierie comme appât, intègre l'analyseur de trajectoire de souris sophistiqué et envoie les identifiants à oprsys.deno[.]dev.
Le reste (v1.2.6, opresc, prndn, oprnm, operni) utilisent un design « Micro-Share » plus épuré avec des fonds blancs et la police Segoe UI. Ils affichent des RFQ et des spécifications de projet, utilisent des vérifications d'interaction basiques et envoient les identifiants aux typosquats de Siemens Energy.
Le v1.2.5 Le kit est plus flashy avec des animations et des fonds dégradés. Les kits plus récents sont plus minimalistes, plus proches de l'apparence réelle de Microsoft. Peut-être que l'attaquant a effectué des tests A/B et a constaté que des versions plus simples convertissent mieux. Ou peut-être qu'ils itèrent simplement.
Le payload de CMC America (operni) propose des leurres documentaires personnalisés pour l'industrie alimentaire : « Spécifications des produits et détails des ingrédients », « Objectifs de capacité de production et paramètres opérationnels ». L'attaquant adapte son appât.
Ce qui est intéressant, c'est le choix du C2. Toutes les cibles récentes sont redirigées vers des typosquats de Siemens Energy. Ce n'est pas un hasard. Ingeteam fabrique des éoliennes. Emagine développe des infrastructures de recharge pour véhicules électriques. Amixon et CMC America fabriquent des équipements de mélange industriel (Amixon travaille même avec des matériaux de batterie). Toutes opèrent sur des marchés où Siemens Energy est un acteur majeur. L'attaquant a étudié les relations commerciales de ses cibles.
Notez l'évolution subtile : siemensergy[.]icu (sans trait d'union) est devenu siemens-energy[.]icu (avec trait d'union). La deuxième variante est plus proche du véritable siemens-energy[.]com domaine. Nous avons confirmé via DNS que le domaine sans trait d'union n'a aucun enregistrement. L'attaquant l'a abandonné.
L'infrastructure raconte une histoire
C'est là que cela devient intéressant. Nous avons utilisé les journaux de transparence des certificats pour déterminer quand l'infrastructure C2 a été mise en place. Le premier certificat SSL pour *.siemens-energy[.]icu a été émis le 24 octobre 2025. Puis des renouvellements les 14, 16 et 17 janvier. La campagne npm a débuté le 20 janvier.
L'attaquant a enregistré le domaine et obtenu des certificats SSL trois mois avant l'apparition des packages npm. Prenez-en conscience. Ce n'est pas opportuniste. Quelqu'un a planifié cette opération, mis en place l'infrastructure en octobre 2025, puis a attendu.
Le serveur C2 (163.123.236[.]118) est hébergé par RackGenius, un petit fournisseur d'hébergement à Muskegon, Michigan. Pendant ce temps, l'ancien v1.2.5 payload utilise oprsys.deno[.]dev, qui se résout en une infrastructure Google Cloud (Deno Deploy). Hébergement serverless gratuit pour le phishing. Classique. Nous avons informé l'équipe Deno de cette campagne dès que nous l'avons observée, et ils ont été très rapides pour la désactiver.
Pourquoi npm + jsDelivr ?
Le package.json révèle l'histoire :
{
"keywords": ["jsdelivr", "cdn", "template"],
"main": "resp/template.min.js"
}
jsDelivr met automatiquement en miroir les packages npm. Publiez sur npm, obtenez un hébergement CDN instantané à cdn.jsdelivr[.]net/npm/flockiali@1.2.6/resp/template.min.js. Aucun serveur à maintenir, aucun hébergement à payer, et la victime voit une URL CDN d'apparence légitime au lieu d'un domaine de phishing suspect.
La chronologie
20 janvier (quatre versions en 26 minutes) :
- 18:03 UTC :
flockialiv1.2.3 (placeholder vide) - 18:10 UTC :
flockialiv1.2.4 (mise à jour des métadonnées) - 18:15 UTC :
flockialiv1.2.5 (cible CQFD Composites) - 18:29 UTC :
flockialiv1.2.6 (cible Ingeteam)
22 janvier (cinq packages supplémentaires) :
- 09:52 UTC :
oprescv1.0.0 (cible Emagine) - 12:29 UTC :
prndnv1.0.0 (cible Amixon) - 12:49 UTC :
oprnmv1.0.0 (Amixon à nouveau) - 13:11 UTC :
operniv1.2.6 (cassé, vide) - 13:16 UTC :
operniv1.2.7 (cible CMC America)
L'attaquant dispose d'une liste de cibles et les exploite une par une. L'employé d'Amixon a reçu deux packages à 20 minutes d'intervalle (un peu excessif, non ?). Le package de CMC America contenait une faute de frappe (reps/ au lieu de resp/) et une première version défectueuse. Oups. Cet attaquant agit rapidement et commet des erreurs.
Que devriez-vous faire ?
Si vous faites partie des entreprises ciblées, vérifiez si quelqu'un a reçu des liens vers des URL jsDelivr ou a cliqué sur quoi que ce soit lié au partage de documents "Micro-Share".
Recherchez dans les journaux d'e-mails les liens contenant cdn.jsdelivr[.]net/npm/flockiali, cdn.jsdelivr[.]net/npm/opresc, cdn.jsdelivr[.]net/npm/prndn, cdn.jsdelivr[.]net/npm/oprnm, ou cdn.jsdelivr[.]net/npm/operni. Bloquez les domaines IOC à votre périmètre. Si des identifiants ont été saisis, révoquez-les immédiatement.
Indicateurs de compromission
Domaines C2 :
login.siemens-energy[.]icu(163.123.236[.]118, RackGenius)login.siemensergy[.]icu(abandonné, pas de DNS)oprsys.deno[.]dev(34.120.54[.]55, Deno Deploy)
URLs de phishing :
https://login.siemensergy[.]icu/DIVzTaSFhttps://login.siemens-energy[.]icu/DIVzTaSF
URLs 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
Packages :
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

