Le 1er juin 2026, nous avons détecté plusieurs paquets officiels provenant du Portéecloud sur npm ont été compromis par un ver visant à voler des identifiants. Plus de 30 paquets semblent être concernés. Le logiciel malveillant semble similaire au Le malware Mini Shai-Hulud qui a récemment été mis en open source par TeamPCP. Depuis que ces outils ont été rendus publics, d'autres acteurs malveillants ont désormais accès aux mêmes techniques et peuvent les reproduire ou les adapter. Les paquets ont été publiés via GitHub Actions OIDC, ce qui indique que c'est le pipeline CI/CD qui a été compromis plutôt qu'un jeton npm. Si vous avez installé des versions de paquets concernées depuis le 1er juin 2026, considérez tous les secrets CI, cloud , clés SSH et jetons npm comme compromis et remplacez-les immédiatement.
Chronologie de la campagne « Mini Shai-Hulud »
- 22 avril 2026 - Le compte @bitwarden/cli a été compromis via un workflow GitHub Actions piégé. La charge utile s'intitule « Shai-Hulud : The Third Coming ».
- 29 avril 2026 - Quatre paquets SAP npm ont été compromis à la suite de la fuite d'un jeton npm via une compilation malveillante issue d'une pull request CircleCI.
- 30 avril 2026 - PyTorch Lightning a été compromis sur PyPI, versions 2.6.2 et 2.6.3.
- 12 mai 2026 - Mini Shai-Hulud dépasse les 160 paquets, dont Mistral et Tanstack.
- 12 mai 2026 - TeamPCP publie l'intégralité du code source de Shai-Hulud sur GitHub, tout en publiant des messages sur BreachForums pour encourager d'autres personnes à mener leurs propres campagnes.
- 19 mai 2026 - Le paquet npm DurableTask de Microsoft a été piraté, à la suite de la compromission d'un compte GitHub.
- 1er juin 2026 - Plus de 30
cloudpaquets npm compromis par Miasme, une nouvelle variante du Mini Shai-Hulud.
Miasma : Shai-Hulud est-il de retour ?
La charge utile intégrée aux paquets concernés présente de fortes similitudes avec Mini Shai-Hulud, le logiciel malveillant de la chaîne d'approvisionnement mis en open source par TeamPCP. Il est intéressant de noter que cette version se nomme « Miasma » et semble avoir remplacé les références habituelles à Dune de Shai-Hulud par des éléments issus de la mythologie grecque.
TeamPCP est un groupe de cybercriminels qui mène attaques de la chaîne d’approvisionnement plusieurs mois attaques de la chaîne d’approvisionnement ciblées de type CI/CD attaques de la chaîne d’approvisionnement . Leur malware « Mini Shai-Hulud » est un ver sophistiqué conçu pour voler des identifiants, qui se propage en republiant des versions piratées de paquets auxquels le compte de la victime a accès. Nous avons déjà signalé des compromissions affectant Mistral et TanStack, Durable Task de Microsoft, PyTorch Lightning, Bitwarden CLI et Intercom, toutes attribuées au même outil.
Lorsque TeamPCP a mis Mini Shai-Hulud en open source, la menace a dépassé le cadre d'un seul acteur. N'importe quel groupe peut désormais s'emparer de ce framework, l'adapter et le déployer contre de nouvelles cibles.
Contournement de la publication de confiance
La publication sécurisée est un mécanisme introduit par npm afin d'éliminer les jetons de publication à longue durée de vie des pipelines CI/CD, en les remplaçant par des jetons OIDC à courte durée de vie émis par GitHub Actions. Ce mécanisme a été conçu pour offrir une sécurité accrue, mais comme le montrent des attaques récentes, il peut être contourné si un pirate parvient à accéder à un pipeline CI/CD via une vulnérabilité ou un jeton compromis.
Nous avons découvert que le compte GitHub d'un employé de Red Hat avait été piraté et utilisé pour publier directement des commits orphelins malveillants dans plusieurs dépôts, contournant ainsi code review . Ces commits orphelins contenaient un fichier de workflow (ci.yaml) et un script (_index.js).
nom : sortie
le :
push :
branches : ['*']
tâches :
version :
fonctionne sur : ubuntu-latest
autorisations :
jeton d'identification : écriture
contenu : lecture
étapes :
- utilisations : actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- utilisations : oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6
- nom : préparer
exécution : bun exécuter _index.js
env :
OIDC_PACKAGES : "cloud,cloud,cloud,cloud,cloud,cloud,cloud,cloud,cloud,cloud,cloud,cloud,cloud,cloud"
WORKFLOW_ID : "ci.yaml"
REPO_ID_SUFFIX : « RedHatInsights/frontend-components »Lorsque le workflow s'exécute, il installe Bun et exécute _index.js, en lui transmettant une liste de paquets cibles via le OIDC_PAQUETS variable d'environnement. Le script utilise la id-token : écriture l'autorisation de demander un jeton OIDC à durée de vie limitée à GitHub, puis utilise ce jeton pour s'authentifier directement auprès du point de terminaison de publication de confiance de npm et publier des versions piratées de tous les paquets figurant dans la liste.
On retrouve ici le même schéma de base que celui observé lors des compromissions de TanStack et de Bitwarden: le pipeline CI/CD lui-même devient la surface d'attaque, tandis que la publication sécurisée basée sur l'OIDC — conçue pour éliminer les jetons à longue durée de vie — se transforme en un signal de confiance trompeur.
Le script de préinstallation
Chaque paquet compromis déclare un script de préinstallation dans son fichier package.json qui exécute automatiquement le fichier index.js de Node.js à chaque installation via npm, avant que le code de l'application ne soit exécuté et avant que le développeur ne se rende compte que quelque chose ne va pas.
"scripts": {
"preinstall": "node index.js"
}
Le fichier index.js contient une charge utile de 4,2 Mo dissimulée derrière plusieurs couches d'obfuscation.
Ce qu'il dérobe
Comme lors des précédentes attaques Mini Shai-Hulud, le code malveillant procède à un balayage à grande échelle des identifiants auprès cloud , des environnements CI/CD et des outils de développement. Du côté du CI, il cible les secrets de GitHub Actions, notamment GITHUB_TOKEN et ACTIONS_RUNTIME_TOKEN. En ce qui concerne cloud , il recueille les clés d'accès et les jetons de session AWS, les identifiants par défaut des applications GCP et les fichiers de clés des comptes de service, ainsi que les identifiants des entités de service Azure et les jetons d'identité gérée. Il recherche également les jetons HashiCorp Vault, les jetons des comptes de service Kubernetes et les fichiers kubeconfig, les jetons de publication npm et PyPI, les clés privées SSH, les identifiants des registres Docker, les clés GPG et tous les fichiers .env qu'il peut trouver dans le système de fichiers.
Comment Aikido détecte cela
Si vous êtes un utilisateur Aikido, vérifiez votre flux central et filtrez les problèmes de logiciels malveillants. Cela apparaîtra comme un problème critique 100/100. Aikido effectue des rescans nocturnes, mais nous vous recommandons de déclencher un rescan manuel dès maintenant.
Si vous n'êtes pas encore un utilisateur Aikido, vous pouvez créer un compte et connecter vos dépôts. Notre couverture des logiciels malveillants est incluse dans le plan gratuit, aucune carte de crédit requise.
Pour une couverture plus étendue de l'ensemble de votre équipe, la solution « Device Protection » Aikido vous offre une visibilité et un contrôle sur les logiciels installés sur les appareils de votre équipe. Elle couvre les extensions de navigateur, les bibliothèques de code, les plugins IDE et les dépendances de compilation, le tout en un seul endroit. Bloquez les logiciels malveillants avant même qu'ils ne s'installent.
Pour une protection future, envisagez Aikido Safe Chain (open source). Safe Chain s'intègre à votre flux de travail existant, en interceptant les commandes npm, npx, yarn, pnpm et pnpx et en vérifiant les paquets par rapport à Aikido Intel avant l'installation.
Indicateurs de compromission
Si vous avez installé l'une des versions de paquets suivantes, considérez que tous vos secrets CI, cloud , clés SSH et jetons npm ont été compromis et remplacez-les immédiatement :
cloud(2.3.1, 2.3.2)cloudhat-cloud-services/clientcloud(4.0.3, 4.0.4)cloud(5.0.4, 5.0.5)cloud(4.0.11, 4.0.12)cloud(3.2.1, 3.2.2)cloud(7.7.2, 7.7.3)cloud(3.8.2)cloud(6.11.3, 6.11.4)cloud(4.11.2, 4.11.3)cloud(6.9.2, 6.9.3)cloud(4.9.2, 4.9.3)cloud(1.2.1, 1.2.2)cloud(4.4.1, 4.4.2)cloud(7.4.1, 7.4.2)cloud(0.3.1, 0.3.2)cloud(0.3.1, 0.3.2)cloud(0.6.1, 0.6.2)cloud(5.0.3, 5.0.4)cloud(4.0.4, 4.0.5)cloud(6.0.4, 6.0.5)cloud(2.0.8, 2.0.9)@redhat-cloud-services/clientcloud(6.1.4, 6.1.5)cloud(4.0.4, 4.0.5)cloud(4.0.11, 4.0.12)cloud(9.0.3, 9.0.4)cloud(4.0.4, 4.0.5)cloud-cloud-services/composantscloud(4.7.2, 4.7.3)cloud(3.0.10, 3.0.11)cloud(3.0.10, 3.0.11)cloud(1.2.2)cloud(3.6.1, 3.6.2, 3.6.4)cloud(2.1.8, 2.1.9)

