En bref

  • L'attaque GHAPPIER a compromis 65 dépôts GitHub répartis sur 22 comptes développeurs en infectant 73 fichiers via le package npm @dforge-core/dforge-mcp transformé en loader malveillant.
  • Contrairement aux malwares npm classiques, le loader GHAPPIER ne s'active pas à l'installation mais au lancement du serveur MCP, le rendant invisible aux scanners de sécurité habituels.
  • Une connexion avec la campagne nord-coréenne PolinRider a été relevée dans un second payload découvert chez une des victimes, bien que l'attribution reste non confirmée à ce stade.

Ce qui s'est passé

Le 22 septembre 2026, les chercheurs de CloudSEK, relayés par Cybersecurity News et Infosecurity Magazine, ont publié une analyse détaillée de l'attaque de chaîne d'approvisionnement baptisée GHAPPIER. Cette campagne, débutée le 9 septembre 2026, a compromis 65 dépôts GitHub hébergés sur 22 comptes développeurs en infectant 73 fichiers. Elle illustre avec précision comment un compte de mainteneur compromis peut transformer une mise à jour de dépendance de routine en vecteur de distribution de malware à grande échelle dans l'écosystème des agents IA.

L'incident a débuté par la prise de contrôle du compte GitHub du mainteneur du package npm @dforge-core/dforge-mcp — un outil d'intégration pour les serveurs MCP (Model Context Protocol), un standard en pleine adoption dans l'écosystème des agents IA depuis 2025. L'intrus a opéré sur ce compte pendant 105 minutes le 9 septembre, durée pendant laquelle il a modifié le code source du package et déclenché la publication automatique d'une version malveillante via le pipeline d'intégration continue du projet. La release empoisonnée portait tous les attributs d'une publication légitime : signée via GitHub Actions, associée à un commit du mainteneur, publiée depuis la branche main officielle du dépôt.

La caractéristique technique la plus notable de GHAPPIER est son mécanisme d'activation différé. Contrairement à la majorité des malwares distribués via npm — qui exécutent leur payload via les scripts preinstall ou postinstall déclenchés automatiquement lors de npm install — le loader GHAPPIER ne s'active que lorsque le serveur MCP est effectivement lancé par le développeur. Cette approche réduit considérablement la probabilité de détection : les outils de sécurité qui analysent les scripts d'installation npm ne voient rien d'anormal, les pipelines CI/CD qui installent les dépendances sans les exécuter ne déclenchent pas le malware.

Une fois activé lors du lancement du serveur MCP, le loader collecte les variables d'environnement de la machine hôte — incluant potentiellement des tokens CI/CD, des clés d'accès cloud AWS ou Azure, des tokens GitHub, des certificats privés. Ces données sont exfiltrées vers une infrastructure C2 enregistrée deux jours avant l'attaque. Le loader installe ensuite un agent de persistance léger dans les répertoires de configuration utilisateur, puis commence à scanner les dépôts Git locaux clonés sur la machine infectée.

C'est ce mécanisme de propagation secondaire qui explique les 65 dépôts GitHub compromis. Pour chaque dépôt Git local détecté sur la machine infectée, le malware injecte des modifications malveillantes dans des fichiers ciblés — principalement des scripts de workflows GitHub Actions (.github/workflows), des Makefile et des scripts shell de déploiement. Ces modifications sont conçues pour paraître anodines lors d'une revue de code rapide : souvent un seul appel de commande ajouté dans une étape existante, qui télécharge silencieusement un loader de seconde étape lors de la prochaine exécution du pipeline. Lorsque le développeur pousse ces modifications sur ses propres dépôts — sans nécessairement avoir remarqué les changements — l'infection se propage à tous les collaborateurs et utilisateurs de ces projets.

L'analyse forensique de CloudSEK a mis en lumière un second payload découvert dans le dépôt d'une des victimes, qui correspond exactement aux empreintes techniques de PolinRider, une campagne de malware documentée depuis mars 2026 et attribuée par plusieurs chercheurs à des acteurs nord-coréens. CloudSEK précise que ses propres vérifications indépendantes n'ont pas permis de confirmer cette attribution, et que la connexion pourrait s'expliquer par le partage d'outils entre acteurs ou par l'utilisation d'un loader commun vendu comme service (Malware-as-a-Service). L'enquête est en cours.

GitHub a détecté l'activité anormale le 21 septembre et notifié les 22 développeurs dont les comptes avaient servi de vecteur secondaire. Ces développeurs n'étaient pas des attaquants : leurs machines avaient été compromises par le loader avant que leurs dépôts ne soient infectés à leur insu. GitHub a révoqué les tokens d'accès de ces comptes et restauré les fichiers modifiés à partir de l'historique Git. L'équipe de sécurité de npm a marqué la version malveillante de @dforge-core/dforge-mcp comme obsolète (deprecated) et envoie des avertissements aux projets qui la référencent encore dans leurs package-lock.json.

La fenêtre d'exposition maximale pour les consommateurs directs du package couvre la période du 9 au 21 septembre 2026. La version compromise a été téléchargée plusieurs milliers de fois durant cette période, touchant potentiellement des centaines d'environnements de développement et de pipelines CI/CD automatisés. Une concentration notable a été relevée dans des projets liés au développement d'agents IA — secteur d'adoption primaire du standard MCP — ce qui pourrait indiquer un ciblage intentionnel de cet écosystème spécifique.

Pourquoi c'est important

GHAPPIER s'inscrit dans une série d'incidents qui ont frappé l'écosystème npm en 2026, après l'attaque ChainDrop contre les dépendants de keyv (août 2026) et la compromission des credentials axios (mars 2026). Ces incidents révèlent une vérité structurelle inconfortable : la chaîne de confiance npm repose sur la sécurité des comptes de mainteneurs individuels. Un registre centralisé qui permet à quiconque disposant des credentials d'un mainteneur de publier des versions avec des scripts d'exécution arbitraire représente une surface d'attaque immense, d'autant plus que de nombreux packages populaires sont maintenus par une seule personne avec parfois des pratiques de sécurité personnelle insuffisantes.

Ce qui distingue GHAPPIER des attaques précédentes, c'est son mécanisme d'activation différé et sa propagation secondaire via les dépôts des développeurs infectés. L'attaque ne compromet pas seulement les consommateurs directs du package : elle transforme les machines de développement en rebonds pour infecter d'autres projets et leurs propres utilisateurs. Ce type de propagation en cascade rappelle les vers auto-réplicants des années 2000, transposés à l'écosystème de développement moderne et amplifiés par la vitesse de distribution des gestionnaires de paquets.

La cible particulière des outils MCP mérite attention. MCP est le protocole standardisé d'intégration entre les agents IA et leurs outils externes, adopté rapidement par les principaux éditeurs de modèles depuis 2025. Les machines de développement qui font tourner des serveurs MCP sont souvent connectées à des ressources sensibles : bases de code propriétaires, clés d'accès à des APIs LLM, datasets d'entraînement, configurations d'infrastructure cloud. Compromettre ces environnements via un outil MCP infecté donne accès à un périmètre bien plus large que le simple vol de credentials développeur, avec des implications potentielles sur la sécurité des modèles IA eux-mêmes.

Pour les équipes DevSecOps, GHAPPIER illustre les limites des approches de sécurité basées uniquement sur l'analyse des scripts d'installation. La vérification des hash de packages dans le lock file ne protège pas contre une version malveillante publiée légitimement avec de nouveaux hash. La seule protection robuste combine : audit systématique des diffs entre versions de dépendances avant mise à jour, utilisation d'outils de détection comportementale comme Socket.dev ou Phylum, isolation des environnements de build dans des containers éphémères sans accès aux credentials de production, et surveillance réseau sortante depuis les environnements de développement.

Ce qu'il faut retenir

  • Vérifier si @dforge-core/dforge-mcp apparaît dans vos package-lock.json entre le 9 et le 21 septembre 2026 et désinstaller immédiatement les versions compromises.
  • Le loader GHAPPIER ne s'active qu'au lancement du serveur MCP : les machines qui ont seulement installé le package sans le lancer sont probablement intactes, mais une vérification reste recommandée.
  • Isoler les environnements de build dans des containers sans accès aux credentials de production : c'est la seule façon de contenir l'impact d'un loader de type GHAPPIER sur la chaîne CI/CD.

Comment savoir si mon environnement a été touché par GHAPPIER ?

Vérifiez vos logs npm entre le 9 et le 21 septembre 2026 pour la présence de @dforge-core/dforge-mcp. Cherchez dans vos fichiers .github/workflows des étapes de build modifiées sur cette période. Inspectez les variables d'environnement de vos pipelines CI/CD pour détecter des transmissions réseau anormales lors des phases de test. Consultez le GitHub Security Advisory publié le 21 septembre pour la liste exacte des versions compromises et les indicateurs de compromission (IoC) publiés par CloudSEK.

Besoin d'un accompagnement expert ?

Ayi NEDJIMI vous accompagne sur vos projets cybersécurité et IA.

Prendre contact