Un runner exécute du code non fiable : dépendances tierces, PR externes, scripts de build. S'il tourne en root, avec le socket Docker monté ou sans bac à sable, une seule charge hostile s'échappe vers l'hôte et atteint les jobs voisins et leurs secrets. Cette famille confine chaque job : utilisateur non privilégié, pas d'accès à l'hôte, isolation forte job par job.
Dans le détail, chaque job tourne sous utilisateur non privilégié, sans socket Docker monté ni mode privileged qui donneraient un accès root à l'hôte, dans un bac à sable (microVM, gVisor, seccomp) qui contient une évasion. Les ressources sont plafonnées pour couper le minage et le déni de service, et seules des images et services validés s'exécutent. L'isolation reste forte entre jobs, pour qu'une charge hostile n'atteigne ni l'hôte ni les secrets des voisins.
Concrètement, ces exigences parent : l'évasion de conteneur vers l'hôte du runner et les jobs voisins, le socket Docker ou le mode privilégié donnant un accès root à l'hôte, l'abus de ressources (minage, déni de service), et l'exécution d'images ou services arbitraires non validés.
Sans isolation forte, une évasion de conteneur compromet l'hôte et les jobs voisins.
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 »processus runner sous utilisateur dédié non privilégié, jamais root.#
Un processus runner en root transforme la moindre faille d'un job en compromission de l'hôte et de ses voisins. L'exécuter sous un utilisateur dédié non privilégié limite ce qu'un job échappé peut atteindre : le moindre privilège au niveau système.
- Preuve attendue
- uid d'exécution du runner (non-root) ; absence d'exécution root.
- Outillage
- Kyverno Conftest
Correspondances & menaces parées 3 standards · 2 menaces
Un job exploite une mauvaise configuration ou une faille du runtime de conteneurs pour s'échapper vers l'hôte du runner et atteindre d'autres charges. Le cloisonnement supposé entre jobs est rompu CICD-SEC-7 CIS Benchmarks. Un conteneur de build accède aux périphériques ou capacités de l'hôte (montages, capabilities, hostPath) pour lire ou altérer des ressources hors de son périmètre. Les privilèges excessifs du conteneur ouvrent l'hôte CIS K8s.
pas de montage du socket Docker ni de mode privilégié ; pas de Docker-in-Docker pour les charges non fiables.#
Monter le socket Docker dans un job lui donne un contrôle équivalent à root sur l'hôte : conteneurs privilégiés, accès au disque, évasion immédiate. L'exigence interdit socket Docker, mode privilégié et Docker-in-Docker pour les charges non fiables.
- Preuve attendue
- Vérification : pas de socket Docker monté, pas de mode privilégié, pas de DinD pour charges non fiables.
- Outillage
- Kyverno Conftest
Correspondances & menaces parées 3 standards · 4 menaces
Le socket Docker monté dans un job donne un contrôle équivalent à root sur l'hôte : conteneurs privilégiés, accès au système de fichiers hôte. Une fonctionnalité de commodité devient une évasion CICD-SEC-7 LOTP. Un job exploite une mauvaise configuration ou une faille du runtime de conteneurs pour s'échapper vers l'hôte du runner et atteindre d'autres charges. Le cloisonnement supposé entre jobs est rompu CICD-SEC-7 CIS Benchmarks. Un conteneur de build accède aux périphériques ou capacités de l'hôte (montages, capabilities, hostPath) pour lire ou altérer des ressources hors de son périmètre. Les privilèges excessifs du conteneur ouvrent l'hôte CIS K8s. Un conteneur exploite une mauvaise configuration ou une faille pour s'échapper vers le nœud hôte du cluster et atteindre d'autres charges. Le cloisonnement du cluster est rompu (ATT&CK T1611) ATT&CK T1611.
chaque job dans un bac à sable (conteneur durci, microVM Firecracker/Kata, ou gVisor).#
Le cloisonnement entre jobs est souvent supposé, pas garanti : une évasion de conteneur atteint l'hôte et les jobs voisins. Chaque job doit tourner dans un bac à sable (conteneur durci, microVM Firecracker/Kata, ou gVisor) pour rester enfermé.
- Preuve attendue
- Configuration de sandbox par job (conteneur durci / microVM / gVisor).
- Outillage
- Kyverno Conftest
Correspondances & menaces parées 3 standards · 2 menaces
Un job exploite une mauvaise configuration ou une faille du runtime de conteneurs pour s'échapper vers l'hôte du runner et atteindre d'autres charges. Le cloisonnement supposé entre jobs est rompu CICD-SEC-7 CIS Benchmarks. Un conteneur exploite une mauvaise configuration ou une faille pour s'échapper vers le nœud hôte du cluster et atteindre d'autres charges. Le cloisonnement du cluster est rompu (ATT&CK T1611) ATT&CK T1611.
système de fichiers en lecture seule hors workspace pour les jobs.#
Un job qui peut écrire partout sur le runner peut y déposer une charge persistante ou altérer les étapes suivantes. Un système de fichiers en lecture seule hors workspace réduit cette surface : le job travaille dans son espace, sans toucher au reste.
- Preuve attendue
- Profils seccomp/AppArmor appliqués ; FS read-only hors workspace ; limites de ressources.
- Outillage
- Kyverno Conftest
Correspondances & menaces parées 3 standards · 2 menaces
Un job exploite une mauvaise configuration ou une faille du runtime de conteneurs pour s'échapper vers l'hôte du runner et atteindre d'autres charges. Le cloisonnement supposé entre jobs est rompu CICD-SEC-7 CIS Benchmarks. Un conteneur de build accède aux périphériques ou capacités de l'hôte (montages, capabilities, hostPath) pour lire ou altérer des ressources hors de son périmètre. Les privilèges excessifs du conteneur ouvrent l'hôte CIS K8s.
isolation microVM/hyperviseur entre jobs pour toute charge non fiable ou multi-tenant.#
Pour les charges non fiables ou multi-tenant, le namespace Linux se contourne. Une isolation microVM/hyperviseur entre jobs pose une vraie barrière de virtualisation, bien plus difficile à franchir : le niveau visé par SLSA Build L3.
- Preuve attendue
- Preuve d'isolation de niveau microVM/hyperviseur entre jobs.
- Outillage
- Kata Containers gVisor
Correspondances & menaces parées 3 standards · 2 menaces
Un job exploite une mauvaise configuration ou une faille du runtime de conteneurs pour s'échapper vers l'hôte du runner et atteindre d'autres charges. Le cloisonnement supposé entre jobs est rompu CICD-SEC-7 CIS Benchmarks. Un attaquant ayant obtenu l'exécution sur un hôte implante une persistance furtive au niveau du noyau ou du système : programme eBPF malveillant, extension système (systemd-sysext), module noyau ou hook de chargement. Le code survit aux redéploiements applicatifs, masque ses processus et connexions, et intercepte secrets et trafic. Les contrôles applicatifs et l'analyse d'image ne le voient pas : il vit sous la charge de travail, dans le plan hôte MITRE ATT&CK T1014 MITRE ATT&CK T1547.006 CNCF Runtime.
liste blanche des images et services autorisés pour les jobs ; pas d'exécution d'images ou de services arbitraires.#
Lancer des images ou services arbitraires est un vecteur d'exécution discret : une image de service piégée s'exécute sans revue. Une liste blanche des images et services autorisés supprime cette latitude : on n'exécute que du connu et validé.
- Preuve attendue
- Allowlist des images/services (allowed_images, allowed_services) configurée.
- Outillage
- Kyverno Conftest
Correspondances & menaces parées 3 standards · 2 menaces
Un job exploite une mauvaise configuration ou une faille du runtime de conteneurs pour s'échapper vers l'hôte du runner et atteindre d'autres charges. Le cloisonnement supposé entre jobs est rompu CICD-SEC-7 CIS Benchmarks. L'image de base utilisée pour construire les conteneurs contient une charge malveillante ou une vulnérabilité, héritée par tous les artefacts qui en dérivent. Le socle d'exécution contamine toute la production CNCF SLSA.
profils de confinement seccomp/AppArmor appliqués aux jobs.#
Par défaut, un conteneur dispose de bien plus d'appels système qu'un build n'en a besoin, autant de chemins d'escalade. Des profils seccomp/AppArmor réduisent cette surface au nécessaire : même évadé de l'application, le job reste confiné par le noyau.
- Preuve attendue
- Profils seccomp/AppArmor actifs sur les runners.
- Outillage
- Kyverno Conftest
Correspondances & menaces parées 3 standards · 2 menaces
Un job exploite une mauvaise configuration ou une faille du runtime de conteneurs pour s'échapper vers l'hôte du runner et atteindre d'autres charges. Le cloisonnement supposé entre jobs est rompu CICD-SEC-7 CIS Benchmarks. Un conteneur de build accède aux périphériques ou capacités de l'hôte (montages, capabilities, hostPath) pour lire ou altérer des ressources hors de son périmètre. Les privilèges excessifs du conteneur ouvrent l'hôte CIS K8s.
limites de ressources (CPU, mémoire) imposées aux jobs.#
Un job compromis peut abuser des ressources (minage, déni de service) et asphyxier ses voisins sur le même hôte. Des limites CPU/mémoire par job bornent cet abus et garantissent qu'une charge folle ne paralyse pas la plateforme.
- Preuve attendue
- Quotas/limits configurés sur les jobs/runners.
- Outillage
- Kyverno Conftest
Correspondances & menaces parées 3 standards · 1 menace
Un job exploite une mauvaise configuration ou une faille du runtime de conteneurs pour s'échapper vers l'hôte du runner et atteindre d'autres charges. Le cloisonnement supposé entre jobs est rompu CICD-SEC-7 CIS Benchmarks.