MALFEX dissimule un loader de shellcode dans un addon natif npm encore en ligne
Le 17 octobre 2026, SafeDep, Checkmarx et CloudSEK documentent la campagne MALFEX, qui publie depuis août 2023 des paquets npm dont un fichier JavaScript de neuf lignes charge une DLL injectant du shellcode dans un processus Windows. Si vos postes Windows installent des dépendances npm à addons natifs, auditez vos arbres de dépendances et traitez les machines concernées comme compromises.
30 septembre 2026. Le paquet npm imgdecode est publié sous le compte malfexteste8. 7 octobre 2026. La version 1.0.2 sort, toujours disponible sur le registre. 17 octobre 2026. SafeDep, Checkmarx et CloudSEK documentent la campagne MALFEX, active depuis le 6 août 2023 et ciblant les machines Windows. Pourquoi c’est important : un fichier JavaScript de neuf lignes suffit à charger une DLL qui télécharge, déchiffre et injecte du shellcode dans un processus dllhost.exe — à l’abri de toute relecture du code source.
Un loader de neuf lignes qui contourne la relecture de code
La particularité d’imgdecode tient à ce qu’il ne cache rien dans son code JavaScript. Le fichier est quasi vide : neuf lignes qui, selon SafeDep, se contentent de charger une DLL Windows. « Le paquet npm imgdecode dissimule un loader malveillant dans un addon Node.js compilé », résume l’éditeur. « Lorsqu’un programme Node.js appelle require("imgdecode") depuis une console Windows, la DLL tente de télécharger du shellcode chiffré depuis GitHub, le déchiffre et injecte le résultat dans un nouveau processus dllhost.exe. »
C’est le point aveugle que la campagne exploite. Un paquet npm se lit normalement comme du code source : on peut auditer les fichiers JavaScript avant de les déployer. Un addon natif, lui, est un binaire — un .node compilé en C ou C++ — embarqué ou compilé à l’installation via node-gyp. La logique malveillante vit dans le binaire, pas dans le texte. La revue de dépendances classique, celle qui lit les diff et les sources, ne voit rien.
Une chaîne en trois temps, réécrite à chaque retrait
MALFEX n’est pas un paquet isolé mais une campagne longue. Depuis août 2023, l’opérateur a publié huit paquets sous cinq comptes npm (malfexkkj, malfex_user, malfexteste2, malfexteste3, malfexteste4). Trois d’entre eux chargent le RAT Overlord ; trois autres — cdn-img-fetch, img-to-native et native-runner — forment une chaîne de vol d’informations.
La mécanique de cette chaîne est documentée :
- cdn-img-fetch télécharge un fichier
banner.pngdepuis le dépôt GitHub cavecrew/proj et en extrait un bloc chiffré. - img-to-native déchiffre ce bloc avec la clé malfexteam2027 et écrit un exécutable Go (
node_runtime_helper.exe) dans%APPDATA%. - native-runner exécute ce binaire, qui télécharge le voleur (
setup.exe, alias movinlike) depuis 104.234.65[.]75:700.
imgdecode est la dernière itération, celle qui abandonne la chaîne JavaScript au profit d’un binaire unique. Sa version 1.0.0 attendait encore qu’imgbundle dépose un fichier, puis passait son contenu à l’addon natif pour décodage. À partir de la 1.0.1, la DLL — un binaire 64 bits compilé en Microsoft Visual C++ — télécharge elle-même banner.jpg depuis cavecrew/proj, déchiffre la charge avec la clé nif-runtime-2027 et l’injecte dans dllhost.exe. La version 1.0.3, publiée le 11 octobre 2026, supprime la dernière dépendance externe : le paquet se suffit à lui-même.
Un opérateur qui réagit aux retraits en quelques heures
La chronologie publiée par SafeDep montre un adversaire qui surveille le registre en continu. Le 28 septembre 2026 à 16 h 06 UTC, npm retire native-runner et img-to-native. Le 30 septembre à 3 h 29, l’opérateur publie imgbundle pour remplacer img-to-native, puis runhelper à 3 h 37 pour remplacer native-runner — soit un délai de l’ordre de deux jours entre la suppression et le remplacement.
runhelper est révélateur de l’évolution technique : plutôt qu’une chaîne de paquets, il localise un fichier rt.jpg, en extrait le shellcode, le copie en mémoire exécutable et l’exécute via Koffi, un module FFI pour Node.js. Six heures après son retrait, imgdecode paraît avec la DLL compilée — la version la plus autonome de la campagne.
Autre signal d’un outillage industriel : le fichier .env embarqué dans la charge contient une adresse de commande et contrôle (104.234.65[.]75:7007) et une clé de licence MALFEX, ce qui indique l’usage d’un builder de malware ou d’un système de licences pour fabriquer les charges à la demande.
Ce que vole la charge utile finale
Une fois le shellcode injecté, le voleur déploie des contrôles anti-analyse : il détecte machines virtuelles, sandboxes et outils comme Process Monitor ou Wireshark. Il récolte ensuite les fichiers correspondant à des phrases de récupération et à certaines extensions (.kdbx, .pem, .ppk, .env), ainsi que les données des navigateurs Chromium, de Discord, Telegram, des portefeuilles de cryptomonnaies et des plateformes de jeu (Steam, Epic Games, Riot, Battle.net, Minecraft, Ubisoft).
La charge ouvre une connexion WebSocket vers le serveur de commande, qui accepte des ordres d’exécution de commandes, de transfert de fichiers, de contrôle de processus, d’accès au presse-papiers, de captures d’écran et de contrôle souris-clavier. Pour la persistance, elle ajoute une clé Run au registre et crée une tâche planifiée nommée MicrosoftEdgeUpdateService.
Pourquoi le registre ne peut pas l’arrêter
La réactivité de l’opérateur pointe une limite structurelle du modèle npm. Le retrait d’un paquet est réactif : il suit une publication, il ne la prévient pas. Un adversaire qui surveille ses propres paquets peut republier un remplaçant en quelques heures, sous un nouveau nom, avec un binaire légèrement modifié. La charge ne devient pas plus facile à détecter — elle change simplement d’étiquette.
À cela s’ajoute l’absence de CVE : sans identifiant de vulnérabilité, npm audit et la plupart des scanners de dépendances restent muets. Et contrairement au typosquatting, où l’on trompe sur le nom, imgdecode se présente comme un utilitaire d’image légitime que des développeurs installent volontairement. Le filtre de la « confiance dans le nom » ne joue donc pas : le paquet a été téléchargé 979 fois en quelques semaines, sans qu’aucun score de vulnérabilité ne s’allume. L’existence d’une clé de licence MALFEX dans la charge indique d’ailleurs une production à la chaîne, capable d’absorber un retrait comme un simple coût de fonctionnement.
Ce qu’il faut vérifier maintenant
Le risque pratique est concentré sur les machines de développement Windows : imgdecode a été téléchargé 979 fois au moment de l’analyse et reste disponible sur npm. Le fait que la charge ne s’active que depuis une console Windows — la DLL vérifie d’abord qu’elle tourne dans un terminal de développeur — cible précisément les postes qui installent des dépendances.
Voici les actions à mener sans attendre :
- Inventorier vos
package-lock.jsonetnode_modulesà la recherche des noms imgdecode, imgbundle, cdn-img-fetch, img-to-native, native-runner et runhelper. - Isoler toute machine Windows où l’un de ces paquets est apparu, puis chercher la tâche
MicrosoftEdgeUpdateServiceet la clé Run associée. - Révoquer les informations d’identification et déplacer les fonds vers de nouveaux portefeuilles si des phrases de récupération ont pu être stockées sur ces postes.
Le piège de fond est que npm audit ne signalera rien : il n’y a pas de CVE publiée, seulement des paquets dont le code source est anodin et dont la malice vit dans le binaire. La détection passe donc par l’inventaire des addons natifs et des dépendances inhabituelles, pas par les scores de vulnérabilité.
Verdict
Si vos développeurs installent des paquets npm sur des postes Windows, traitez les addons natifs comme des binaires non fiables : épinglez les versions, exigez une revue des dépendances compilées et faites tourner les installations dans des environnements jetables. Si vous êtes sur un socle Linux ou macOS uniquement, le risque direct de cette charge est faible — elle cible Windows — mais la leçon est générale : un paquet qui charge du code compilé contourne la relecture de code source, et c’est précisément ce que les campagnes de supply chain comme MALFEX exploitent depuis plus de trois ans.