Retour au cours

cyber / cybersecurite-fondamentale

Sécurité du code : SAST, dépendances vulnérables et SBOM

Leçon 241 exercice

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

ApprocheCe qu'elle analyseExemple d'outil
SASTLe code source, sans l'exécuterBandit, Semgrep
DASTL'application en cours d'exécution, de l'extérieurScanner web dynamique
SCALes dépendances tierces, contre des bases de CVEpip-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

text
# 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
bash
# 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
python
# 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é
python
# 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
bash
# 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
bash
# 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
yaml
# 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
json
// 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" }
  ]
}
bash
# 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'urgence

Ré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

1 disponible
1

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.

Résoudre l’exercice →