Romolo Tavani - stock.adobe.com

« Mini Shai-Hulud » : plus que des bugs, une course aux secrets

TeamPCP semble apprécier sa recette : compromettre un maillon de la chaîne logistique du logiciel pour tisser sa toile. Cette fois-ci, 160 paquets NPM ont été affectés, avec à la clé plusieurs entreprises de premier plan.

Plus de 160 paquets npm et 2 PyPI ont été touchés, incluant TanStack, Mistral AI, UiPath et Guardrails AI. C'est la campagne Mini Shai-Hulud. Elle souligne une nouvelle fois la fragilité intrinsèque de la chaîne logistique du logiciel, appelant à l'adoption de mécanismes de sécurité spécifiques.

La vulnérabilité principale provient d'une dépendance non vérifiée, où un `package.json` peut contenir un champ `optionalDependencies` pointant vers un commit GitHub sans historique parent, exécutable dès l'installation via un "prepare" lifecycle hook. 

Une charge utile de 2,3 MB appelée `router_init.js` est à la fois furtive et persistante, voire destructive. Mais elle ouvre la voie à la création d'une bulle de confiance à l'égard d'autres services : le code peut dérober des identifiants, puis en créer de nouveaux pour sur-communiquer. Au-delà des risques isolés pour une organisation victime, s'ajoute dès lors un risque de défaillance systémique lié à la gestion des dépendances logicielles.

Du côté du patient 0, tout commence par un "pull request target" qui permet à des charges utiles sur une copie de code (fork) de passer et d'infecter le cache pnpm-store de la base, ce qui autorise l'accès à des sources externes, explique TanStack dans son retour d'incident. Une fois le cache corrompu, l'attaquant peut extraire un jeton OIDC en mémoire du processeur runner via /proc/ /mem, permettant de publier n'importe quelle version malveillante sur npm sans avoir besoin de mots de passe volés, précise Orca Security.

La furtivité est assurée par une rotation de chaîne de caractères et un second niveau de décodage (XOR), empêchant ainsi la détection simple du contenu par grep. La communication sortante passe par le réseau P2P de Session, ce qui la rend totalement différentiable d'un trafic SMS classique et chiffré. Enfin, le code peut infecter d'autres paquets par simple dépendance, ce qui fait de n'importe quel projet une cible potentielle. 

Une fois sur la machine, le ver ne fait pas que regarder ; il vole et prend possession de l'environnement. Dans le Cloud, il lit les variables d'environnement, mais aussi les tokens IAM et les secrets de base de données depuis AWS, Azure ou GCP. Il peut même lire le carnet d'adresses du cluster Kubernetes pour en déduire son niveau d'accès. En local, il peut aussi lire le jeton SSH, les informations du routeur Wi-Fi ou même les clés de portefeuilles Bitcoin. Plus d'une centaine de chemins de fichiers sont parcouris en recherche de secrets, selon le système d'exploitation. Et s'il n'y a plus de route, il existe un « deadman switch » : si le jeton est révoqué, le code vient aussi tout effacer.

Derrière cette campagne se cache TeamPCP, qui s'est déjà illustré récemment par une campagne comparable et s'est associé à l'enseigne de ransomware Vect 2.0. Le groupe affiche désormais du code issu de Mistral AI parmi ses trophées. Il en demande 25 000 $. L'intéressé a reconnu la compromission.

Ce nouvel incident met une fois de plus amèrement en lumière la problématique de la gestion du code source et des dépendances dans la chaîne logistique du logiciel.