Évasion par la CI aval : la PR de la lane code fait exécuter le code de l'agent avec le jeton du job #13
Labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
mathieu/lanes#13
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Constat
La lane
codeexécute les vérifications de l'agent sans aucun secret (jobverifier, sousnode,env -i). Mais la PR qu'elle ouvre déclenche ensuite le workflow de tests du dépôt surpull_request. Ce workflow exécute le code écrit par l'agent (tests, scripts, dépendances) avec le jeton automatique du job, qui a l'écriture sur le dépôt quand la branche vit dans le dépôt lui-même. La référence Forgejo le dit : seule une PR venue d'un fork reçoit un jeton en lecture.Scénario : un ticket piégé amène l'agent à écrire un test qui, lancé par la CI du dépôt, utilise
FORGEJO_TOKENpour pousser surmain, créer une étiquette ou modifier une autre branche. Le contrôle des chemins depublierne l'empêche pas : le fichier n'est ni un workflow ni un secret.Signalé par une revue de sécurité automatique le 2026-10-13, après l'équipement d'
atelier. Concerne tout dépôt équipé dont la CI tourne surpull_request.Ce qui ne marche pas
permissions: contents: read: la référence Forgejo Actions (version courante) ne documente aucune clépermissions. On ne peut pas restreindre le jeton depuis le workflow.Pistes
main. C'est le réglage minimal, à imposer dans le README (prérequis d'installation) et à vérifier paroutils/installer.py --etiquettes.fixà revoir.verifier. Écarté a priori : on perd la CI réelle.Critères d'acceptation
outils/installer.pysignale une branche par défaut non protégée.essai-actions: un test qui tentegit pushsurmainavec le jeton du job échoue.Atténué et documenté, risque résiduel suivi par #20.
606be5c) : section « CI aval » de CONTRAT.md ;installer.pysignale une CI non confinée et une branche par défaut mal protégée.essai-jeton.yml) : le jeton du job d'une PR interne est dans l'environnement de chaque étape, écrit desrefs/…hors branches, lance unworkflow_dispatch(HTTP 204) ; absent sousenv -i.879a8a9) :runusersans l'environnement de root,python3 -I.879a8a9;tests.ymlde fabrique-pdf, mathieu.lecrivain.fr, atelier exécutent le code sousnodesans jeton, CI vertes (runs 497, 498, 499).mainprotégée partout.Parade structurelle (PR du bot depuis un fork de
code-bot) : #20.