IronWorm : un ver npm écrit en Rust qui vole vos clés cloud et IA
IronWorm cache un binaire Rust déclenché au preinstall, moissonne les clés cloud et IA, puis se propage via GitHub. La règle YARA pour le détecter.
Après la compromission des paquets @asyncapi, un autre incident npm confirme que la chaîne d'approvisionnement JavaScript est un champ de bataille permanent. IronWorm, documenté par JFrog et suivi par OX Security, est un ver auto-répliquant écrit en Rust qui a infecté une trentaine de paquets npm. Il se distingue par une sophistication technique inhabituelle et par une cible qui devrait alerter toute équipe de développement moderne : les secrets cloud et les clés d'API des fournisseurs d'intelligence artificielle.
Un implant Rust, pas du JavaScript obfusqué
La première particularité d'IronWorm est de ne pas reposer sur du JavaScript obfusqué, comme la majorité des menaces npm. Le malware se cache dans un fichier exécutable binaire déclenché par un hook preinstall du paquet. Il s'agit d'un binaire ELF Rust d'environ 976 kilo-octets, exécuté au moment de l'installation, technique T1195.002 (Supply Chain Compromise).
Ce choix du Rust et du binaire natif n'est pas anodin : il complique l'analyse et échappe aux outils qui inspectent uniquement le code JavaScript des paquets. L'implant embarque un stub UPX modifié sur mesure pour déjouer les dépaqueteurs fondés sur signature, chiffre chaque chaîne interne avec une clé unique par site d'appel, et transporte un rootkit noyau de type eBPF. Sa communication de commande et contrôle passe par Tor, T1071.
Une cible taillée pour le développeur de 2026
Une fois actif, l'implant balaie 86 variables d'environnement et plus de vingt chemins de fichiers d'identifiants, couvrant AWS, GCP, Azure, Vault, Kubernetes, npm, Docker, GitHub, ainsi que l'ensemble des clés des fournisseurs d'IA. C'est la technique T1552.001 (Unsecured Credentials: Credentials In Files). Cette liste dessine le portrait d'un poste de développeur ou d'un environnement d'intégration continue moderne : c'est exactement là que se trouvent, souvent en clair dans des variables d'environnement, les clés qui donnent accès à l'infrastructure entière.
Le mécanisme d'auto-propagation est le plus préoccupant. IronWorm se réplique en volant des identifiants puis en poussant des commits GitHub qui publient automatiquement de nouveaux paquets malveillants. Une fois un développeur ou un environnement d'intégration compromis, il peut publier des versions trojanisées de paquets appartenant à la victime, qui infectent à leur tour d'autres développeurs et systèmes. C'est ce qui en fait un ver au sens propre, et non une simple compromission ponctuelle.
Une règle YARA sur le binaire Rust et le contexte preinstall
La détection la plus robuste vise le binaire lui-même, en s'appuyant sur les marqueurs d'un ELF Rust empaqueté et sur les artefacts caractéristiques. Un paquet npm légitime n'embarque pratiquement jamais un binaire ELF Rust déclenché au preinstall.
rule IronWorm_Npm_Rust_Implant
{
meta:
description = "Detecte l implant Rust IronWorm distribue via npm (preinstall)"
reference = "https://www.ox.security/blog/ironworm-supply-chain-malware-hits-npm/"
author = "ThreatClaw"
date = "2026-07-18"
strings:
$elf = { 7f 45 4c 46 }
$rust1 = "rustc" ascii
$rust2 = "cargo" ascii
$panic = "called `Result::unwrap()`" ascii
$upx = "UPX!" ascii
$tor = ".onion" ascii
condition:
$elf at 0 and
filesize < 3MB and
2 of ($rust1, $rust2, $panic) and
( $upx or $tor )
}Cette règle exige un en-tête ELF, une taille compatible avec un implant compact, des marqueurs Rust, et au moins un indice de compression sur mesure ou de commande et contrôle par Tor. Complétez-la par une inspection statique des fichiers package.json cherchant un hook preinstall ou postinstall qui exécute un binaire local plutôt qu'un script, un schéma inhabituel qui mérite toujours une revue.
Les mesures de fond pour une équipe de développement
Au delà de la détection, deux principes limitent l'impact d'un tel ver. Le premier est de ne jamais laisser de secrets durables dans les variables d'environnement d'un poste ou d'un runner : privilégier des secrets à durée de vie courte, injectés au moment du besoin et révoqués ensuite, prive l'implant de matière à voler. Le second est de contrôler la publication npm et les jetons GitHub : exiger une authentification forte pour publier, et surveiller les publications de paquets inattendues, casse le mécanisme d'auto-propagation.
Détecter un implant natif embarqué dans la chaîne d'approvisionnement demande des signatures maintenues sur les binaires réels, pas seulement des règles sur le code JavaScript. C'est ce que fournit le feed YARA ThreatClaw : des règles construites à partir d'échantillons réels et testées contre un corpus de code légitime, pour repérer les charges natives que les inspections de surface laissent passer.
Articles liés
La compromission des paquets @asyncapi exécute la charge à l'import du module, pas à l'installation. Pourquoi --ignore-scripts échoue et comment détecter par YARA.
Un feed de règles ne vaut pas par son nombre de règles, mais par la preuve qu'elles fonctionnent et par ce que vous en faites quand elles se déclenchent. Testées sur moteur réel, anti-faux-positifs prouvé, signées, et chaque règle porte un playbook d'investigation relié à nos autres moteurs.
De juin à août 2026, ThreatClaw a forgé 72 nouvelles familles de malware dans son feed YARA : Prometei, WannaCry, EternalBlue, GhostNFC, SpyNote, Mamont, Neshta… Chacune validée sur 5 694 binaires légitimes, zéro faux positif.
Botnet Prometei sur Linux, injection de code Windows, macros Office, Android, téléchargeurs. ThreatClaw ajoute 14 familles de malware fraîches à son feed YARA, 391 règles, validées sur 5 694 binaires légitimes sans un seul faux positif.