En bref

  • Quatre paquets npm de l'écosystème SAP Cloud Application Programming compromis le 29 avril 2026.
  • Premier vecteur de persistance documenté ciblant les configurations d'agents IA de code (Claude Code, VS Code).
  • Charge utile : voleur d'identifiants GitHub, npm, AWS, Azure, GCP, Kubernetes ; exfiltration via dépôts GitHub publics.

Les faits

Le 29 avril 2026, entre 09:55 UTC et 12:14 UTC, le groupe TeamPCP a publié sur le registre npm des versions piégées de quatre paquets appartenant au framework SAP Cloud Application Programming Model (CAP) : @cap-js/sqlite en version 2.2.2, @cap-js/postgres en version 2.2.2, @cap-js/db-service en version 2.10.1 et mbt en version 1.2.48. Ces paquets totalisent plus de 570 000 téléchargements hebdomadaires cumulés selon les chiffres rapportés par Wiz et Sophos, dont environ 250 000 pour @cap-js/sqlite et 260 000 pour @cap-js/db-service.

La campagne, baptisée « Mini Shai-Hulud » par les chercheurs d'Aikido, se distingue de la souche « Shai-Hulud 2 » apparue plus tôt en avril 2026 par sa cible spécifique (l'écosystème SAP) et son runtime d'exécution (Bun plutôt que Node.js). Elle est attribuée au même opérateur que la compromission du paquet @bitwarden/cli@2026.4.0 du 22 avril 2026, à savoir TeamPCP, déjà connu pour les attaques sur LiteLLM, Trivy et Checkmarx KICS au cours du printemps 2026.

Le mécanisme d'infection repose sur un script preinstall ajouté au package.json. Lors de l'installation par npm, ce script charge un fichier nommé setup.mjs, qui sert de loader pour récupérer le runtime Bun et exécuter la charge utile execution.js. Cette dernière agit comme stealer de credentials et framework de propagation. La cible principale : les variables d'environnement et fichiers de credentials des développeurs (jetons GitHub et npm, clés AWS et Azure, configurations GCP et kubeconfig), ainsi que les secrets exposés dans les jobs GitHub Actions.

L'innovation marquante de cette campagne, soulignée par StepSecurity et Wiz, est le mécanisme de persistance et de propagation. La charge utile s'auto-injecte dans tout dépôt GitHub accessible via deux fichiers de configuration : un .claude/settings.json qui détourne le hook SessionStart de Claude Code, et un .vscode/tasks.json paramétré avec runOn=folderOpen. Concrètement, dès qu'un développeur ouvre un dépôt infecté dans VS Code ou démarre une session Claude Code, le malware s'exécute automatiquement, ré-extrait les credentials de la nouvelle machine et propage l'infection à d'autres dépôts.

Il s'agit, à la connaissance de la communauté sécurité, de la première campagne de chaîne d'approvisionnement publiquement documentée à exploiter explicitement les fichiers de configuration d'un agent de code IA comme vecteur de persistance et de latéralisation. Le constat est inquiétant : les développeurs adoptent massivement Claude Code, Cursor, Copilot et leurs équivalents, sans que les configurations associées (.claude/, .cursor/, settings.json) soient systématiquement traitées comme des artefacts de sécurité par les pipelines CI/CD ni par les revues de code.

L'exfiltration des données volées s'effectue de manière originale via la création de dépôts GitHub publics chiffrés depuis les comptes des victimes, méthode déjà observée sur les variantes précédentes de Shai-Hulud. Cette technique permet de noyer les flux malveillants dans le trafic GitHub légitime et complique le blocage par les EDR et NDR.

npm a quarantaine les versions concernées dans les heures suivant le signalement, et SAP a publié un avis de sécurité demandant aux équipes utilisatrices de CAP de vérifier leurs lockfiles. PyPI a également mis en quarantaine PyTorch Lightning 2.6.2 et 2.6.3, publiées le 30 avril 2026, qui constituent une extension de la campagne sur l'écosystème Python. Source : analyses publiées par Sophos, Wiz, Aikido, Onapsis, Mend.io et The Hacker News entre le 29 avril et le 1er mai 2026.

Impact et exposition

Trois cercles d'exposition se dessinent. Premier cercle : toutes les équipes ayant exécuté npm install sur un projet utilisant l'un des quatre paquets SAP CAP entre 09:55 UTC et l'heure de quarantaine du 29 avril 2026. La probabilité que des credentials aient été exfiltrés est élevée. Deuxième cercle : tout dépôt ouvert dans VS Code ou Claude Code après infection initiale d'un poste développeur — la charge utile se propage via les fichiers .claude/settings.json et .vscode/tasks.json injectés silencieusement. Troisième cercle : tous les environnements cloud auxquels les credentials volés donnent accès (registres privés npm, organisations GitHub, comptes AWS/Azure/GCP).

Le risque résiduel est durable : même après nettoyage des paquets npm, les fichiers de configuration injectés dans les dépôts GitHub continuent d'agir comme implants dormants. Sans audit ciblé, l'infection peut redémarrer chaque fois qu'un développeur ouvre le dépôt.

Recommandations

  • Auditer immédiatement les lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml) pour les versions piégées : @cap-js/sqlite@2.2.2, @cap-js/postgres@2.2.2, @cap-js/db-service@2.10.1, mbt@1.2.48.
  • Rechercher dans tous les dépôts les fichiers .claude/settings.json contenant un hook SessionStart inattendu, et les .vscode/tasks.json avec runOn=folderOpen non documenté.
  • Faire pivoter immédiatement tous les jetons GitHub, npm, AWS, Azure, GCP et Kubernetes des développeurs ayant pu installer les paquets concernés.
  • Désactiver l'exécution automatique des hooks d'agent IA et des tâches VS Code dans les politiques d'entreprise (settings sync, MDM, GPO).
  • Mettre en place un scanner Bun et Node dans le CI pour détecter les preinstall hooks suspects sur toutes les dépendances.
  • Surveiller la création soudaine de dépôts publics chiffrés depuis vos comptes GitHub d'organisation.

Alerte critique

Les configurations de Claude Code et de VS Code doivent être traitées comme du code exécutable. Tout fichier .claude/ ou .vscode/ poussé dans un dépôt doit être revu en code review au même titre qu'un script shell. Sans cette discipline, la prochaine vague de supply chain réinfectera les postes nettoyés en moins de 24 heures.

Comment détecter un .claude/settings.json malveillant dans mes dépôts ?

Un balayage simple en grep récursif sur "SessionStart" et sur les commandes inhabituelles (curl, wget, bun run, base64) dans les fichiers .claude/settings.json donne une première indication. Pour les organisations GitHub, l'API permet d'énumérer la présence de ces fichiers sur tous les dépôts en une requête. Tout hook SessionStart non documenté par votre équipe doit être considéré comme suspect par défaut.

Faut-il interdire totalement les hooks d'agent IA en entreprise ?

L'interdiction totale est rarement réaliste car les hooks ont des cas d'usage légitimes (formatage automatique, contrôles préalables). La bonne approche consiste à exiger une signature ou un manifeste centralisé pour tout hook autorisé, et à bloquer tout hook chargeant une URL externe ou un binaire inconnu. C'est une politique de sécurité applicative, pas une question d'outillage.

Vos pipelines CI/CD intègrent-ils la détection des configurations IA piégées ?

Ayi NEDJIMI conçoit des stratégies de hardening pour les environnements de développement modernes intégrant Claude Code, Copilot et les agents IA. Audit, politiques, détection.

Demander un audit