À la suite d'une compromission du processus de création de versions basé sur GitHub Actions dans le projet TanStack, les attaquants ont réussi à publier 84 versions malveillantes dans le dépôt NPM, touchant 42 paquets NPM du stack TanStack. Certains des paquets compromis comptaient plus de 10 millions de téléchargements par semaine.
L'accès à la publication des versions a été obtenu en raison d'une mauvaise configuration de pull_request_target « Pwn Request » dans GitHub Actions (la spécification de masque dans les paramètres a conduit à l'exécution de pull_request_target pour des demandes de tirage dans des forks externes), d'une contamination du cache GitHub Actions via le fork, et de la possibilité d'extraire le jeton OIDC de la mémoire du processus runner exécuté (Runner.Worker) en lisant le contenu de /proc//mem.
Les paquets NPM avec des modifications malveillantes ont été publiés le 11 mai entre 22h20 et 22h26 (MSK), détectés au bout de 20 minutes et bloqués après une heure et demie. Pour chacun des paquets NPM concernés, deux versions malveillantes ont été publiées, intégrant un code pour activer le ver mini-shai-hulud, qui recherchait des jetons et des identifiants dans l'environnement actuel. En cas de détection d'un jeton d'accès au répertoire NPM, le ver publiait automatiquement de nouvelles versions malveillantes pour les paquets en cours de développement dans l'environnement actuel, affectant l'arborescence des dépendances. Plus de 400 paquets NPM utilisant des paquets TanStack comme dépendances ont ainsi été compromis.
Le ver était situé dans le fichier router_init.js et s'activait lors de l'installation du paquet compromis manuellement par le développeur ou automatiquement dans un environnement d'intégration continue via les commandes « npm install », « pnpm install » ou « yarn install ». Après activation, le ver recherchait dans le système les jetons pour NPM (~/.npmrc), AWS, GCP, Azure, HashiCorp et KubernetesK8s, ainsi que les clés privées SSH. Les données trouvées étaient envoyées aux criminels via le messager décentralisé P2P getsession.org.
Le ver prévoyait d'effectuer des actions destructrices en cas de révocation du jeton NPM intercepté : le système était configuré pour exécuter périodiquement le script ~/.local/bin/gh-token-monitor.sh, qui vérifiait l'activité du jeton toutes les 60 secondes en interrogeant api.github.com/user et en cas de révocation du jeton, exécutait la commande « rm -rf ~/ ».
Source : opennet.ru
