Les attaques de supply chain ciblent le pipeline CI/CD et ses dépendances
Un vecteur courant est l'usage de tags mutables comme @v1 ou latest dans les workflows, qui peuvent être redirigé vers un commit malveillant, entraînant ainsi l'exécution de code compromis
Éviter @v6.0.1 ou latest et les tags majeurs
Épingler les versions par SHA (référence immuable: SHA commit)GitHub Actions encourage l'utilisation d'actions de son marketplace, qui sont des composants réutilisables permettant d'automatiser des tâches spécifiques
Pour chaque action, on se rends sur le lien Github de l'action: actions/checkout, ici l'action est de récupérer le repository.
On parcours le readme, on regarde les màj et la version qui nous corresponds. Pour l'instant, la dernière version est la v6.0.2

steps:
- name: Checkout code
uses: actions/checkout@v6.0.2
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
Utiliser des SHA rend la mise à jour manuelle pénible. La solution standard est d'utiliser le Dependabot de GitHub
doc officielle : dependabot-quickstart-guide | demo example : dependabot-demo
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
- package-ecosystem: "maven"
directory: "/"
schedule:
interval: "weekly"
- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "weekly"
Centralisation: Dependabot n'utilise qu'un seule fichier
Il scanne tous les fichiers yaml, situés dans le dossier .github/workflows/
Automatisation des SHA: Dependabot détecte si une nouvelle version existe,
Il crée ensuite une PR (de plusieurs fichiers parfois) en mettant à jour le(s) SHA,
Il ajoute un commentaire avec le(s) numéro(s) de version
Stabilité: On recoit les mises à jour sur une branche séparée.
On peut ainsi tester les mises à jourt AVANT de les merger dans les différentes branches
Utiliser un SHA pour l'image de base, c'est comme pour les Actions;
On utilise un SHA pour le FROM afin d'être 100% reproductible
Dans ce cas, il va surveiller la ligne FROM gcr.io/distroless/java17-debian12 et proposer une "Pull Request" dès qu'une nouvelle image de base, plus sécurisée, sera publiée par Google
Une fois que l'on à le SHA, modifiez le Dockerfile ainsi:
FROM gcr.io/distroless/java17-debian12@sha256:le_sha_ici
Avant d'accepter les changements, il est impératif de les tester!
Avec DockerRécupérer la dernière version de l'image:
docker pull gcr.io/distroless/java17-debian12
Afficher le SHA exact (le Digest)
docker inspect --format='{{index .RepoDigests 0}}' gcr.io/distroless/java17-debian12
Pour Java, c'est encore plus puissant:
Dependabot analyse le fichier pom.xml. Si on mets à jour une dépendance, il vérifie les versions disponibles sur Maven Central. Il regroupe les mises à jour si on utilise l'option groups, ce qui évite d'avoir 50 PRs ouvertes
Le regroupement réduit le "bruit" des Pull Requests en fusionnant plusieurs mises à jour liées, en une seule PR
Efficace pour les frameworks comme Spring où les dépendances doivent souvent être mises à jour simultanément pour éviter les conflits de versionversion: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
groups:
production-dependencies:
patterns: ["*"]
dependency-type: "production"
minor-and-patch:
update-types: ["patch", "minor"]
settings → secrets/dependabot
C'est la condition pour qu'il puisse tourner la CI dans les PRDependabot secrets
Secrets are credentials that are encrypted. Anyone with collaborator access to this repository can use these secrets for Dependabot.
Secrets are not passed to forks.
Repository secrets
Name Last updated
POSTGRES_PASSWORD 2 days ago
Vulnerability Alert
Dependabot 1
Dependabot alerts
Dependency files checked 6 hours ago
is:open
Apache Tomcat Vulnerable to Improper Resource Shutdown or Release Low
#1 opened 2 days ago • Detected in org.apache.tomcat.embed:tomcat-embed-core (Maven) • pom.xml #132
Pour ma stratégie Git, les alertes de mise à jour sont envoyés sur la branche [develop], idéale pour suivre le cycle normal des PR/merges
version: 2
updates:
- package-ecosystem: "github-actions"
target-branch: develop
directory: "/"
schedule:
interval: "weekly"
groups:
github-actions:
patterns:
- "*"

Contexte:
Le build est rouge et on a fermé le PR, on reçoit alors un message avec des instructions: →
groups:
major-and-patch:
update-types: ["patch", "major"]
Bump org.apache.tomcat.embed:tomcat-embed-core from 10.1.45 to 10.1.47 (PR #132)
dependabot[bot] left a comment :
OK, I won't notify you again about this release,
but will get in touch when a new version is available.
If you'd rather skip all updates until the next major or minor version,
let me know by commenting @dependabot ignore this major version or @dependabot ignore this minor version.
If you change your mind, just re-open this PR and I'll resolve any conflicts on it.
PR green → merge (develop)