Introduction
Les attaques sur la chaîne d'approvisionnement logicielle (software supply chain) sont devenues l'une des menaces cybersécurité les plus critiques de la décennie. Les incidents SolarWinds (2020), Codecov (2021) et Log4Shell (2021) ont démontré de manière spectaculaire comment la compromission d'un seul composant peut affecter des dizaines de milliers d'organisations à travers le monde.
En 2025, selon le dernier rapport de Gartner, 45% des organisations ont subi au moins une tentative d'attaque ciblant leur chaîne d'approvisionnement logicielle. Cette statistique alarmante reflète une réalité incontournable : nos applications modernes sont construites avec 70 à 90% de code open-source tiers, créant une surface d'attaque considérable et souvent méconnue.
La supply chain security dans le contexte DevSecOps englobe l'ensemble des pratiques, outils et processus visant à sécuriser chaque maillon de la chaîne logicielle : du code source aux dépendances tierces, en passant par les pipelines de build, les registres d'artefacts et les déploiements en production. Cette approche holistique est devenue indispensable pour les organisations soucieuses de leur posture de sécurité.
Les frameworks de référence comme SLSA (Supply-chain Levels for Software Artifacts) et l'initiative SBOM (Software Bill of Materials) de la CISA (Cybersecurity and Infrastructure Security Agency) américaine structurent désormais les bonnes pratiques du secteur, offrant aux équipes DevSecOps des guides concrets pour sécuriser leurs chaînes logicielles.
Comprendre les vulnérabilités de la supply chain logicielle
Anatomie d'une attaque supply chain
Une attaque supply chain logicielle exploite la confiance que nous accordons aux composants tiers intégrés dans nos applications. Les vecteurs d'attaque sont multiples et sophistiqués :
Typosquatting : Les attaquants publient des packages malveillants avec des noms très similaires à des bibliothèques populaires (par exemple, "requets" au lieu de "requests" en Python). Les développeurs qui font une faute de frappe installent sans le savoir du code malicieux.
Dependency confusion : Exploitation de la priorité de résolution des packages entre registres publics et privés. Un attaquant publie sur npm public une version malveillante d'un package interne d'entreprise avec un numéro de version supérieur, forçant le gestionnaire de packages à l'installer.
Compromission de mainteneurs : Les attaquants ciblent les comptes de mainteneurs de packages populaires via phishing ou ingénierie sociale pour injecter du code malveillant dans des mises à jour légitimes. Le cas récent de ua-parser-js (5 millions de téléchargements hebdomadaires) illustre ce risque.
Build-time injection : Compromission des pipelines CI/CD pour injecter du code malveillant pendant la phase de compilation. L'attaque SolarWinds utilisait précisément ce vecteur en compromettant le processus de build d'Orion.
graph TD
A[Code Source Développeur] --> B[Dépendances Open Source]
A --> C[Pipeline CI/CD]
B --> D[Registres NPM/PyPI/Maven]
C --> E[Build & Tests]
E --> F[Container Registry]
F --> G[Production]
H[Attaquant] -.->|Typosquatting| D
H -.->|Compromission compte| D
H -.->|Injection pipeline| C
H -.->|Backdoor image| F
Les angles morts de la gestion des dépendances
La complexité exponentielle des dépendances transitives crée des angles morts dangereux. Une application moyenne en Node.js inclut plus de 1000 packages en comptant toutes les dépendances indirectes. Cette profondeur rend pratiquement impossible une vérification manuelle exhaustive.
Dépendances obsolètes : Selon le State of Open Source Security 2025 de Snyk, 78% des applications en production utilisent au moins une dépendance avec une vulnérabilité connue, et 23% de ces vulnérabilités sont critiques (CVSS > 9.0). Le problème s'aggrave avec le temps si aucun processus de mise à jour systématique n'est en place.
Licences incompatibles : Au-delà de la sécurité, les dépendances peuvent introduire des risques juridiques. L'utilisation non intentionnelle de licences copyleft (GPL, AGPL) dans des produits propriétaires peut avoir des conséquences légales majeures.
SBOM : La transparence comme fondation de la sécurité
Qu'est-ce qu'un Software Bill of Materials ?
Le SBOM (Software Bill of Materials) est l'équivalent numérique de la liste d'ingrédients d'un produit alimentaire. Il s'agit d'un inventaire exhaustif et structuré de tous les composants logiciels inclus dans une application : bibliothèques, frameworks, outils, et leurs versions précises.
L'executive order 14028 du président Biden (mai 2021) a imposé l'utilisation de SBOM pour tous les logiciels vendus au gouvernement fédéral américain, catalysant l'adoption massive de cette pratique. En 2025, la génération et la maintenance de SBOM sont devenues des standards de l'industrie.
Formats standards de SBOM
Trois formats principaux se partagent le marché des SBOM :
SPDX (Software Package Data Exchange) : Standard ISO/IEC 5962:2021, développé par la Linux Foundation. SPDX excelle dans la documentation des licences et est particulièrement adapté aux écosystèmes open-source complexes.
CycloneDX : Format léger et moderne développé par OWASP, particulièrement optimisé pour les cas d'usage de sécurité. CycloneDX inclut nativement des champs pour les vulnérabilités connues (CVE) et les scores de risque.
SWID (Software Identification Tags) : Standard ISO/IEC 19770-2, orienté vers la gestion d'assets logiciels en entreprise.
{
"bomFormat": "CycloneDX",
"specVersion": "1.5",
"version": 1,
"metadata": {
"timestamp": "2025-11-15T10:00:00Z",
"component": {
"type": "application",
"name": "my-secure-app",
"version": "2.3.1"
}
},
"components": [
{
"type": "library",
"name": "express",
"version": "4.18.2",
"purl": "pkg:npm/express@4.18.2",
"licenses": [
{
"license": {
"id": "MIT"
}
}
],
"vulnerabilities": [
{
"id": "CVE-2024-29041",
"source": {
"name": "NVD",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2024-29041"
},
"ratings": [
{
"score": 6.1,
"severity": "medium",
"method": "CVSSv3",
"vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N"
}
]
}
],
"hashes": [
{
"alg": "SHA-256",
"content": "a7c9c5b2e3d4f6a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2"
}
]
},
{
"type": "library",
"name": "lodash",
"version": "4.17.21",
"purl": "pkg:npm/lodash@4.17.21",
"licenses": [
{
"license": {
"id": "MIT"
}
}
]
}
],
"dependencies": [
{
"ref": "pkg:npm/express@4.18.2",
"dependsOn": [
"pkg:npm/accepts@1.3.8",
"pkg:npm/body-parser@1.20.1"
]
}
]
}
Génération automatique de SBOM dans les pipelines
L'intégration de la génération de SBOM dans les pipelines CI/CD assure que chaque build produit un inventaire à jour des composants :
# Exemple GitHub Actions - Génération SBOM avec Syft
name: Build and Generate SBOM
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
build-and-sbom:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Build application
run: npm run build
- name: Build Docker image
run: docker build -t myapp:${{ github.sha }} .
# Génération du SBOM avec Syft (Anchore)
- name: Generate SBOM
uses: anchore/sbom-action@v0
with:
image: myapp:${{ github.sha }}
format: cyclonedx-json
output-file: sbom.json
# Signature du SBOM avec Cosign (Sigstore)
- name: Sign SBOM
uses: sigstore/cosign-installer@v3
- run: |
cosign sign-blob --bundle sbom.bundle sbom.json
# Upload du SBOM comme artefact
- name: Upload SBOM
uses: actions/upload-artifact@v4
with:
name: sbom-cyclonedx
path: |
sbom.json
sbom.bundle
# Scan de vulnérabilités basé sur le SBOM
- name: Vulnerability scan from SBOM
run: |
grype sbom:sbom.json --fail-on critical
Signature de code et vérification de provenance
Le framework Sigstore : signature sans friction
Sigstore révolutionne la signature de code en éliminant la complexité traditionnelle de la PKI (Public Key Infrastructure). Trois composants principaux constituent l'écosystème Sigstore :
Cosign : Outil CLI pour signer et vérifier des conteneurs, binaires et fichiers. Cosign supporte à la fois les clés traditionnelles et l'authentification keyless via des identités OIDC (GitHub, Google, Microsoft).
Rekor : Ledger de transparence immuable (comme Certificate Transparency) qui enregistre toutes les signatures. Rekor permet de vérifier a posteriori qu'une signature existait à un moment donné, même si la clé privée a été compromise.
Fulcio : Autorité de certification éphémère qui émet des certificats de signature à durée de vie limitée (10 minutes) basés sur l'identité OIDC du signataire.
# Signature d'une image Docker avec Cosign (méthode keyless)
# L'authentification se fait via GitHub OAuth
cosign sign --yes \
--oidc-issuer=https://token.actions.githubusercontent.com \
ghcr.io/monorg/monapp:v1.2.3
# Vérification de la signature
cosign verify \
--certificate-identity=https://github.com/monorg/monapp/.github/workflows/build.yml@refs/heads/main \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com \
ghcr.io/monorg/monapp:v1.2.3
# Génération et signature d'attestation SLSA
cosign attest --yes \
--predicate=attestation.json \
--type=slsaprovenance \
ghcr.io/monorg/monapp:v1.2.3
# Vérification de l'attestation
cosign verify-attestation \
--type=slsaprovenance \
--certificate-identity=https://github.com/monorg/monapp/.github/workflows/build.yml@refs/heads/main \
--certificate-oidc-issuer=https://token.actions.githubusercontent.com \
ghcr.io/monorg/monapp:v1.2.3
SLSA Framework : niveaux de maturité de la supply chain
Le framework SLSA (Supply-chain Levels for Software Artifacts) définit 4 niveaux progressifs de sécurisation de la chaîne logicielle :
SLSA Level 1 - Documentation du build process : Le processus de build est documenté et reproductible. Cela nécessite un système de versioning (Git) et des scripts de build automatisés.
SLSA Level 2 - Authentification et provenance : Le build s'exécute sur un service authentifié qui génère une attestation de provenance signée. GitHub Actions, GitLab CI avec leurs générateurs de provenance répondent à ce niveau.
SLSA Level 3 - Isolation et audit du build : Le build s'exécute dans un environnement isolé et éphémère, avec audit complet de toutes les dépendances sources. Les builds hermétiques (hermetic builds) garantissent la reproductibilité.
SLSA Level 4 - Build reproductible et two-person review : Deux contributeurs indépendants doivent approuver tout changement, et le build doit être reproductible bit-à-bit sur des infrastructures différentes.
# Configuration GitHub Actions pour SLSA Level 3
name: SLSA Level 3 Build
on:
push:
branches: [main]
tags: ['v*']
permissions:
contents: read
id-token: write # Requis pour OIDC
packages: write
jobs:
build:
runs-on: ubuntu-latest
outputs:
image-digest: ${{ steps.build.outputs.digest }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # Historique complet pour traçabilité
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
id: build
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ghcr.io/${{ github.repository }}:${{ github.sha }}
platforms: linux/amd64,linux/arm64
sbom: true # Génération SBOM automatique
provenance: true # Attestation de provenance
# Génération d'attestation SLSA provenance
provenance:
needs: [build]
permissions:
actions: read
id-token: write
packages: write
uses: slsa-framework/slsa-github-generator/.github/workflows/generator_container_slsa3.yml@v1.9.0
with:
image: ghcr.io/${{ github.repository }}
digest: ${{ needs.build.outputs.image-digest }}
registry-username: ${{ github.actor }}
secrets:
registry-password: ${{ secrets.GITHUB_TOKEN }}
Outils DevSecOps pour la supply chain security
Snyk : sécurité des dépendances intelligente
Snyk s'est imposé comme la référence pour la détection et la remediation des vulnérabilités dans les dépendances open-source. En 2025, Snyk couvre 8 écosystèmes principaux (npm, PyPI, Maven, NuGet, RubyGems, Go, PHP Composer, Cargo) et intègre des capacités d'IA pour prioriser les vulnérabilités réellement exploitables.
Forces de Snyk :
- Base de données propriétaire : Au-delà des CVE publiques, Snyk maintient sa propre base de vulnérabilités découvertes par ses chercheurs en sécurité
- Analyse de code (SAST) : Détection de patterns de code vulnérables directement dans le code source
- Container scanning : Analyse des images Docker pour vulnérabilités OS et applicatives
- Infrastructure as Code (IaC) : Scan des fichiers Terraform, CloudFormation, Kubernetes YAML pour mauvaises configurations sécurité
// Exemple d'intégration Snyk dans pipeline Node.js
const snyk = require('snyk');
async function runSecurityAudit() {
try {
// Test des dépendances avec politiques personnalisées
const testResult = await snyk.test('.', {
'severity-threshold': 'high', // Fail uniquement sur HIGH et CRITICAL
'fail-on': 'upgradable', // Fail seulement si un fix existe
'prune-repeated-subdependencies': true,
'dev': false // Ignorer les devDependencies
});
if (testResult.ok) {
console.log('✓ Aucune vulnérabilité critique détectée');
return true;
} else {
console.error('✗ Vulnérabilités détectées:');
testResult.vulnerabilities.forEach(vuln => {
console.error(` - ${vuln.title}`);
console.error(` Package: ${vuln.packageName}@${vuln.version}`);
console.error(` Severity: ${vuln.severity}`);
console.error(` Fix: ${vuln.fixedIn ? `Upgrade to ${vuln.fixedIn}` : 'Aucun fix disponible'}`);
});
// Génération de rapport HTML détaillé
await snyk.test('.', {
'json': true,
'json-file-output': 'snyk-report.json'
});
return false;
}
} catch (error) {
console.error('Erreur lors du scan Snyk:', error);
process.exit(1);
}
}
// Monitor continu - envoie des alertes si nouvelle vulnérabilité découverte
async function enableContinuousMonitoring() {
await snyk.monitor('.', {
'project-name': 'my-application',
'target-reference': process.env.GIT_BRANCH
});
console.log('✓ Monitoring continu activé sur Snyk dashboard');
}
runSecurityAudit()
.then(success => {
if (success) {
return enableContinuousMonitoring();
} else {
process.exit(1);
}
});
Dependabot : automatisation des mises à jour de sécurité
Dependabot, racheté par GitHub en 2019, automatise la création de pull requests pour mettre à jour les dépendances vulnérables. Son intégration native avec GitHub en fait un outil incontournable pour les projets hébergés sur cette plateforme.
# .github/dependabot.yml - Configuration avancée
version: 2
updates:
# Dépendances npm avec stratégie agressive sur les patches de sécurité
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "daily"
time: "03:00"
timezone: "Europe/Paris"
open-pull-requests-limit: 10
# Grouper les updates mineures ensemble
groups:
minor-updates:
patterns:
- "*"
update-types:
- "minor"
- "patch"
# Reviewers automatiques
reviewers:
- "security-team"
assignees:
- "tech-lead"
# Labels pour triage automatique
labels:
- "dependencies"
- "security"
# Auto-merge pour patches de sécurité
# (nécessite configuration GitHub branch protection)
# Dépendances GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
labels:
- "ci-cd"
- "dependencies"
# Dépendances Docker
- package-ecosystem: "docker"
directory: "/docker"
schedule:
interval: "weekly"
labels:
- "docker"
- "infrastructure"
# Dépendances Terraform
- package-ecosystem: "terraform"
directory: "/infrastructure"
schedule:
interval: "weekly"
Trivy : scanner de vulnérabilités universel
Trivy, développé par Aqua Security, est devenu l'outil de référence pour le scan de vulnérabilités dans les environnements cloud-native. Sa rapidité d'exécution (scan complet en moins de 30 secondes) et sa précision en font un choix idéal pour les pipelines CI/CD.
Capacités de Trivy :
- Scan d'images de conteneurs (Docker, containerd, Podman)
- Scan de filesystems et rootfs
- Scan de dépôts Git
- Scan de fichiers IaC (Terraform, CloudFormation, Kubernetes, Helm)
- Détection de secrets hardcodés
- Scan de SBOM (CycloneDX, SPDX)
# Scan complet d'une image Docker avec Trivy
trivy image --severity HIGH,CRITICAL \
--exit-code 1 \
--no-progress \
--format json \
--output trivy-report.json \
myapp:latest
# Scan IaC avec politiques personnalisées
trivy config --severity MEDIUM,HIGH,CRITICAL \
--policy ./policies \
--namespaces user \
./infrastructure/
# Scan filesystem (pour monorepos)
trivy fs --scanners vuln,config,secret \
--severity HIGH,CRITICAL \
--ignore-unfixed \
./
# Génération de SBOM depuis une image
trivy image --format cyclonedx \
--output sbom.cdx.json \
myapp:latest
# Scan d'un SBOM existant
trivy sbom sbom.cdx.json \
--severity HIGH,CRITICAL
# Wrapper Python pour intégration Trivy dans pipelines
import subprocess
import json
import sys
from typing import Dict, List
class TrivyScanner:
def __init__(self, image: str, severity_threshold: List[str] = None):
self.image = image
self.severity_threshold = severity_threshold or ['HIGH', 'CRITICAL']
def scan_image(self) -> Dict:
"""
Exécute un scan Trivy et retourne les résultats parsés
"""
cmd = [
'trivy', 'image',
'--format', 'json',
'--severity', ','.join(self.severity_threshold),
'--no-progress',
self.image
]
result = subprocess.run(
cmd,
capture_output=True,
text=True,
check=False
)
if result.returncode not in [0, 1]: # 1 = vulnerabilities found
raise Exception(f"Trivy scan failed: {result.stderr}")
return json.loads(result.stdout)
def get_critical_vulnerabilities(self, scan_results: Dict) -> List[Dict]:
"""
Extrait les vulnérabilités critiques des résultats
"""
critical_vulns = []
for result in scan_results.get('Results', []):
for vuln in result.get('Vulnerabilities', []):
if vuln.get('Severity') == 'CRITICAL':
critical_vulns.append({
'cve': vuln.get('VulnerabilityID'),
'package': vuln.get('PkgName'),
'version': vuln.get('InstalledVersion'),
'fixed_version': vuln.get('FixedVersion'),
'title': vuln.get('Title'),
'description': vuln.get('Description')
})
return critical_vulns
def enforce_policy(self, max_critical: int = 0, max_high: int = 5) -> bool:
"""
Applique une politique de sécurité: fail si trop de vulns
"""
scan_results = self.scan_image()
critical_count = sum(
1 for result in scan_results.get('Results', [])
for vuln in result.get('Vulnerabilities', [])
if vuln.get('Severity') == 'CRITICAL'
)
high_count = sum(
1 for result in scan_results.get('Results', [])
for vuln in result.get('Vulnerabilities', [])
if vuln.get('Severity') == 'HIGH'
)
print(f"Scan completed: {critical_count} CRITICAL, {high_count} HIGH")
if critical_count > max_critical:
print(f"❌ POLICY VIOLATION: {critical_count} critical vulnerabilities (max: {max_critical})")
self._print_vulnerabilities(scan_results, 'CRITICAL')
return False
if high_count > max_high:
print(f"⚠️ WARNING: {high_count} high vulnerabilities (max: {max_high})")
self._print_vulnerabilities(scan_results, 'HIGH')
return False
print("✓ Security policy satisfied")
return True
def _print_vulnerabilities(self, scan_results: Dict, severity: str):
"""
Affiche les vulnérabilités d'une sévérité donnée
"""
for result in scan_results.get('Results', []):
target = result.get('Target')
print(f"\nTarget: {target}")
for vuln in result.get('Vulnerabilities', []):
if vuln.get('Severity') == severity:
print(f" - {vuln.get('VulnerabilityID')}: {vuln.get('Title')}")
print(f" Package: {vuln.get('PkgName')} {vuln.get('InstalledVersion')}")
if vuln.get('FixedVersion'):
print(f" Fix: Upgrade to {vuln.get('FixedVersion')}")
print()
# Utilisation dans un pipeline
if __name__ == '__main__':
image = sys.argv[1] if len(sys.argv) > 1 else 'myapp:latest'
scanner = TrivyScanner(image)
# Échec du build si policy non respectée
if not scanner.enforce_policy(max_critical=0, max_high=5):
sys.exit(1)
Bonnes pratiques DevSecOps pour la supply chain
1. Principe de defense in depth
La sécurité de la supply chain ne repose pas sur un seul outil mais sur une stratégie multi-couches :
- Vetting des dépendances avant adoption (réputation, maintenance active, adoption communauté)
- Scanning régulier des vulnérabilités avec plusieurs outils complémentaires (Snyk + Trivy)
- Monitoring continu même après déploiement en production
- Policies as code avec admission controllers (OPA, Kyverno) pour bloquer les images non conformes
- Runtime protection avec eBPF (Falco, Tetragon) pour détecter les comportements anormaux
2. Mise à jour proactive et automatisée
# Stratégie de patching automatisé avec tests de régression
name: Automated Dependency Updates
on:
schedule:
- cron: '0 3 * * 1' # Tous les lundis à 3h
workflow_dispatch:
jobs:
update-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# Mise à jour des dépendances non-breaking
- name: Update patch versions
run: |
npm update --save
npm audit fix --force
# Tests complets pour vérifier non-régression
- name: Run test suite
run: |
npm run test:unit
npm run test:integration
npm run test:e2e
# Security audit
- name: Security scan
run: |
npm audit --audit-level=high
npx snyk test --severity-threshold=high
# Si tous les tests passent, créer une PR
- name: Create Pull Request
if: success()
uses: peter-evans/create-pull-request@v5
with:
commit-message: "chore: automated dependency updates"
title: "🔒 Automated Security Updates"
body: |
Automated dependency updates with full test suite validation.
**Changes:**
- Updated patch versions of all dependencies
- Applied automated security fixes
- All tests passing ✓
**Security:**
- No high/critical vulnerabilities remaining
- SBOM generated and signed
branch: automated-updates
labels: dependencies, security, automated
3. Immutabilité des artefacts
Les artefacts (images Docker, binaires, packages) doivent être immuables après signature. Toute modification invalide la signature et déclenche une alerte.
# Policy OPA pour Kubernetes: bloquer les images non signées
package kubernetes.admission
import future.keywords.if
import future.keywords.in
deny[msg] {
input.request.kind.kind == "Pod"
image := input.request.object.spec.containers[_].image
# Vérifier que l'image est signée avec Cosign
not image_is_signed(image)
msg := sprintf("Image %v must be signed with Cosign", [image])
}
image_is_signed(image) if {
# Appel à Cosign pour vérification (simplifié)
# En production, utiliser cosign verify via admission webhook
startswith(image, "ghcr.io/trusted-org/")
}
Conclusion et perspectives
La sécurité de la supply chain logicielle n'est plus une option mais une exigence fondamentale en 2025. Les organisations qui négligent cet aspect s'exposent à des risques considérables, comme le démontrent les incidents majeurs récents qui ont affecté des milliers d'entreprises via un seul composant compromis.
L'adoption des pratiques DevSecOps pour la supply chain - SBOM, signature de code, scanning automatisé, policies as code - offre une protection robuste et mesurable. Les outils modernes comme Snyk, Trivy, Dependabot et Sigstore ont considérablement simplifié la mise en œuvre de ces pratiques, les rendant accessibles même aux équipes de taille modeste.
L'avenir de la supply chain security s'oriente vers une automatisation accrue et une intelligence artificielle appliquée à la détection proactive des menaces. Les prochaines générations d'outils utiliseront le machine learning pour prédire les vulnérabilités avant même leur publication publique, analyse comportementale pour détecter les packages malicieux, et blockchain pour une traçabilité inaltérable de la provenance des composants.
Pour les équipes DevSecOps, le message est clair : commencer dès aujourd'hui par les fondamentaux (SBOM, scanning régulier, mises à jour automatisées) et progresser vers des niveaux de maturité supérieurs (SLSA Level 3+, signature systématique, policies as code) est le chemin le plus sûr vers une posture de sécurité resiliente.
Sources et références
- SLSA Framework - Supply-chain Levels for Software Artifacts
- Software Bill of Materials (SBOM) - CISA
- Snyk State of Open Source Security 2025
- Sigstore Documentation - Keyless Signing
- Trivy Documentation - Aqua Security
- CycloneDX SBOM Standard - OWASP
- GitHub Dependabot Documentation
- Supply Chain Security - Ippon Technologies Blog



