fix: planchers de sécurité pip-audit — brotli, filelock, opentelemetry-api, pypdf #224
CI / security (push) Successful in 2m42s
CI / lint (push) Successful in 3m22s
CI / test (push) Successful in 5m34s
CI / build (push) Successful in 2m48s
CI / e2e (push) Successful in 19m15s

This commit is contained in:
Spark
2026-10-25 21:02:57 +00:00
parent f29a22886a
commit 6972e9ec87
13 changed files with 184 additions and 22 deletions
+19 -1
View File
@@ -1,6 +1,6 @@
# ObsiGate — Roadmap
> **Version :** 2.78.0 | **Dernière mise à jour :** 2026-10-25
> **Version :** 2.78.1 | **Dernière mise à jour :** 2026-10-25
> **Ce fichier ne contient que le travail à venir** (🔵 En cours + ⚪ Backlog) et un index compact
> vers les fonctionnalités livrées.
> - **Méthode de livraison à appliquer pour toute tâche : [DELIVERY_WORKFLOW.md](./DELIVERY_WORKFLOW.md)**
@@ -30,6 +30,24 @@
## 🔵 En cours
### 224. Sécurité des dépendances — pip-audit vierge (brotli, filelock, opentelemetry-api, pypdf)
- **Effort :** ~0,1 jour | **Impact :** 🔴 | **Ouvert :** 2026-10-25 | **Statut :** ✅ livré le 2026-10-25 (version du hook — voir CHANGELOG ; redéploiement Docker requis)
- **Fiche :** [features/securite-dependances-pip-audit-224.md](./features/securite-dependances-pip-audit-224.md)
- **Description :** le job `security` du run CI 2303 (2.78.0) échoue
sur `pip-audit` : 17 vulnérabilités dans 4 paquets hérités de
l'environnement du runner (toolcache « already satisfied », même
piège que BUG-093). Planchers explicites dans
`backend/requirements.txt` : pypdf relevé à `>=6.21.2`, nouveaux
planchers `brotli>=1.2.1`, `filelock>=4.2.1`,
`opentelemetry-api>=1.45.1` ; garde-fou `TestDependencySecurityFloors`
étendu. Aucun code applicatif, aucun nouvel ignore pip-audit.
- **Sous-tâches :**
- [x] Planchers de sécurité dans `backend/requirements.txt` + commentaires
- [x] Garde-fou `tests/test_ci_workflow.py::TestDependencySecurityFloors` étendu (pypdf 6.21.2, brotli, filelock, opentelemetry-api)
- [x] `pip-audit` local : 0 vulnérabilité non ignorée (mêmes ignores que la CI)
- [x] Release publiée — CI verte à constater, redéploiement Docker (geste de Bruno)
### 223. Dev/prod sans noms publics en dur — URLs de l'écosystème par configuration
- **Effort :** ~0,5 jour | **Impact :** 🟡 | **Ouvert :** 2026-10-25 | **Statut :** ✅ livré le 2026-10-25 (version du hook — voir CHANGELOG ; redéploiement Docker requis, et en dev déclarer les noms en `-dev` dans le `.env` du poste)
@@ -0,0 +1,94 @@
# #224 — Sécurité des dépendances : pip-audit vierge (brotli, filelock, opentelemetry-api, pypdf)
> Ouvert le 2026-10-25. Déclencheur : le job `security` du run CI 2303
> (commit `f29a228`, version 2.78.0) échoue sur `pip-audit` (bloquant,
> #87) — **17 vulnérabilités connues dans 4 paquets**. Le job `lint`
> du même run est vert ; `security` est le seul job terminé en échec
> au moment du constat (`test` en file, `build`/`e2e` en attente).
## Constat (journal du job `security`, run 2303)
| Paquet | Version auditée | Vulnérabilités | Corrigée en |
|---|---|---|---|
| brotli | 1.2.0 | PYSEC-2026-4322, GHSA-9v8h-qqgm-4m35 | 1.2.1 |
| filelock | 3.32.3 | CVE-2026-112940, CVE-2026-112913, CVE-2026-112907 | 4.2.1 |
| opentelemetry-api | 1.37.0 | CVE-2026-114603 | 1.45.1 |
| pypdf | 6.19.0 | CVE-2026-113792, CVE-2026-113795, CVE-2026-113793, CVE-2026-113794, CVE-2026-113786, CVE-2026-113791, CVE-2026-113790, CVE-2026-113789, CVE-2026-115572, CVE-2026-115585, CVE-2026-115580 | 6.20.0 → 6.21.2 selon l'advisory (max 6.21.2) |
Total : 2 + 3 + 1 + 11 = **17 vulnérabilités**.
Audit local de confirmation, en deux temps : (1) un venv épinglé sur
les versions du runner (brotli 1.2.0, filelock 3.32.3,
opentelemetry-api 1.37.0, pypdf 6.19.0) reproduit **exactement** les
17 vulnérabilités et les versions corrigées du tableau ci-dessus ;
(2) dans le venv du dépôt, `pip-audit` (avec les deux ignores déjà en
place dans la CI) ne ressortait avant correctif que brotli 1.2.0
(2 advisories, fix 1.2.1) et pypdf 6.21.1 (3 advisories restants,
fix 6.21.2) — ce venv a déjà filelock 4.2.4 (corrigée) et ne contient
pas opentelemetry-api. L'écart avec la CI vient de l'environnement
audité, pas des dépendances déclarées (voir cause).
## Cause racine
Même piège que BUG-093 / BUG-095, déjà documenté dans
`backend/requirements.txt` et `.gitea/workflows/ci.yml` : `pip-audit`
audite **tout l'environnement Python du runner**, dont les paquets
préinstallés dans la toolcache de l'image `catthehacker/ubuntu:act-latest`.
`pip install -r backend/requirements.txt` répond « already satisfied »
pour toute exigence transitive déjà satisfaite par la toolcache et
n'aligne jamais la version vulnérable :
- **pypdf 6.19.0** : préinstallée ; le plancher `>=6.16.1` (BUG-093)
est satisfait, pip ne monte pas vers 6.21.2.
- **brotli 1.2.0** : transitive de `fonttools[woff]` (via weasyprint),
exigée en `>=1.0.1` seulement.
- **filelock 3.32.3** : transitive de CacheControl (outil `pip-audit`
lui-même) et préinstallée ; exigée en `>=3.8.0` seulement.
- **opentelemetry-api 1.37.0** : préinstallée dans la toolcache,
aucune dépendance d'ObsiGate ne la demande.
## Correctif
Planchers de sécurité explicites dans `backend/requirements.txt`,
selon le patron déjà en place (pyjwt, urllib3, multidict, certifi) —
aucune autre dépendance touchée, aucun code applicatif modifié :
- `pypdf>=6.16.1` → **`pypdf>=6.21.2`** (plancher existant relevé) ;
- **`brotli>=1.2.1`** (nouveau plancher) ;
- **`filelock>=4.2.1`** (nouveau plancher) ;
- **`opentelemetry-api>=1.45.1`** (nouveau plancher).
Garde-fou : `tests/test_ci_workflow.py::TestDependencySecurityFloors`
couvre désormais aussi brotli, filelock et opentelemetry-api, et le
plancher verrouillé de pypdf passe à (6, 21, 2). Le commentaire de
l'étape Pip-audit de `.gitea/workflows/ci.yml` est mis à jour en
conséquence (aucune commande CI modifiée).
## Exceptions (ignores)
**Aucun nouvel ignore.** Les deux exceptions déjà en place dans la
CI restent inchangées et ne concernent pas ces paquets :
`PYSEC-2026-1325` (ecdsa, aucun correctif upstream, chemins ECDSA
jamais exécutés — HS256 uniquement) et `CVE-2026-85394`
(python-jose, aucun correctif upstream, non atteignable — voir le
commentaire de l'étape dans `ci.yml`).
## Vérification
- `pip-audit` local (mêmes ignores que la CI) après alignement de
l'environnement sur les nouveaux planchers : **0 vulnérabilité
non ignorée**.
- Portes locales du workflow : `pytest tests/`, `ruff check backend/`,
`mypy backend/ --ignore-missing-imports`, tests frontend
(`validate-imports` + `unit`) — voir le commit #224.
- CI Gitea complète verte exigée (lint, test, security, build, e2e)
avant de considérer #224 livré.
## Livraison
- Commit conventionnel `fix: … #224` ; le hook de version porte
2.78.0 → **2.78.1** (correctif) et crée le tag `v2.78.1`, publié
au push ; release Gitea créée sur ce tag après vérification de sa
cible.
- **Redéploiement Docker requis** pour que l'image embarque les
dépendances alignées (l'hôte actuel est l'environnement dev).