Le 17 juin 2026, la quasi-totalité du scope npm @mastra, un framework TypeScript pour construire des agents d’IA, a été republiée avec une dépendance malveillante. Selon les décomptes, entre 143 et 144 paquets ont été touchés en moins de deux heures. La charge, cachée dans un faux clone de dayjs baptisé easy-day-js, installe un voleur de données et un cheval de Troie.
Comment l’attaque a fonctionné
Le code de Mastra lui-même n’a quasiment pas été modifié. Chaque version piégée ajoutait une seule ligne au package.json publié : une dépendance vers easy-day-js. Selon Snyk, les publications ont été faites avec le compte npm d’un ancien contributeur qui avait publié des versions alpha fin 2024 et début 2025, puis était resté inactif sans que ses droits sur le scope soient révoqués. L’adresse email du compte avait été changée, ce qui oriente vers une prise de contrôle plutôt qu’un acte interne.
| Date (UTC) | Événement |
|---|---|
| 16 juin | Publication d’une version saine de easy-day-js (1.11.21), copie de dayjs servant de leurre |
| 17 juin, ~01:01 | Publication de easy-day-js 1.11.22, avec un script postinstall malveillant |
| 17 juin, 01:12 à ~02:39 | Republication du scope @mastra avec la dépendance injectée |
| 17 juin | Alertes de plusieurs éditeurs de sécurité, retrait de easy-day-js de npm |
| 17 juin, ~18:00 | Versions corrigées de @mastra largement disponibles |
Ce que fait le malware
- Un script
postinstall(setup.cjs) s’exécute à l’installation, désactive la vérification des certificats TLS, télécharge une seconde charge depuis une adresse IP, la lance en arrière-plan puis s’efface. - La seconde charge vole des informations : profils Chrome, Brave et Edge, extensions de portefeuilles crypto (plus de 160 ciblées), historique de navigation, informations système et variables d’environnement, souvent riches en clés d’API.
- Elle installe aussi un accès distant persistant, déguisé en outil Node, sur Windows, macOS et Linux.
Parmi les versions malveillantes identifiées figurent @mastra/core@1.42.1, mastra@1.13.1 et create-mastra@1.13.1. D’après la Cloud Security Alliance, tout paquet @mastra/* publié entre 01:12 et environ 18:00 UTC le 17 juin doit être considéré comme suspect.
Vérifier si vous êtes touché
Cherchez la dépendance piégée dans vos arbres de dépendances et vos fichiers de verrouillage, puis les versions de Mastra résolues :
# easy-day-js est-il présent ?
npm ls easy-day-js
grep -r "easy-day-js" package-lock.json yarn.lock pnpm-lock.yaml
# Quelles versions de Mastra sont installées ?
npm ls @mastra/core mastra create-mastra
Si easy-day-js est absent et que votre lockfile référence des versions antérieures à l’incident, vous n’avez rien à faire de plus. Pensez aussi aux pipelines CI qui ont pu installer des dépendances le 17 juin.
Si une version malveillante a été installée, la mise à jour ne suffit pas : le malware a déjà pu s’exécuter. Traitez la machine (ou le runner CI) comme compromise, faites tourner tous les secrets accessibles (clés cloud, clés d’API de LLM, jetons npm et GitHub, secrets CI, clés SSH, chaînes de connexion) et, si possible, réinstallez le poste.
Les leçons pour les mainteneurs
- Auditer régulièrement la liste des mainteneurs d’un scope npm et retirer les comptes qui n’en ont plus besoin.
- Imposer la double authentification pour la publication et éviter les jetons qui la contournent.
- Surveiller l’apparition de dépendances nouvelles dans un paquet mature : une ligne ajoutée au package.json suffisait ici.
- Côté consommateurs : versions figées dans un lockfile versionné,
npm cien CI, et désactivation des scripts d’installation quand c’est possible.
Pour désactiver les scripts d’installation par défaut : npm config set ignore-scripts true. Certains paquets légitimes en ont besoin pour compiler du code natif : testez avant de généraliser.