From f0ad8e99907587a73a0c6252ee2a2ac0226a0d9e Mon Sep 17 00:00:00 2001 From: Johan LEROY Date: Mon, 21 Sep 2026 10:50:25 +0200 Subject: [PATCH] ci(security): branche Bandit sur apps/backend et sur le module ML MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le pipeline auditait les dépendances (pip-audit, npm audit, Dependabot) mais jamais le code lui-même : aucun SAST, aucun DAST. C'était le seul rouge de BC03 qui se fermait en une étape de workflow. Le job bloque à partir de MEDIUM/MEDIUM, et une seconde passe sans seuil publie les constats LOW sans bloquer : sans elle, un LOW disparaîtrait du journal sans trace. Le périmètre est le code livré (`app`, `enervision_ml`) et non les tests, qui emploient légitimement des secrets factices et des `assert`. Relevé au 21/09 : zéro constat tous niveaux confondus sur 5 904 lignes. Couvre #39. Ferme C18 de la grille d'auto-évaluation. --- .github/workflows/backend.yml | 27 +++++++++++++++++++++++++++ .github/workflows/ml.yml | 24 ++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml index 8ad1302..f02eef8 100644 --- a/.github/workflows/backend.yml +++ b/.github/workflows/backend.yml @@ -140,3 +140,30 @@ jobs: # Piège : sans `shell: bash`, un échec de `uv export` serait masqué par le pipe. shell: bash run: uv export --frozen --no-dev --no-emit-project --no-hashes | uvx pip-audit --requirement /dev/stdin --no-deps + + sast: + name: Analyse statique de sécurité + runs-on: ubuntu-latest + defaults: + run: + working-directory: apps/backend + + steps: + - name: Récupère le dépôt + uses: actions/checkout@v4 + + - name: Installe uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + cache-dependency-glob: apps/backend/uv.lock + + # Pourquoi : le périmètre est `app`, le code livré. Les tests emploient légitimement des + # secrets factices et des `assert` que Bandit signalerait sans qu'aucun n'atteigne la prod. + - name: Analyse le code livré (bloquant à partir de MEDIUM) + run: uvx bandit --recursive app --severity-level medium --confidence-level medium + + # Piège : sans cette seconde passe, un constat LOW disparaîtrait du journal sans trace. + - name: Rapport complet, tous niveaux + continue-on-error: true + run: uvx bandit --recursive app diff --git a/.github/workflows/ml.yml b/.github/workflows/ml.yml index b85fec7..4700a97 100644 --- a/.github/workflows/ml.yml +++ b/.github/workflows/ml.yml @@ -57,3 +57,27 @@ jobs: # synthetiques ou un magasin SQLite local jetable (cf. ml/tests/test_train.py). - name: Tests run: uv run pytest + + sast: + name: Analyse statique de sécurité + runs-on: ubuntu-latest + defaults: + run: + working-directory: ml + + steps: + - name: Récupère le dépôt + uses: actions/checkout@v4 + + - name: Installe uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + cache-dependency-glob: ml/uv.lock + + - name: Analyse le code livré (bloquant à partir de MEDIUM) + run: uvx bandit --recursive enervision_ml --severity-level medium --confidence-level medium + + - name: Rapport complet, tous niveaux + continue-on-error: true + run: uvx bandit --recursive enervision_ml