SOC Prime Bias: Critique

05 Jun 2026 15:45 UTC

L’attaque de la chaîne d’approvisionnement Miasma se propage via le ver Phantom Gyp

Author Photo
SOC Prime Team linkedin icon Suivre
L’attaque de la chaîne d’approvisionnement Miasma se propage via le ver Phantom Gyp
shield icon

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-moi

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 un binding.gypmalveillant. Lorsqu’un développeur exécute npm install, le processus de construction du package invoque node-gyp rebuild. À l’intérieur du script de construction généré, l’attaquant :

    1. Télécharge le runtime Bun (binaire signé) via curl vers un répertoire temporaire (/tmp/b-<rand>/).
    2. Élève les privilèges en invoquant sudo python3 pour décompresser le zip et placer le binaire dans /usr/local/bin.
    3. Récupère le jeton GitHub du développeur en utilisant gh auth token.
    4. 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 liste de la règle Sigma.

  • 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é."