« Spoiler : c’est pas gagné. »
– Un DevOps un jour, tous les RSSI depuis.
🧪 CI/CD : pour livrer plus vite… ou exposer plus vite ?
La CI/CD, c’est un peu comme une Formule 1 : ça va très vite, ça impressionne tout le monde, mais si le pilote oublie de freiner, c’est le mur assuré.
Et spoiler : en cybersécurité, le mur, c’est souvent l’exploitation d’un pipeline mal verrouillé.
Alors que les DSI investissent dans des firewalls next-gen et que les SOC traquent le moindre nmap
, le vrai gruyère est parfois juste là, dans un .yml
glissé dans un repo GitHub.
Bienvenue dans l’univers merveilleux des pipelines CI/CD, où :
- les tokens secrets se baladent en clair,
- les runners ont les droits d’un ministre,
- et le stagiaire peut publier en prod… par inadvertance.
📦 Petit rappel pour les nouveaux venus : CI/CD, késako ?
CI (Intégration Continue) : automatiser les tests et la construction du code dès qu’un changement est poussé.
CD (Déploiement Continu) : automatiser la mise en production de ce code validé.
🔧 Outils populaires : GitHub Actions, GitLab CI, Jenkins, CircleCI, TravisCI, etc.
🔓 Où ça pète ? (et souvent violemment)
1. Secrets dans les variables d’environnement
AWS_SECRET_ACCESS_KEY: "oh_non_pas_ca_123"
Un classique : les secrets codés en dur dans les pipelines ou dans les variables d’environnement accessibles par n’importe quel job.
➡️ Résultat : exfiltration facile, surtout via une PR malveillante.
2. Droits trop larges sur les runners
Les runners partagés qui peuvent tout faire (et le font) sont une aubaine pour un attaquant.
➡️ Jenkins exposé sur Internet ? C’est Noël avant l’heure.
3. Mauvaise gestion des dépendances
Utiliser npm install
sans vérification, c’est comme laisser ta porte d’entrée ouverte avec un panneau « pas de mot de passe ici ».
➡️ Attaques par supply chain garanties.
Voir notre article : Gestion des identités non humaines
4. Repos publics avec des workflows secrets
“Mais c’est sur GitHub, donc c’est safe, non ?”
Ah, non. L’accès en lecture suffit pour reverse-engineerer les workflows et préparer une attaque ciblée.
Voir notre article : Banana Squad & Co
🧠 Le savais-tu ? (Encadré pédagogique)
Runner : machine (ou conteneur) qui exécute le pipeline (build, test, déploiement).
Secret : variable sensible (token, mot de passe, clé SSH).
Token GitHub Actions : jeton auto-généré par GitHub pour chaque job ; à manipuler comme du nitroglycérine.
☣️ Exemples d’incidents réels (pour bien dormir la nuit)
- TravisCI (2022) : fuite massive de tokens d’accès dans les logs publics.
👉 Rapport de HackerOne :
https://blog.aquasec.com/travis-ci-security-incident - CircleCI (2023) : compromission de session développeur → exfiltration de secrets → rotation forcée.
👉 Incident post-mortem officiel :
https://circleci.com/blog/january-4-2023-security-alert/ - SolarWinds (2020) : modification d’un composant dans le pipeline → backdoor massivement diffusée.
👉 Analyse technique Microsoft :
https://www.microsoft.com/security/blog/2020/12/13/analyzing-solorigate-malware-attack/ - GitHub Actions : des chercheurs ont démontré comment injecter du code malicieux via des
pull_request_target
mal configurés.
👉 Recherche de securitylab.github.com :
https://securitylab.github.com/research/github-actions-untrusted-input/
🧱 Comment sécuriser (sans tout casser)
✅ Utilise un Secrets Manager (Vault, AWS Secrets, Doppler…)
Et pas des
secrets .GITHUB_TOKEN
qui traînent dans tous les jobs.
✅ Active le principe de least privilege
Ton pipeline n’a pas besoin d’accéder à toute ton infra pour faire un npm build
.
✅ Isole tes environnements
Un workflow de test ne devrait jamais pouvoir déployer en prod.
✅ Audite régulièrement ton pipeline
Linte ton YAML, scanne les dépendances (trivy
, npm audit
, snyk
).
✅ Vérifie ce que tu merges
Un pull_request_target
mal sécurisé peut être exploité pour injecter du code malicieux.
🧰 Outils de sécurité et bonnes pratiques CI/CD
OWASP CI/CD Security Guidelines
👉 Guide complet (en anglais, très clair) :
https://owasp.org/www-project-cicd-security-guideline/
Hardening GitHub Actions (GitHub Docs)
👉 Conseils officiels GitHub pour sécuriser ses workflows :
https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions
Snyk – Analyse des dépendances (gratuite)
👉 Audit des vulnérabilités dans le code et les libs :
https://snyk.io
Trivy (scanner open source de vulnérabilités)
👉 GitHub officiel du projet AquaSec :
https://github.com/aquasecurity/trivy
Secrets detection avec Gitleaks
👉 Super outil pour détecter les secrets dans les repos :
https://github.com/gitleaks/gitleaks
📦 Vault & gestion des secrets
HashiCorp Vault (gestion de secrets)
👉 Page officielle du projet :
https://www.vaultproject.io/
AWS Secrets Manager
👉 Documentation officielle :
https://docs.aws.amazon.com/secretsmanager/
🔐 Exemple : pipeline GitHub Actions (presque) blindé
yaml name: Build and Deploy on: push: branches: [ "main" ] jobs: build: runs-on: ubuntu-latest permissions: contents: read id-token: write # Pour OIDC (auth sans secret) steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' - name: Install dependencies run: npm ci - name: Run tests run: npm test deploy: needs: build runs-on: ubuntu-latest environment: name: production url: https://monapp.exemple.com permissions: contents: read deployments: write steps: - name: Deploy via OIDC uses: some-deploy-action with: oidc_token: ${{ steps.auth.outputs.id_token }}
✅ Ce qu’on aime ici :
- Permissions minimales par job
- Secrets non exposés directement (utilisation d’OIDC)
- Déploiement conditionné à la réussite des tests
🎯 Jenkins : même combat
Jenkins est une merveille d’automatisation… et une plaie si mal sécurisée.
- Désactive les builds anonymes
- Ne stocke pas de secrets dans
credentials.xml
- Évite les plugins non maintenus
- Isole les agents dans des environnements dédiés
- Évite de faire tourner Jenkins en tant que root (non, vraiment)
🖼️ pipeline sécurisé vs pipeline kamikaze

🎤 En conclusion
La CI/CD, c’est super.
Mais ce n’est pas parce que c’est automatisé que c’est sécurisé.
Un pipeline mal foutu, c’est comme un autoroute ouverte sans péage : tout le monde passe, et le premier bot venu t’embarque dans le mur.
👉 Si tu veux continuer à déployer tranquillement, commence par sécuriser tes pipelines.
Sinon… tu seras dans le prochain article “Fail du mois” de SecuSlice.