Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
agentic-workflow-injection — Fixtures GitHub Actions reproductibles, vulnérables et corrigées, pour l'injection de workflows agentiques (CVE-2026-44246), avec couverture de détection mesurée et recommandations d'atténuation. | Kitploit
Outils/GitHubGitHub/sushant-me/agentic-workflow-injection
Analyse StatiqueScanners de VulnérabilitésAnalyse des VulnérabilitésDevSecOpsArticles et RechercheApprentissage et ÉducationSécurité de l'IA
GitHubsushant-me/agentic-workflow-injection

agentic-workflow-injection

Fixtures GitHub Actions reproductibles, vulnérables et corrigées, pour l'injection de workflows agentiques (CVE-2026-44246), avec couverture de détection mesurée et recommandations d'atténuation.

Voir le dépôt
3il y a 1 jourPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Injection de workflow agentique : fixtures et comparaison de couverture

Fixtures reproductibles vulnérables/corrigées pour la classe de bug publiée sous CVE-2026-44246 (nnU-Net, injection de workflow agentique, CVSS 7.2, CWE-1427), ainsi que la sortie mesurée de trois détecteurs face à celles-ci.

Il existe parce qu'il n'y avait rien pour tester un détecteur. Écrire une règle pour cette classe signifie écrire une fixture à la main et espérer qu'elle soit fidèle ; les révisions publiées n'étaient disponibles qu'en sachant quel commit regarder, ce qui s'est avéré être la partie intéressante.

La classe

Un workflow GitHub Actions confie du texte non fiable à un agent IA qui possède les identifiants du dépôt.

Quatre conditions, toutes nécessaires :

  1. Un déclencheur non fiable. issues, issue_comment, pull_request_review — des événements dont le texte peut être rédigé par quiconque possède un compte GitHub.
  2. Un scope d'écriture sur le job. issues: write, contents: write, etc.
  • Un désengagement du contrôle d'acteur de l'action elle-même. claude-code-action et codex-action refusent un acteur d'exécution sans permission d'écriture sauf si une entrée (allowed_non_write_users, allow-users) l'autorise explicitement. Sans cette entrée, un auteur non fiable n'atteint jamais l'agent, et le workflow est la configuration sûre plutôt que celle-ci.
  • Le texte atteignant l'agent. Soit interpolé dans le workflow (${{ github.event.issue.body }} à l'intérieur de prompt:) soit récupéré à l'exécution (gh issue view) avec le token que le job fournit.
  • Ce n'est pas de l'injection de template. Rien n'est évalué comme du shell ; la charge utile est de la prose, et l'interpréteur est le modèle. C'est pourquoi le conseil habituel — citez vos variables, ne faites pas d'eval — ne s'applique pas, et pourquoi le correctif ci-dessous concerne ce que l'agent peut atteindre plutôt que l'échappement de l'entrée.

    La partie à connaître : le commit de correction n'est pas le correctif

    nnU-Net a durci ce workflow en deux commits, et un détecteur qui traite « avant » et « après » comme un binaire se trompe sur celui du milieu.

    révisioncommitdate--allowedTools de l'agentverdict
    vulnérable94300b49e7162026-04-13gh issue comment, gh issue editécriture atteignable
    « le correctif »4e4770b0b0e62026-04-24gh issue comment uniquement ; l'étiquetage déplacé vers un script wrapperécriture toujours atteignable
    ultérieure11bd8746fc062026-04-27aucune ; une étape ultérieure publie depuis un fichier que l'agent écritnon atteignable

    Le commit que tout le monde appellerait le correctif — son message est « hardened issue and PR agents » — a supprimé gh issue edit et routé les étiquettes via .github/scripts/safe-label.sh, mais a laissé Bash(gh issue comment:*) avec l'agent. L'agent pouvait toujours être orienté vers un commentaire, et le motif d'allowlist gh issue comment:* n'est pas limité à l'issue déclencheuse, donc la cible était au choix du modèle. Seul le troisième commit l'a fermé : l'agent écrit désormais /tmp/issue-comment.md et une étape ultérieure, non-agent, le publie avec ISSUE: ${{ github.event.issue.number }} pris depuis l'événement.

    Deux choses en découlent, et c'est pourquoi ce dépôt n'est pas juste deux fichiers :

    « Corrigé » est une affirmation sur une révision, pas sur une version. v2.4.1 est cité comme la version corrigée, mais son .github/workflows/ ne contient que codespell.yml — les workflows d'agent ne sont pas du tout dans ce tag. Vous ne pouvez pas vérifier le correctif depuis le tag ; vous devez épingler le commit.

    Le bloc de permissions ne change jamais. issues: write est présent et correct dans les trois révisions, y compris la dernière, car une étape ultérieure en a besoin. Un détecteur qui se base uniquement sur permissions ne peut pas séparer la révision 1 de la révision 3. Ce qui les sépare, c'est ce que l'agent peut appeler.

    Couverture mesurée

    Trois détecteurs, exécutés sur les deux fixtures et les trois révisions réelles. Sortie brute complète et versions des outils dans results.md.

    révisionagentbound 0.1.3sisakulint v0.3.7zizmor 1.30.1
    1-vulnerableHIGH write-scope, HIGH untrusted-contentai-action-prompt-injection—
    2-fix-commitHIGH write-scope, CRITICAL author-association— (générique uniquement)—
    3-laterLOW write-scope, CRITICAL author-associationai-action-excessive-tools, ai-action-execution-order—

    Aucun détecteur n'est simplement « faux » ici — ils répondent à des questions différentes :

    • zizmor est un auditeur Actions généraliste. Il rapporte l'hygiène d'épinglage d'actions et de persistance des identifiants de manière identique sur les trois révisions. Hors périmètre pour cette classe par conception, et inclus parce que « le linter bien connu était propre sur le fichier vulnérable » est facilement confondu avec un bilan de santé propre.
    • sisakulint dispose de règles IA conçues spécifiquement et est le seul outil ici qui nomme le mécanisme même du CVE : ai-action-prompt-injection se déclenche sur la révision vulnérable, où le corps de l'issue est interpolé dans prompt:, et s'arrête une fois l'interpolation disparue. Correct. Ses constats sur la révision ultérieure méritent d'être lus avant d'agir dessus — ai-action-excessive-tools signale Write, que ce workflow utilise volontairement pour écrire le fichier qu'une étape ultérieure publie ; et ai-action-execution-order veut l'agent en dernier, ce qui est exactement ce que cette conception évite, puisque les étapes privilégiées viennent après la fin du tour du modèle.
    • agentbound est le seul outil qui sépare la révision 2 de la révision 3, en lisant l'allowlist d'outils de l'agent plutôt que les permissions du job. Son constat ci-agent-missing-author-association est rapporté à critical sur la révision ultérieure et son propre README décrit cela comme trop sévère plutôt que faux : auto-triage est censé être atteignable par n'importe qui.

    Chaque outil ici a un constat qu'il rapporte sur une révision dont l'auteur avait déjà raisonné sur cette condition exacte. C'est l'état normal d'une heuristique, et la raison pour laquelle une table de couverture est plus utile qu'une colonne réussite/échec.

    Utilisation

    root@kitploit:~
    git clone https://github.com/sushant-me/agentic-workflow-injection
    cd agentic-workflow-injection
    
    bash scripts/fetch-revisions.sh   # the three real revisions, pinned by SHA
    bash scripts/benchmark.sh         # runs every detector that is installed
    

    benchmark.sh signale un détecteur manquant comme manquant plutôt que de le sauter silencieusement, car une table de couverture qui omet discrètement un outil ne prouve rien à son sujet.

    Les fixtures sont la forme réduite, écrites pour ce dépôt et sous licence MIT comme le reste. Elles sont fidèles au mécanisme plutôt que des copies : fixtures/vulnerable.yml porte les quatre conditions et rien d'autre, et fixtures/fixed.yml est le même fichier avec les six changements qui comptent, chacun annoté. Si vous ajoutez une règle, ces deux fichiers sont les plus petites entrées qu'elle doit traiter correctement.

    Deux particularités d'interface, gérées dans le script mais bonnes à connaître :

    • sisakulint n'analyse pas un fichier en dehors d'un dépôt git. Face à un tel fichier, il affiche not found et sort avec le code 3. Sans surveillance, cela ressemble exactement à un scan propre.
    • Le path JSON d'agentbound est un basename, donc un scan de répertoire sur des fichiers portant le même nom est ambigu.

    Correction

    La détection est la moitié facile. docs/mitigations.md couvre l'autre moitié : comment borner l'autorité d'un agent, avec les couches classées selon une question — ce contrôle dépend-il du fait que le modèle choisisse de se conformer ?

    Ce classement est tout l'intérêt. Une instruction dans un prompt est une entrée, pas une clause de garde ; un motif d'outil qui nomme sa cible, ou un token que l'agent ne détient jamais, est une borne. Le guide descend de « le modèle ne peut pas faire la mauvaise chose » à « on a demandé au modèle de ne pas le faire », avec une checklist et l'évolution de nnU-Net comme exemple concret.

    fixtures/fixed.yml étiquette chacun de ses six changements avec la couche qu'il implémente et avec le fait qu'il soit porteur ou non — deux d'entre eux ne le sont pas, et sont étiquetés ainsi pour qu'un lecteur ne surestime pas le fichier.

    Provenance

    Récupéré à l'exécution par SHA de commit, jamais vendu :

    fichierdépôtcommitchemin
    real/1-vulnerable.ymlMIC-DKFZ/nnUNet94300b49e716.github/workflows/issue-triage.yml
    real/2-fix-commit.ymlMIC-DKFZ/nnUNet4e4770b0b0e6.github/workflows/issue-agent.yml
    real/3-later.ymlMIC-DKFZ/nnUNet11bd8746fc06.github/workflows/issue-agent.yml

    Aucune copie de la configuration de nnU-Net n'est redistribuée ici ; relancez la récupération et comparez vous-même les octets avec les blobs ci-dessus.

    Périmètre

    Ceci est un artefact d'ingénierie de détection. Il ne contient aucun exploit, et rien ici n'a été testé contre un workflow en production — les révisions vulnérables sont des fichiers statiques, déjà publics dans l'historique de nnU-Net et référencés par un avis publié. Les fixtures sont marquées do not deploy parce qu'elles existent pour être détectées, pas copiées.

    Si vous maintenez un détecteur pour cette classe et voulez une ligne dans la table, le script de benchmark est l'interface : ajoutez une section qui exécute votre outil sur targets et affiche ses constats, et les fixtures et révisions épinglées font le reste.

    MIT.

    Télécharger l’outil