Guide complet pour auditer et mettre à jour les dépendances d’un projet Laravel/React (ou tout projet PHP/JS).
Vue d’ensemble
┌─────────────────────────────────────────────────────────────────────────────┐
│ AUDIT SECURITE │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ composer audit npm audit trivy fs . │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌─────────────┐ │
│ │ PHP │ │ JS │ │ PHP + JS + │ │
│ │ packages │ │ packages │ │ Dockerfiles │ │
│ └──────────┘ └──────────┘ │ + secrets │ │
│ └─────────────┘ │
│ │
│ Intégré Intégré A installer │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Partie 1 : Audit de sécurité
Outils intégrés (aucune installation)
# PHP - scan composer.lock
composer audit
# JS - scan package-lock.json
npm auditCes commandes sont intégrées nativement. Elles analysent les fichiers .lock et signalent les vulnérabilités connues (CVE).
Trivy : le scanner complet
Trivy est un scanner open-source d’Aqua Security. Il détecte les vulnérabilités dans :
- Dépendances PHP/JS
- Images Docker
- Fichiers de config (Dockerfile, K8s)
- Secrets exposés
Utilisation via Docker
# Scanner le projet
docker run --rm -v $(pwd):/app aquasec/trivy fs /app
# HIGH/CRITICAL seulement
docker run --rm -v $(pwd):/app aquasec/trivy fs --severity HIGH,CRITICAL /app
# Scanner une image Docker
docker run --rm aquasec/trivy image mon-image:tag
# Ignorer les vulnérabilités sans fix disponible
docker run --rm -v $(pwd):/app aquasec/trivy fs --ignore-unfixed /appExemple de sortie
composer.lock (composer)
========================
Total: 1 (HIGH: 1, CRITICAL: 0)
┌───────────────────┬────────────────┬──────────┬─────────┬─────────────────┐
│ Library │ Vulnerability │ Severity │ Version │ Fixed Version │
├───────────────────┼────────────────┼──────────┼─────────┼─────────────────┤
│ laravel/framework │ CVE-2024-XXXXX │ HIGH │ 12.0.0 │ 12.0.1 │
└───────────────────┴────────────────┴──────────┴─────────┴─────────────────┘
Interpréter les résultats
| Colonne | Signification |
|---|---|
| Library | Package vulnérable |
| Vulnerability | Identifiant CVE (lien vers détails) |
| Severity | CRITICAL > HIGH > MEDIUM > LOW |
| Status | fixed = un correctif existe |
| Installed Version | Version actuellement installée |
| Fixed Version | Version à installer pour corriger |
Quand agir ?
┌─────────────────────────────────────────────────────────────────────────────┐
│ DOIS-JE CORRIGER ? │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ Le fichier vulnérable est-il dans vendor/ ou node_modules/ ? │
│ │ │
│ ├── OUI ──► Est-ce du code exécuté par l'app ? │
│ │ │ │
│ │ ├── NON (docs/, tests/) ──► IGNORER │
│ │ │ │
│ │ └── OUI ──► Severity ? │
│ │ │ │
│ │ ├── CRITICAL/HIGH ──► CORRIGER │
│ │ │ │
│ │ └── MEDIUM/LOW ──► Évaluer le risque │
│ │ │
│ └── NON (ton code) ──► CORRIGER │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Faux positifs courants
| Fichier | Pourquoi c’est un faux positif |
|---|---|
vendor/*/docs/requirements.txt |
Fichiers Python pour générer la doc, pas exécutés |
vendor/*/tests/* |
Code de test du mainteneur, pas en production |
node_modules/*/example/* |
Exemples, pas utilisés par ton app |
Exclure les faux positifs
# Exclure vendor/ et node_modules/
docker run --rm -v $(pwd):/app aquasec/trivy fs --skip-dirs vendor,node_modules /app
# Exclure des fichiers spécifiques
docker run --rm -v $(pwd):/app aquasec/trivy fs --skip-files "vendor/mockery/mockery/docs/requirements.txt" /app
# Fichier .trivyignore (à la racine du projet)
echo "# Faux positif - fichier non exécuté
CVE-2024-XXXXX" > .trivyignorePartie 2 : Mise à jour des dépendances
┌─────────────────────────────────────────────────────────────────────────────┐
│ MISE A JOUR │
├─────────────────────────────────┬───────────────────────────────────────────┤
│ SAFE │ FULL │
│ (garde les vieilles │ (met à jour .json avec │
│ contraintes dans .json) │ les dernières versions) │
├─────────────────────────────────┼───────────────────────────────────────────┤
│ │ │
│ composer update │ composer bump │
│ │ │ │ │
│ ▼ │ ▼ │
│ ┌──────────────┐ │ ┌──────────────┐ ┌──────────────┐ │
│ │ .lock seul │ │ │ composer.json│ + │ .lock │ │
│ └──────────────┘ │ └──────────────┘ └──────────────┘ │
│ │ │
├─────────────────────────────────┼───────────────────────────────────────────┤
│ │ │
│ npm update │ npx npm-check-updates -u │
│ │ │ │ │
│ ▼ │ ▼ │
│ ┌──────────────┐ │ ┌──────────────┐ │
│ │ .lock seul │ │ │ package.json │ (modifié) │
│ └──────────────┘ │ └──────────────┘ │
│ │ │ │
│ │ ▼ │
│ │ npm install │
│ │ │ │
│ │ ▼ │
│ │ ┌──────────────┐ │
│ │ │ .lock │ │
│ │ └──────────────┘ │
└─────────────────────────────────┴───────────────────────────────────────────┘
Vérifier les versions obsolètes
# Composer - packages PHP outdated
composer outdated
# npm - packages JS outdated
npm outdatedMise à jour SAFE (dans les contraintes existantes)
Ces commandes mettent à jour sans modifier composer.json / package.json. Elles respectent les contraintes de version (ex: ^12.0 reste en 12.x).
# PHP
composer update
# JS
npm updateSeuls les fichiers .lock sont modifiés.
Mise à jour FULL (dernières versions majeures)
npm
# 1. Voir les mises à jour disponibles
npx npm-check-updates
# 2. Mettre à jour package.json vers les dernières versions
npx npm-check-updates -u
# 3. Installer les nouvelles versions
npm installOptions utiles de npm-check-updates :
# Mettre à jour uniquement les devDependencies
npx npm-check-updates -u --dep dev
# Mettre à jour uniquement les dependencies
npx npm-check-updates -u --dep prod
# Exclure certains packages
npx npm-check-updates -u --reject "react,react-dom"
# Mode interactif (choisir package par package)
npx npm-check-updates -u --interactiveComposer
# 1. Voir les dernières versions
composer outdated --direct
# 2. Mettre à jour composer.json avec les versions actuellement installées
composer bump
# 3. Pour un package spécifique vers une nouvelle version majeure
composer require laravel/framework:^12.0composer bump met à jour les contraintes dans composer.json pour correspondre aux versions installées dans composer.lock.
Exemple : "^12.0" devient "^12.5" si 12.5 est installé.
npm-check-updates vs audit fix
npm-check-updates -u |
npm audit fix --force |
|
|---|---|---|
| But | Dernières versions | Corriger les failles |
| Scope | Tous les packages | Packages vulnérables only |
| Logique | “Je veux le plus récent” | “Je veux être secure” |
Exemple :
| Package | npm-check-updates | audit fix |
|---|---|---|
| react 18.0 → 19.2 | OUI | NON (pas vulnérable) |
| lodash 4.17.20 → 4.17.21 | OUI | OUI (CVE corrigé) |
Corriger les vulnérabilités
# PHP - mettre à jour le package vulnérable
composer update vendor/package
# JS - correction automatique (si possible)
npm audit fix
# JS - forcer les corrections (peut casser des choses)
npm audit fix --forceAprès une mise à jour majeure
# Vérifier que tout fonctionne
npm run build
npm run types
php artisan test
# Si problèmes de cache
php artisan cache:clear
php artisan config:clear
php artisan view:clearPartie 3 : Intégration CI/CD
GitHub Actions
# .github/workflows/security.yml
name: Security Scan
on:
push:
branches: [main]
schedule:
- cron: '0 0 * * *'
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: composer audit
- run: npm audit
- uses: aquasecurity/trivy-action@master
with:
scan-type: 'fs'
severity: 'HIGH,CRITICAL'
exit-code: '1'GitLab CI
# .gitlab-ci.yml
security-scan:
stage: test
image: docker:latest
services:
- docker:dind
script:
- composer audit
- npm audit
- docker run --rm -v $(pwd):/app aquasec/trivy fs --severity HIGH,CRITICAL --exit-code 1 /app
rules:
- if: $CI_COMMIT_BRANCH == "main"
- if: $CI_PIPELINE_SOURCE == "schedule"Gitea Actions
# .gitea/workflows/security.yml
name: Security Scan
on:
push:
branches: [main]
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: composer audit
- run: npm audit
- run: docker run --rm -v $(pwd):/app aquasec/trivy fs --severity HIGH,CRITICAL --exit-code 1 /appBonnes pratiques
- Commiter avant de mettre à jour (
git commit) - Lire les changelogs pour les mises à jour majeures
- Tester après chaque mise à jour (
npm run build,php artisan test) - Une mise à jour à la fois pour les packages critiques (Laravel, React, Inertia)
- Automatiser les scans de sécurité en CI/CD