SOC Prime Bias: Critique

15 May 2026 13:38 UTC

Une attaque active de la chaîne d’approvisionnement compromet le package node-ipc

Author Photo
SOC Prime Team linkedin icon Suivre
Une attaque active de la chaîne d’approvisionnement compromet le package node-ipc
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Résumé

Les chercheurs de Socket ont découvert un compromis de la chaîne d’approvisionnement touchant 84 paquets npm publiés sous le @tanstack espace de noms. Les mises à jour malveillantes ont introduit un fichier JavaScript fortement obscurci conçu pour voler des secrets liés à la CI depuis GitHub Actions, AWS, HashiCorp Vault, et les environnements Kubernetes, puis utiliser ces informations d’identification pour se republier sur npm. La charge utile a également implanté des crochets de persistance dans les répertoires de configuration de Claude Code et de VS Code. Les chercheurs ont lié cette activité à la campagne de malware plus large Mini Shai-Hulud dans la chaîne d’approvisionnement.

Enquête

L’enquête a identifié un fichier récemment ajouté, router_init.js, qui utilisait la rotation de tableau de chaînes, une couche supplémentaire de décodage XOR et Base64, et la démonisation pour dissimuler son comportement. Le malware ciblait les variables d’environnement, les services de métadonnées cloud, et les points de terminaison API associés à GitHub, AWS, Vault, et Kubernetes pour collecter des informations d’identification. Il se propageait en abusant de la fédération OIDC de GitHub Actions pour obtenir des jetons de publication npm et insérait une dépendanceOptionnelle on @tanstack/setupmalveillante. Le trafic d’exfiltration était acheminé par le réseau de messagerie décentralisé Session.

Atténuation

Les organisations affectées par la campagne doivent vérifier les hachages de tous les @tanstack/* contenus de paquets, faire tourner tous les identifiants CI et cloud, révoquer les autorisations de fédération OIDC exposées, et supprimer les fichiers non autorisés des répertoires .claude and .vscode . Bloquer le trafic sortant vers filev2.getsession.org et appliquer des contrôles d’intégrité pour les paquets npm peuvent réduire encore plus l’exposition. Les workflows de GitHub Actions doivent également être renforcés en fixant des actions tierces et en minimisant les autorisations id-token .

Réponse

Les défenseurs devraient rechercher la présence de router_init.js et les noms de fichiers associés, surveiller les processus suspects générés et alerter sur l’accès aux points de terminaison de métadonnées cloud identifiés. Tout paquet compromis doit être mis en quarantaine, les crochets malveillants supprimés, et toutes les informations d’identification exposées doivent être tournées immédiatement. Les équipes de sécurité devraient également mener une révision complète de l’activité GitHub Actions pour une utilisation non autorisée de jetons et valider la provenance de tous les paquets npm publiés.

"graph TB %% Class Definitions classDef technique fill:#e6f7ff classDef operator fill:#ffcc66 %% Nodes representing each ATT&CK technique a_initial_access["<b>Technique</b> – <b>T1195.001 Supply Chain Compromise</b><br/><b>Description</b>: Adversary compromises a software supply chain (e.g., malicious npm package) to gain initial access."] class a_initial_access technique b_execution["<b>Technique</b> – <b>T1129 Shared Modules</b><br/><b>Description</b>: Malicious shared module (router_init.js) runs automatically during package installation."] class b_execution technique c_persistence["<b>Technique</b> – <b>T1176.002 IDE Extensions</b><br/><b>Description</b>: Writes hidden files (.claude, .vscode) and hooks to maintain persistence via compromised IDE extensions."] class c_persistence technique d_def_evasion["<b>Technique</b> – <b>T1027 Obfuscated Files or Information</b><br/><b>Description</b>: Payload is obfuscated to avoid detection.<br/><b>Technique</b> – <b>T1140 Deobfuscate/Decode Files or Information</b><br/><b>Description</b>: Runtime routine deu2011obfuscates code before execution."] class d_def_evasion technique e_cred_access["<b>Technique</b> – <b>T1552.005 Unsecured Credentials</b><br/><b>Description</b>: Reads cloud instance metadata API for credentials.<br/><b>Technique</b> – <b>T1555.006 Cloud Secrets Management</b><br/><b>Description</b>: Retrieves secrets from cloud secret stores."] class e_cred_access technique f_account_disc["<b>Technique</b> – <b>T1087.004 Cloud Account</b><br/><b>Description</b>: Enumerates cloud account information to identify resources and privileges."] class f_account_disc technique g_cred_use["<b>Technique</b> – <b>T1078 Valid Accounts</b><br/><b>Description</b>: Uses harvested OIDC token as a valid account to publish further malicious packages."] class g_cred_use technique h_propagation["<b>Technique</b> – <b>T1195.001 Supply Chain Compromise</b><br/><b>Description</b>: Reu2011uses malicious package via optionalDependencies and npm prepare hook to spread to downstream projects."] class h_propagation technique i_command_exec["<b>Technique</b> – <b>T1059.009 Cloud API Calls</b><br/><b>Description</b>: Executes commands by invoking GitHub, AWS and Vault APIs directly from the compromised environment."] class i_command_exec technique j_exfiltration["<b>Technique</b> – <b>T1041 Exfiltration Over C2 Channel</b><br/><b>Description</b>: Exfiltrates data over a peeru2011tou2011peer session channel established between compromised nodes."] class j_exfiltration technique k_remote_services["<b>Technique</b> – <b>T1021.007 Cloud Services</b><br/><b>Description</b>: Leverages GitHub GraphQL commits as a remote service to maintain command and control."] class k_remote_services technique %% Sequential flow connections a_initial_access –>|leads_to| b_execution b_execution –>|leads_to| c_persistence c_persistence –>|leads_to| d_def_evasion d_def_evasion –>|leads_to| e_cred_access e_cred_access –>|leads_to| f_account_disc f_account_disc –>|leads_to| g_cred_use g_cred_use –>|leads_to| h_propagation h_propagation –>|leads_to| i_command_exec i_command_exec –>|leads_to| j_exfiltration j_exfiltration –>|leads_to| k_remote_services "

Flux d’Attaque

Exécution de Simulation

Prérequis : Le contrôle préalable de la Télémétrie et de la Ligne de Base doit avoir été réussi.

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 la télémétrie exacte attendue par la logique de détection. Des exemples abstraits ou non liés entraîneront un diagnostic erroné.

  • Narratif d’Attaque & Commandes :

    1. Obtenir un jeton de session IMDSv2 – l’attaquant émet une PUT requête au point de terminaison du jeton avec un TTL de 21600 secondes.
    2. Utiliser le jeton pour interroger le nom du rôle IAM exposé à /latest/meta-data/iam/security-credentials/.
    3. Récupérer les informations d’identification IAM temporaires (AccessKeyId, SecretAccessKey, Token) pour le profil d’instance.
    4. Stocker les informations d’identification localement pour une utilisation ultérieure (par exemple, appeler des APIs AWS, pivoter, ou effectuer des attaques de pulvérisation de mots de passe).

    Ces étapes génèrent du trafic HTTP vers les URIs exactes listées dans la règle Sigma, qui, lorsqu’elles sont capturées par les VPC Flow Logs, doivent satisfaire la condition de détection.

  • Script de Test de Régression :

    #!/usr/bin/env bash
    # -------------------------------------------------
    # Script: aws_imds_credential_harvest.sh
    # But : Simuler la récolte d'informations d'identification via IMDSv2 / métadonnées ECS
    # -------------------------------------------------
    
    set -euo pipefail
    
    # 1. Demander un jeton IMDSv2
    TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" 
      -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" -s)
    
    if [[ -z "$TOKEN" ]]; then
      echo "[!] Échec de l'obtention du jeton IMDSv2"
      exit 1
    fi
    echo "[*] Jeton IMDSv2 obtenu"
    
    # 2. Obtenir le nom du rôle IAM associé à l'instance
    ROLE_NAME=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" 
      -s http://169.254.169.254/latest/meta-data/iam/security-credentials/)
    
    if [[ -z "$ROLE_NAME" ]]; then
      echo "[!] Impossible de récupérer le nom du rôle IAM"
      exit 1
    fi
    echo "[*] Rôle IAM de l'instance : $ROLE_NAME"
    
    # 3. Récupérer les informations d'identification temporaires pour le rôle
    CREDS_JSON=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" 
      -s http://169.254.169.254/latest/meta-data/iam/security-credentials/$ROLE_NAME)
    
    echo "[*] Informations d'identification récupérées :"
    echo "$CREDS_JSON" | jq .
    
    # 4. (Optionnel) Exporter comme variables d'environnement pour une utilisation ultérieure avec AWS CLI
    export AWS_ACCESS_KEY_ID=$(echo "$CREDS_JSON" | jq -r .AccessKeyId)
    export AWS_SECRET_ACCESS_KEY=$(echo "$CREDS_JSON" | jq -r .SecretAccessKey)
    export AWS_SESSION_TOKEN=$(echo "$CREDS_JSON" | jq -r .Token)
    
    echo "[*] Informations d'identification exportées vers l'environnement (pour démonstration uniquement)."
    # -------------------------------------------------
    # Fin du script
    # -------------------------------------------------
  • Commandes de Nettoyage :

    # Définir à vide les variables d'environnement qui contiennent des informations d'identification temporaires
    unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
    
    # Supprimer tous les fichiers temporaires (aucun créé dans ce script)
    echo "[*] Nettoyage terminé."