cyber / cybersecurite-fondamentale
Sécurité du code : SAST, dépendances vulnérables et SBOM
Explication
Ce que vous allez apprendre
- Comprendre le principe du "shift left" : trouver une faille tôt coûte bien moins cher que la corriger en production
- Distinguer SAST, DAST et SCA et savoir pourquoi ces trois approches sont complémentaires
- Détecter des patterns de code dangereux (
shell=True,pickle, secrets en dur) avec Bandit ou Semgrep - Scanner les dépendances tierces d'un projet avec pip-audit ou npm audit
- Générer et exploiter un SBOM pour répondre rapidement à une nouvelle CVE critique
Dans quel contexte ?
Une entreprise apprend, un vendredi soir, qu'une bibliothèque très répandue vient de révéler une faille critique de type Log4Shell. Sans inventaire précis de ses dépendances, l'équipe doit auditer manuellement des dizaines de projets pour savoir si elle est concernée, une opération qui prend des heures dans la panique. Avec un SBOM à jour pour chaque projet, la même question trouve sa réponse en quelques minutes grâce à une simple recherche dans l'inventaire.
Ramener la sécurité au plus tôt dans le cycle de développement
Toutes les vulnérabilités vues jusqu'ici (injection SQL, XSS, secrets exposés) peuvent être détectées automatiquement AVANT même que le code n'atteigne la production, si l'on outille correctement la chaîne de développement. C'est le principe du "shift left" : plus une faille est trouvée tôt, moins elle coûte cher à corriger.
Trois outils complémentaires, trois angles différents
| Approche | Ce qu'elle analyse | Exemple d'outil |
|---|---|---|
| SAST | Le code source, sans l'exécuter | Bandit, Semgrep |
| DAST | L'application en cours d'exécution, de l'extérieur | Scanner web dynamique |
| SCA | Les dépendances tierces, contre des bases de CVE | pip-audit, npm audit |
Ces trois approches ne se recouvrent pas : elles sont complémentaires, pas interchangeables.
Pourquoi les dépendances sont un angle mort fréquent
Piège fréquent
Un projet moderne compte souvent des centaines de dépendances indirectes que personne n'a auditées individuellement. Une seule bibliothèque vulnérable, même profondément enfouie dans la chaîne de dépendances, peut exposer toute l'application — c'est exactement ce qui s'est passé avec la faille Log4Shell mentionnée en leçon 1.
Le SBOM : répondre vite à une nouvelle CVE critique
Un SBOM (Software Bill of Materials, format CycloneDX par exemple) est un inventaire précis de tous les composants logiciels utilisés par une application, avec leurs versions exactes. Quand une nouvelle CVE critique est annoncée sur une bibliothèque courante, un SBOM à jour permet de répondre en quelques minutes à la question "sommes-nous concernés ?", au lieu de devoir auditer manuellement chaque projet.
Le rôle de la CI comme filet de sécurité automatique
Faire tourner ces scans en intégration continue, à chaque pull request, empêche une régression de sécurité d'atteindre la branche principale — le même principe que gitleaks vu en leçon 16, appliqué plus largement.
Commandes & code
Sécurité du code : SAST, dépendances vulnérables et SBOM
# Catégories d'analyse de sécurité du code
SAST (Static Application Security Testing) : analyse le code source sans l'exécuter
DAST (Dynamic Application Security Testing) : teste l'application en cours d'exécution (boîte noire)
SCA (Software Composition Analysis) : analyse les dépendances tierces pour des CVE connues
IAST (Interactive AST) : combine SAST+DAST via instrumentation à l'exécution# SAST avec Bandit (Python) - détecte des patterns de code dangereux
bandit -r ./app -f json -o bandit-report.json
bandit -r ./app -ll # affiche uniquement les sévérités moyenne et haute# Exemples de findings typiques que Bandit détecte
import subprocess
subprocess.call("ls " + user_input, shell=True) # B602 - shell=True avec entrée non fiable -> injection de commande
import pickle
data = pickle.loads(untrusted_bytes) # B301 - désérialisation non fiable -> exécution de code arbitraire
password = "hardcoded_password_123" # B105 - secret codé en dur détecté# CORRECT : éviter shell=True, passer les arguments en liste (pas de shell intermédiaire)
import subprocess
def list_files_safe(directory: str) -> str:
# subprocess avec liste d'arguments : pas d'interprétation shell, pas d'injection possible
result = subprocess.run(["ls", "-la", directory], capture_output=True, text=True, check=True)
return result.stdout
# Pour la désérialisation : préférer json (sûr) à pickle (dangereux sur données non fiables)
import json
data = json.loads(untrusted_text) # ne permet pas l'exécution de code arbitraire, contrairement à pickle# SCA : scanner les dépendances Python pour des vulnérabilités connues
pip-audit # scanne l'environnement Python actif contre la base OSV
pip-audit -r requirements.txt --fix # propose/applique une mise à jour vers une version corrigée
# Équivalent JavaScript/Node.js (frontend Next.js)
npm audit
npm audit fix# ESLint avec plugin sécurité pour le frontend Next.js/React (SAST JavaScript)
npx eslint --ext .js,.jsx,.ts,.tsx --plugin security ./src
# Semgrep : SAST multi-langage basé sur des règles, très utilisé en CI moderne
semgrep --config "p/owasp-top-ten" ./backend
semgrep --config "p/react" ./frontend# Intégration en CI/CD (GitHub Actions) : bloquer le merge si une vulnérabilité critique est détectée
name: security-checks
on: [pull_request]
jobs:
sast:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Bandit (SAST Python)
run: |
pip install bandit
bandit -r ./backfast/app -ll -f json -o bandit-report.json
- name: Run pip-audit (SCA)
run: |
pip install pip-audit
pip-audit -r backfast/requirements.txt
- name: Run gitleaks (secrets)
uses: gitleaks/gitleaks-action@v2// SBOM (Software Bill of Materials) : inventaire exhaustif de tous les composants d'une application
// Format standard CycloneDX, généré automatiquement (ex: avec cyclonedx-py ou syft)
{
"bomFormat": "CycloneDX",
"specVersion": "1.5",
"components": [
{ "type": "library", "name": "fastapi", "version": "0.111.0", "purl": "pkg:pypi/fastapi@0.111.0" },
{ "type": "library", "name": "sqlalchemy", "version": "2.0.30", "purl": "pkg:pypi/sqlalchemy@2.0.30" }
]
}# Génération d'un SBOM avec syft, puis scan de ce SBOM avec grype pour détecter des CVE
syft dir:./backfast -o cyclonedx-json > sbom.json
grype sbom:sbom.json --fail-on high
# Le SBOM permet de répondre rapidement à "sommes-nous affectés par la CVE X ?" sans re-scanner tout le code
# Utile lors d'incidents type Log4Shell : recherche instantanée dans l'inventaire plutôt qu'un audit d'urgenceRésumé
- SAST (code source), DAST (application en exécution) et SCA (dépendances) sont complémentaires, pas substituables.
- Bandit/Semgrep détectent des patterns dangereux (shell=True, pickle non fiable, secrets en dur) directement dans le code.
- pip-audit/npm audit et gitleaks doivent tourner en CI pour bloquer les régressions avant merge.
- Un SBOM (CycloneDX) permet de répondre en minutes, lors d'une nouvelle CVE critique, à "sommes-nous concernés ?".
Exercices pratiques
Mission : le vendredi soir d'une nouvelle CVE critique
Objectif : Utiliser SAST, SCA et un SBOM pour répondre rapidement à une alerte de vulnérabilité critique sur une dépendance largement utilisée.
Contexte
Un vendredi soir, une CVE critique est annoncée sur une bibliothèque de logging très répandue, avec un exploit public déjà en circulation (un scénario proche de Log4Shell, vu en leçon 1). Technologik doit déterminer en urgence si l'un de ses dizaines de projets internes utilise cette bibliothèque, directement ou via une dépendance transitive.