Un runner est une machine qui exécute vos jobs CI avec vos secrets. S'il survit d'un job à l'autre, il devient un point de pivot : un job compromis y laisse une charge qui piège les suivants ou siphonne les secrets d'autres pipelines. La parade tient en un mot, l'éphémérité : un job, un runner neuf, puis destruction, sans aucun état qui persiste.
Dans le détail, un runner est provisionné à la demande puis détruit après le job, sans réutilisation ; les caches partagés sont proscrits ou cloisonnés pour qu'un build n'en contamine pas un autre ; les images privées ne fuitent pas entre projets ou tenants ; et aucun secret ne survit en mémoire d'une exécution à la suivante. Au niveau souverain, l'isolation va jusqu'à des exécuteurs jetables, sans socle mutable partagé.
Concrètement, ces exigences parent : le runner persistant transformé en point de pivot (un job compromis piège les suivants), le cache partagé utilisé comme canal de contamination entre builds, la fuite d'images privées entre projets ou tenants, et la récupération de secrets laissés en mémoire d'une exécution à l'autre.
Un runner persistant accumule secrets et caches, et devient un point de pivot durable.
Les pièges à éviter
Section intitulée « Les pièges à éviter »Les erreurs les plus fréquentes sur ce périmètre :
Exigences
Section intitulée « Exigences »un runner exécute un seul job puis est détruit ; aucune réutilisation entre jobs.#
Réutiliser un runner d'un job à l'autre laisse au suivant les fichiers, processus et secrets du précédent : un job compromis piège alors les pipelines suivants. Un seul job par runner, puis destruction supprime ce point de pivot.
- Preuve attendue
- Config d'autoscaling en mode usage unique (--ephemeral / runners jetables) ; aucun runner réutilisé entre jobs.
- Outillage
- Harden-Runner actions-runner-controller
Correspondances & menaces parées 3 standards · 1 menace
Un runner auto-hébergé non éphémère conserve un état entre jobs (fichiers, secrets, processus), permettant à un job compromis de piéger les suivants ou d'exfiltrer des données d'autres pipelines. La persistance du runner est l'angle mort CICD-SEC-7.
autoscaling sur runners éphémères ; runners persistants proscrits pour les charges non fiables.#
Un runner persistant accumule accès et secrets et survit aux jobs : c'est l'angle mort de CICD-SEC-7. L'autoscaling de runners éphémères provisionne puis détruit ; les runners persistants sont proscrits pour les charges non fiables (forks, PR externes).
- Preuve attendue
- Inventaire des runners : tous éphémères ; aucun runner persistant rattaché à des charges non fiables.
- Outillage
- Harden-Runner actions-runner-controller
Correspondances & menaces parées 3 standards · 1 menace
Un runner auto-hébergé non éphémère conserve un état entre jobs (fichiers, secrets, processus), permettant à un job compromis de piéger les suivants ou d'exfiltrer des données d'autres pipelines. La persistance du runner est l'angle mort CICD-SEC-7.
aucun état (workspace, cache, fichiers temporaires, secrets) ne persiste après le job.#
Tout état laissé derrière (workspace, cache, fichiers temporaires, secrets) devient exploitable par le job suivant ; le cache partagé est un canal de contamination classique. L'exigence impose qu'aucun état ne survive au job : le runner repart toujours propre.
- Preuve attendue
- Preuve de nettoyage post-job ; inspection d'un runner après exécution sans résidu.
- Outillage
- Harden-Runner actions-runner-controller
Correspondances & menaces parées 3 standards · 3 menaces
Un attaquant écrit dans un cache partagé du CI (dépendances, couches d'image, artefacts intermédiaires) une charge réutilisée par d'autres builds. Le cache, supposé sûr, propage la compromission entre exécutions ou projets CICD-SEC-4. Un runner auto-hébergé non éphémère conserve un état entre jobs (fichiers, secrets, processus), permettant à un job compromis de piéger les suivants ou d'exfiltrer des données d'autres pipelines. La persistance du runner est l'angle mort CICD-SEC-7. Un job compromis balaie la mémoire ou l'environnement du runner pour récolter les secrets d'autres étapes ou pipelines. Le partage de runner sans isolation expose les secrets transverses CICD-SEC-6.
environnement reconstruit depuis une image immuable à chaque provisionnement.#
Un runner qui vit longtemps dérive : binaires ajoutés, configuration modifiée, porte dérobée déposée. Le reconstruire depuis une image immuable à chaque provisionnement garantit un état connu et reproductible ; toute altération disparaît à la recréation.
- Preuve attendue
- Référence d'image immuable + horodatage de (re)création à chaque provisionnement.
- Outillage
- Harden-Runner actions-runner-controller
Correspondances & menaces parées 3 standards · 2 menaces
Un attaquant écrit dans un cache partagé du CI (dépendances, couches d'image, artefacts intermédiaires) une charge réutilisée par d'autres builds. Le cache, supposé sûr, propage la compromission entre exécutions ou projets CICD-SEC-4. Un runner auto-hébergé non éphémère conserve un état entre jobs (fichiers, secrets, processus), permettant à un job compromis de piéger les suivants ou d'exfiltrer des données d'autres pipelines. La persistance du runner est l'angle mort CICD-SEC-7.
pas de réutilisation du cache d'images entre projets/tenants (pull d'image forcé) ; évite la fuite d'images privées entre charges.#
Partager le cache d'images entre projets ou tenants fait fuiter des images privées et propage une couche piégée d'un build à l'autre. Le pull forcé isole chaque charge : on récupère l'image depuis sa source, sans hériter du cache d'un voisin.
- Preuve attendue
- Politique de pull forçant la récupération (pull_policy=always) ; pas de cache d'images partagé entre projets.
- Outillage
- Harden-Runner actions-runner-controller
Correspondances & menaces parées 3 standards · 1 menace
Un attaquant écrit dans un cache partagé du CI (dépendances, couches d'image, artefacts intermédiaires) une charge réutilisée par d'autres builds. Le cache, supposé sûr, propage la compromission entre exécutions ou projets CICD-SEC-4.