[security] deps: rafraîchir le lock npm — 7 advisories (react-router, vitest, browserslist, nanoid) (high) #358

Closed
opened 2026-09-26 12:58:03 +00:00 by maximus · 0 comments
Owner

Planification du 2026-10-10 (/plan-run, milestone planned-2026-10-10-release-deps) : les sections ci-dessous, à partir de « Dépendances », priment sur le texte d'analyse en cas d'écart.

Contexte

/analyse-vulnerabilite du 2026-09-26. Source retenue : npm audit live après npm ci sur le lock de main. Le rapport du Défenseur defenseur-simpl-resultat a été écarté parce qu'il date du 2026-05-06 : le fetch --fresh restait bloqué sur une auth SSH en attente. Côté Rust, rien à signaler : audit.yml est vert chaque jour du 09-22 au 09-26 (runs 415 à 419).

npm audit : 7 findings (4 high, 3 moderate), contre les 2 acceptés au 2026-07-27 (#311). Ils se ramènent à 4 dépendances racines, et chaque correctif tient dans la borne déjà déclarée. Il n'y a ni modification de package.json ni override à prévoir, seulement un rafraîchissement du lock.

Paquet (installé) Advisory Sév. Chemin Surface dans le binaire livré Version obtenue
react-router / react-router-dom 7.18.1 (direct) GHSA-qwww-vcr4-c8h2 : CSRF en mode RSC high runtime Nulle : mode RSC seulement, alors que App.tsx monte un BrowserRouter client-only 7.18.4
vitest / @vitest/mocker 4.1.9 (direct, dev) GHSA-82fw-gwwq-j7x9 : path traversal / lecture de fichier via le redirect du mocker moderate tests Nulle : jamais bundlé 4.1.11
browserslist 4.28.4 (via @babel/helper-compilation-targets) GHSA-c83g-rgw3-j3cx, GHSA-73wf-gq98-2v4g high build Nulle : requêtes issues de notre propre config 4.29.1
baseline-browser-mapping 2.10.41 (via browserslist) GHSA-w5vr-8v7q-w6rv : arrêt du process sur entrée invalide moderate build Nulle 2.11.26
nanoid 3.3.16 (via vite → postcss) GHSA-2v37-7h3g-55p8 : boucle infinie, générateur custom avec size 0 high build Nulle 3.3.19

Tout ceci relève du durcissement, pas de l'incident.

Absorbe #317

#317 acceptait l'advisory react-router parce que le seul correctif proposé par npm était un downgrade (7.11.0), react-router-dom semblant figé en 7.18.1. Cette prémisse ne tient plus : react-router-dom 7.18.2 à 7.18.4 sont publiés. Le correctif est donc un bump de patch dans ^7.18.1, sans migration v8. La PR ferme aussi #317.

Vérifications faites en analyse (2026-09-26, sur une copie jetable du lock de main)

  • npm 10.9.4 (local) plante sur la commande d'origine : Cannot read properties of null (reading 'edgesOut') dans @npmcli/arborist build-ideal-tree.js #loadPeerSet, sur node_modules/vitest. Ça plante dans tous les modes : npm update, npm install vitest@4.1.11, avec ou sans --package-lock-only, avec ou sans node_modules. react-router-dom et les trois transitives passent seules sous npm 10 ; seul vitest bloque.
  • npm 11.20.0 résout tout : npm audit = 0, package.json inchangé, lockfileVersion 3 → 3, 259 → 259 paquets, 80 lignes changées sur 18 paquets. Ce sont les 7 visés, plus leurs compagnons de borne : les 6 @vitest/*, tinyrainbow, caniuse-lite, electron-to-chromium, node-releases et update-browserslist-db.
  • Le lock produit par npm 11 est accepté par npm ci de npm 10 sans réécriture. La CI (check-frontend.yml, release.yml) installe Node 20 via nodesource, donc npm 10 : seule la génération du lock dépend de npm 11.
  • browserslist ne pilote pas la sortie du build selon toute vraisemblance : son seul consommateur est @babel/helper-compilation-targets, sous @vitejs/plugin-react, sans preset-env et sans .browserslistrc ni champ browserslist dans package.json. La comparaison octet pour octet reste exigée pour le prouver.

Décisions (Max, 2026-09-26)

  • Outil : npx --yes npm@11 ponctuel pour générer le lock (rien d'installé globalement).
  • Périmètre : lock seul, sans relever les planchers de package.json (^7.18.1 et ^4.1.9 résolvent déjà vers les versions corrigées, et npm ci ne redescend pas sous le lock).

Travail à faire

  • Brancher depuis main à jour (pas depuis une branche de feature).
  • Construire la référence avant bump : npm ci && npm run build, puis copier dist/ à l'écart.
  • npx --yes npm@11.21.0 update react-router-dom react-router vitest @vitest/mocker browserslist baseline-browser-mapping nanoid source-map-js --package-lock-only --ignore-scripts
  • Vérifier que git diff --stat ne touche que package-lock.json, que le compte est de 259 paquets de part et d'autre, et que les versions correspondent à la table ci-dessus.
  • npm ci (npm 10) : le lock ne doit pas être réécrit. Puis npm audit : 0.
  • npm run build + npm test, puis comparer dist/ avec la référence (diff -r). Un écart doit être expliqué avant le merge.
  • Docs : remplacer la mention « 2 high react-router acceptés en permanence » dans CLAUDE.md (section CI/CD, ligne ~165) et docs/architecture.md (~487) par « npm audit à 0 au (#358) », en gardant la précision qu'aucun npm audit ne tourne en CI. Retirer le renvoi à #317.
  • CHANGELOG ### Security / ### Sécurité sous [Unreleased], dans les deux langues, en précisant qu'aucune de ces advisories n'était atteignable dans l'app livrée.
  • Commit fix(deps): refresh npm lock to clear 7 advisories avec Resolves #358 et Resolves #317.

Fichiers concernés

  • package-lock.json : seul fichier de dépendances modifié.
  • CLAUDE.md, docs/architecture.md : l'état « 2 high acceptés » devient faux.
  • CHANGELOG.md, CHANGELOG.fr.md : entrée Security.
  • STATE.md : le chapeau (« 2 restantes, acceptées ») sera corrigé par la synchro post-merge.

Surface de test

  • Existants : la suite vitest complète (elle exerce le runner mis à jour) et npm run build (tsc + vite).
  • Test de régression spécifique : non, bump de dépendances sans changement de code. La preuve est le diff -r dist/ avant/après.

Critères d'acceptation

  • npm audit = 0 sur la branche, après npm ci avec npm 10.
  • Diff de dépendances limité à package-lock.json ; package.json inchangé.
  • npm run build et npm test verts, en local et en CI (check-frontend).
  • Sortie dist/ identique à la référence, ou écart expliqué dans la PR.
  • Docs et CHANGELOG FR/EN à jour ; #317 fermée par la même PR.

Complexité estimée

Simple.


Issue créée par /analyse-vulnerabilite, analysée par /analyze le 2026-09-26.


Dépendances

Depends on

Mise à jour du 2026-10-10

  • Huitième advisory apparue depuis l'analyse : source-map-js 1.2.1 → 1.2.2 (GHSA-68fv-2mgg-jv7q, high, déni de service par offsets de sections indexées ; build seulement, via vite → postcss et @tailwindcss/vite → @tailwindcss/node). Ajoutée à la commande. npm audit le 2026-10-10 : 8 findings (5 high, 3 moderate).
  • Vérifié à la revue : la commande ci-dessus sous npm 11 ramène npm audit à 0 sur une copie, package.json inchangé.
  • Après #376, la CI tourne sous Node 24, donc npm 11 : le lock est lu par le même npm que celui qui le génère.

Fichiers concernés (complet)

  • package-lock.json (seul fichier de dépendances modifié)
  • CLAUDE.md (section CI/CD), docs/architecture.md (~L487)
  • CHANGELOG.md, CHANGELOG.fr.md

Critères d'acceptation (planification)

  • Lock généré avec npm@11.21.0 exactement ; version consignée dans la PR.
  • Chaque nouveau resolved de package-lock.json pointe vers https://registry.npmjs.org/ et porte un champ integrity (vérification scriptée, résultat dans la PR).
  • npm audit relancé juste avant le commit : « found 0 vulnerabilities », sortie collée dans la PR. Si une nouvelle advisory est apparue entre-temps et se corrige dans la borne déclarée, l'ajouter à la commande ; sinon, la nommer dans la PR sans élargir le périmètre.
  • diff -r dist/ avant/après : identique, ou écart expliqué dans la PR.
  • CLAUDE.md et docs/architecture.md : « npm audit à 0 au (#358) », plus de « 2 high acceptés », renvoi à #317 retiré, précision « aucun npm audit en CI » gardée.
  • CHANGELOG Security / Sécurité (aucune advisory n'était atteignable dans l'app livrée) ; commit avec Resolves #358 et Resolves #317.

Review caveats

  • 🟡 SECURITE (résolu) : npm épinglé à une version exacte, resolved/integrity vérifiés.
  • 🟢 ARCHITECTURE (résolu) : « 0 » daté, pas présenté comme un état permanent.

Décisions prises en planification

  • npm@11.21.0 (Max, 2026-10-10).
  • Périmètre : lock seul, planchers de package.json inchangés (Max, 2026-09-26, inchangé).

Spec source

spec-plan-release-deps.md (local, ignoré par git)

> **Planification du 2026-10-10** (`/plan-run`, milestone `planned-2026-10-10-release-deps`) : les sections ci-dessous, à partir de « Dépendances », **priment** sur le texte d'analyse en cas d'écart. ## Contexte `/analyse-vulnerabilite` du 2026-09-26. **Source retenue : `npm audit` live** après `npm ci` sur le lock de `main`. Le rapport du Défenseur `defenseur-simpl-resultat` a été écarté parce qu'il date du 2026-05-06 : le fetch `--fresh` restait bloqué sur une auth SSH en attente. Côté Rust, rien à signaler : `audit.yml` est vert chaque jour du 09-22 au 09-26 (runs 415 à 419). `npm audit` : **7 findings** (4 high, 3 moderate), contre les 2 acceptés au 2026-07-27 (#311). Ils se ramènent à 4 dépendances racines, et chaque correctif tient dans la borne déjà déclarée. Il n'y a ni modification de `package.json` ni override à prévoir, seulement un rafraîchissement du lock. | Paquet (installé) | Advisory | Sév. | Chemin | Surface dans le binaire livré | Version obtenue | |---|---|---|---|---|---| | `react-router` / `react-router-dom` 7.18.1 (direct) | GHSA-qwww-vcr4-c8h2 : CSRF en mode RSC | high | runtime | Nulle : mode RSC seulement, alors que `App.tsx` monte un `BrowserRouter` client-only | 7.18.4 | | `vitest` / `@vitest/mocker` 4.1.9 (direct, dev) | GHSA-82fw-gwwq-j7x9 : path traversal / lecture de fichier via le redirect du mocker | moderate | tests | Nulle : jamais bundlé | 4.1.11 | | `browserslist` 4.28.4 (via `@babel/helper-compilation-targets`) | GHSA-c83g-rgw3-j3cx, GHSA-73wf-gq98-2v4g | high | build | Nulle : requêtes issues de notre propre config | 4.29.1 | | `baseline-browser-mapping` 2.10.41 (via `browserslist`) | GHSA-w5vr-8v7q-w6rv : arrêt du process sur entrée invalide | moderate | build | Nulle | 2.11.26 | | `nanoid` 3.3.16 (via `vite` → `postcss`) | GHSA-2v37-7h3g-55p8 : boucle infinie, générateur custom avec `size` 0 | high | build | Nulle | 3.3.19 | Tout ceci relève du **durcissement**, pas de l'incident. ### Absorbe #317 #317 acceptait l'advisory `react-router` parce que le seul correctif proposé par npm était un downgrade (7.11.0), `react-router-dom` semblant figé en 7.18.1. Cette prémisse ne tient plus : `react-router-dom` 7.18.2 à 7.18.4 sont publiés. Le correctif est donc un bump de patch dans `^7.18.1`, sans migration v8. La PR ferme aussi #317. ## Vérifications faites en analyse (2026-09-26, sur une copie jetable du lock de `main`) - **npm 10.9.4 (local) plante** sur la commande d'origine : `Cannot read properties of null (reading 'edgesOut')` dans `@npmcli/arborist` `build-ideal-tree.js` `#loadPeerSet`, sur `node_modules/vitest`. Ça plante dans tous les modes : `npm update`, `npm install vitest@4.1.11`, avec ou sans `--package-lock-only`, avec ou sans `node_modules`. `react-router-dom` et les trois transitives passent seules sous npm 10 ; seul `vitest` bloque. - **npm 11.20.0 résout tout** : `npm audit` = 0, `package.json` inchangé, `lockfileVersion` 3 → 3, 259 → 259 paquets, 80 lignes changées sur 18 paquets. Ce sont les 7 visés, plus leurs compagnons de borne : les 6 `@vitest/*`, `tinyrainbow`, `caniuse-lite`, `electron-to-chromium`, `node-releases` et `update-browserslist-db`. - **Le lock produit par npm 11 est accepté par `npm ci` de npm 10** sans réécriture. La CI (`check-frontend.yml`, `release.yml`) installe Node 20 via nodesource, donc npm 10 : seule la génération du lock dépend de npm 11. - **`browserslist` ne pilote pas la sortie du build** selon toute vraisemblance : son seul consommateur est `@babel/helper-compilation-targets`, sous `@vitejs/plugin-react`, sans `preset-env` et sans `.browserslistrc` ni champ `browserslist` dans `package.json`. La comparaison octet pour octet reste exigée pour le prouver. ## Décisions (Max, 2026-09-26) - **Outil** : `npx --yes npm@11` ponctuel pour générer le lock (rien d'installé globalement). - **Périmètre** : lock seul, sans relever les planchers de `package.json` (`^7.18.1` et `^4.1.9` résolvent déjà vers les versions corrigées, et `npm ci` ne redescend pas sous le lock). ## Travail à faire - [ ] Brancher depuis `main` à jour (pas depuis une branche de feature). - [ ] Construire la référence avant bump : `npm ci && npm run build`, puis copier `dist/` à l'écart. - [ ] `npx --yes npm@11.21.0 update react-router-dom react-router vitest @vitest/mocker browserslist baseline-browser-mapping nanoid source-map-js --package-lock-only --ignore-scripts` - [ ] Vérifier que `git diff --stat` ne touche que `package-lock.json`, que le compte est de 259 paquets de part et d'autre, et que les versions correspondent à la table ci-dessus. - [ ] `npm ci` (npm 10) : le lock ne doit pas être réécrit. Puis `npm audit` : 0. - [ ] `npm run build` + `npm test`, puis comparer `dist/` avec la référence (`diff -r`). Un écart doit être expliqué avant le merge. - [ ] Docs : remplacer la mention « 2 high `react-router` acceptés en permanence » dans `CLAUDE.md` (section CI/CD, ligne ~165) et `docs/architecture.md` (~487) par « `npm audit` à 0 au <date du commit> (#358) », en gardant la précision qu'aucun `npm audit` ne tourne en CI. Retirer le renvoi à #317. - [ ] CHANGELOG `### Security` / `### Sécurité` sous `[Unreleased]`, dans les deux langues, en précisant qu'aucune de ces advisories n'était atteignable dans l'app livrée. - [ ] Commit `fix(deps): refresh npm lock to clear 7 advisories` avec `Resolves #358` et `Resolves #317`. ## Fichiers concernés - `package-lock.json` : seul fichier de dépendances modifié. - `CLAUDE.md`, `docs/architecture.md` : l'état « 2 high acceptés » devient faux. - `CHANGELOG.md`, `CHANGELOG.fr.md` : entrée Security. - `STATE.md` : le chapeau (« 2 restantes, acceptées ») sera corrigé par la synchro post-merge. ## Surface de test - Existants : la suite vitest complète (elle exerce le runner mis à jour) et `npm run build` (tsc + vite). - Test de régression spécifique : non, bump de dépendances sans changement de code. La preuve est le `diff -r dist/` avant/après. ## Critères d'acceptation - [ ] `npm audit` = 0 sur la branche, après `npm ci` avec npm 10. - [ ] Diff de dépendances limité à `package-lock.json` ; `package.json` inchangé. - [ ] `npm run build` et `npm test` verts, en local et en CI (`check-frontend`). - [ ] Sortie `dist/` identique à la référence, ou écart expliqué dans la PR. - [ ] Docs et CHANGELOG FR/EN à jour ; #317 fermée par la même PR. ## Complexité estimée Simple. --- _Issue créée par /analyse-vulnerabilite, analysée par /analyze le 2026-09-26._ --- ## Dépendances ## Depends on - #376 ## Mise à jour du 2026-10-10 - **Huitième advisory** apparue depuis l'analyse : `source-map-js` 1.2.1 → 1.2.2 (GHSA-68fv-2mgg-jv7q, high, déni de service par offsets de sections indexées ; build seulement, via `vite` → `postcss` et `@tailwindcss/vite` → `@tailwindcss/node`). Ajoutée à la commande. `npm audit` le 2026-10-10 : 8 findings (5 high, 3 moderate). - Vérifié à la revue : la commande ci-dessus sous npm 11 ramène `npm audit` à 0 sur une copie, `package.json` inchangé. - Après #376, la CI tourne sous Node 24, donc npm 11 : le lock est lu par le même npm que celui qui le génère. ## Fichiers concernés (complet) - `package-lock.json` (seul fichier de dépendances modifié) - `CLAUDE.md` (section CI/CD), `docs/architecture.md` (~L487) - `CHANGELOG.md`, `CHANGELOG.fr.md` ## Critères d'acceptation (planification) - [ ] Lock généré avec **`npm@11.21.0`** exactement ; version consignée dans la PR. - [ ] Chaque nouveau `resolved` de `package-lock.json` pointe vers `https://registry.npmjs.org/` et porte un champ `integrity` (vérification scriptée, résultat dans la PR). - [ ] `npm audit` relancé juste avant le commit : « found 0 vulnerabilities », sortie collée dans la PR. Si une nouvelle advisory est apparue entre-temps et se corrige dans la borne déclarée, l'ajouter à la commande ; sinon, la nommer dans la PR sans élargir le périmètre. - [ ] `diff -r dist/` avant/après : identique, ou écart expliqué dans la PR. - [ ] `CLAUDE.md` et `docs/architecture.md` : « `npm audit` à 0 au <date> (#358) », plus de « 2 high acceptés », renvoi à #317 retiré, précision « aucun `npm audit` en CI » gardée. - [ ] CHANGELOG Security / Sécurité (aucune advisory n'était atteignable dans l'app livrée) ; commit avec `Resolves #358` et `Resolves #317`. ## Review caveats - 🟡 SECURITE (résolu) : npm épinglé à une version exacte, `resolved`/`integrity` vérifiés. - 🟢 ARCHITECTURE (résolu) : « 0 » daté, pas présenté comme un état permanent. ## Décisions prises en planification - `npm@11.21.0` (Max, 2026-10-10). - Périmètre : lock seul, planchers de `package.json` inchangés (Max, 2026-09-26, inchangé). ## Spec source `spec-plan-release-deps.md` (local, ignoré par git)
maximus added the
status:ready
type:security
source:defenseur
labels 2026-09-26 12:58:03 +00:00
maximus added this to the planned-2026-10-10-release-deps milestone 2026-10-10 23:22:29 +00:00
maximus added
status:in-progress
and removed
status:ready
labels 2026-10-11 01:00:04 +00:00
maximus added
status:review
and removed
status:in-progress
labels 2026-10-11 01:17:41 +00:00
maximus added
status:approved
and removed
status:review
labels 2026-10-11 23:12:53 +00:00
maximus removed the
status:approved
label 2026-10-12 19:33:43 +00:00
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: maximus/Simpl-Resultat#358
No description provided.