fix(security): bump undici + js-yaml overrides to patched versions #109

Merged
maximus merged 1 commit from issue-106-107-deps-overrides into master 2026-08-12 01:41:30 +00:00
Owner

Fixes #106
Fixes #107

Changements

  • @expo/cli > undici ^6.27.0 -> ^6.28.0 -- GHSA-8xcm-r25x-g524 / m8rv-5g2x-5cg5 / v3r7-h72x-cjcm (response desync, CRLF & cookie injection, vuln <6.28.0). Re-occurrence de #96.
  • js-yaml -> ^3.15.1 (3.x) + ^4.3.1 (4.x) -- CVE-2026-59870 / GHSA-5p4m-2wfm-xmqj (quadratic CPU !!omap, vuln 3.x<3.15.1 / 4.x<4.3.1). Re-occurrence de #98.

Note technique : nested -> version-scoped pour js-yaml

Les overrides js-yaml passent de parent-scoped (@expo/xcpretty, @istanbuljs/load-nyc-config) a version-scoped (js-yaml@^3.0.0 / js-yaml@^4.0.0). L'instance 4.x est atteinte via @expo/cli, lui-meme overridde : un override neste ne se propage pas a travers un parent overridde (npm laissait js-yaml@4.3.0 invalid malgre l'override ^4.3.1, meme apres rm lock). Le ciblage par version resout independamment du chemin parent et couvre toute instance 3.x/4.x future.

Build/dev-time uniquement, non bundle dans l'APK. npm audit : 16 -> 14. Diff lock limite aux 3 packages bumpes (js-yaml, undici, +argparse re-hoisted meme version). Smoke test 11/11, patch widget reapplique.

Hors scope

  • #108 image-size (HIGH) reste ouverte en suivi : aucun fix publie (toutes versions <=2.0.2 vulnerables, bloque upstream). Entraine les 13 high transitives restantes (cascade metro/react-native), a lever au prochain bump SDK Expo.
  • @babel/core (LOW) sous le seuil MEDIUM.

Hygiene notee (separee)

Le package-lock.json de master est gonfle : un rm lock && npm install le reduit de ~960 lignes. Non traite ici (hors scope securite) -- candidat a une regeneration propre dediee.

Fixes #106 Fixes #107 ## Changements - `@expo/cli > undici` `^6.27.0` -> `^6.28.0` -- GHSA-8xcm-r25x-g524 / m8rv-5g2x-5cg5 / v3r7-h72x-cjcm (response desync, CRLF & cookie injection, vuln `<6.28.0`). Re-occurrence de #96. - `js-yaml` -> `^3.15.1` (3.x) + `^4.3.1` (4.x) -- CVE-2026-59870 / GHSA-5p4m-2wfm-xmqj (quadratic CPU `!!omap`, vuln `3.x<3.15.1` / `4.x<4.3.1`). Re-occurrence de #98. ### Note technique : nested -> version-scoped pour js-yaml Les overrides js-yaml passent de parent-scoped (`@expo/xcpretty`, `@istanbuljs/load-nyc-config`) a version-scoped (`js-yaml@^3.0.0` / `js-yaml@^4.0.0`). L'instance 4.x est atteinte via `@expo/cli`, lui-meme overridde : **un override neste ne se propage pas a travers un parent overridde** (npm laissait `js-yaml@4.3.0` `invalid` malgre l'override `^4.3.1`, meme apres `rm lock`). Le ciblage par version resout independamment du chemin parent et couvre toute instance 3.x/4.x future. Build/dev-time uniquement, non bundle dans l'APK. `npm audit` : 16 -> 14. Diff lock limite aux 3 packages bumpes (js-yaml, undici, +argparse re-hoisted meme version). Smoke test 11/11, patch widget reapplique. ## Hors scope - **#108 image-size** (HIGH) reste ouverte en suivi : aucun fix publie (toutes versions `<=2.0.2` vulnerables, bloque upstream). Entraine les 13 high transitives restantes (cascade metro/react-native), a lever au prochain bump SDK Expo. - **@babel/core** (LOW) sous le seuil MEDIUM. ## Hygiene notee (separee) Le `package-lock.json` de master est gonfle : un `rm lock && npm install` le reduit de ~960 lignes. Non traite ici (hors scope securite) -- candidat a une regeneration propre dediee.
maximus added 1 commit 2026-08-12 00:47:57 +00:00
- @expo/cli > undici ^6.27.0 -> ^6.28.0: GHSA-8xcm-r25x-g524 / m8rv-5g2x-5cg5
  / v3r7-h72x-cjcm (response desync, CRLF & cookie injection; vulnerable <6.28.0)
- js-yaml -> ^3.15.1 (3.x) + ^4.3.1 (4.x): CVE-2026-59870 / GHSA-5p4m-2wfm-xmqj
  (quadratic CPU in !!omap resolution; vulnerable 3.x<3.15.1, 4.x<4.3.1)

js-yaml moved from parent-scoped overrides (@expo/xcpretty,
@istanbuljs/load-nyc-config) to version-scoped ones (js-yaml@^3 / js-yaml@^4):
the 4.x instance is reached via @expo/cli, which is itself overridden, and a
nested override does not propagate through an overridden parent (npm left
js-yaml@4.3.0 "invalid"). Version-scoped targeting resolves it regardless of
the parent path.

Both build/dev-time only, not bundled in the shipped APK. npm audit drops
undici + js-yaml (16 -> 14). Remaining 13 high = image-size + its metro/RN
cascade (upstream-locked, tracked in #108) + @babel/core low. Smoke test green,
widget patch reapplied, lock diff limited to the 3 bumped packages.

Fixes #106
Fixes #107

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
maximus added the
status:review
label 2026-08-12 00:47:58 +00:00
Author
Owner

Verdict : APPROVE

Bump de sécurité propre et complet. Les 3 versions patchées sont présentes dans le lock, sans copie vulnérable résiduelle, et cohérentes avec package.json. Fixes #106 + #107.

Vérifications (arbre complet du lock inspecté, pas seulement le diff)

Lock cohérent avec les overrides :

  • js-yaml 3.15.1 — nested sous @istanbuljs/load-nyc-config (dep ^3.13.1), forcé par l'override version-scoped js-yaml@^3.0.0 → ^3.15.1.
  • js-yaml 4.3.1 — hoisté top-level, consommé par @expo/xcpretty (dep ^4.1.0), forcé par js-yaml@^4.0.0 → ^4.3.1.
  • undici 6.28.0 — install unique top-level, consommé par @expo/cli (dep ^6.18.2), forcé par @expo/cli > undici ^6.28.0.
  • Exactement 2 installs js-yaml + 1 undici dans tout l'arbre — aucune 3.14.x / 3.15.0 / 4.1.x / 4.3.0 / 6.27.0 résiduelle. argparse relocalisé (2.0.1 sous le nouveau js-yaml top-level, 1.0.10 top-level inchangé), versions inchangées.

Migration version-scoped justifiée : le passage de parent-scoped à js-yaml@^N.0.0 couvre toute instance 3.x/4.x indépendamment du chemin parent. L'empirie le confirme — le lock résout bien 3.15.1 et 4.3.1, preuve que npm applique la syntaxe pkg@range.

Pas de conflit direct-dep : ni js-yaml ni undici ne figurent en dependencies/devDependencies, donc aucun risque d'erreur d'override sur dépendance directe.

Surface : deps build/dev-time (Expo CLI, xcpretty, istanbul), non bundlées dans l'APK ; bumps patch-level → risque de régression runtime nul.

Commit : conventionnel, unique, aligné sur le titre. Référence bien #106 + #107.

Suggestions (non bloquantes)

  1. Symétrie undici. undici reste parent-scoped (@expo/cli) alors que js-yaml est passé version-scoped. Ça marche aujourd'hui (undici unique hoisté top-level qui satisfait tous les consommateurs), mais si un futur transitif tire undici nested sous un parent overridé, tu retombes sur le même gap de propagation que la PR décrit pour js-yaml. Version-scoper undici@^6.0.0 fermerait cet angle mort par symétrie — optionnel.
  2. Le nettoyage du lock gonflé (~960 lignes) et #108 image-size (HIGH, bloqué upstream) sont correctement hors scope. RAS.
## Verdict : APPROVE Bump de sécurité propre et complet. Les 3 versions patchées sont présentes dans le lock, sans copie vulnérable résiduelle, et cohérentes avec `package.json`. Fixes #106 + #107. ### Vérifications (arbre complet du lock inspecté, pas seulement le diff) **Lock cohérent avec les overrides :** - `js-yaml 3.15.1` — nested sous `@istanbuljs/load-nyc-config` (dep `^3.13.1`), forcé par l'override version-scoped `js-yaml@^3.0.0 → ^3.15.1`. - `js-yaml 4.3.1` — hoisté top-level, consommé par `@expo/xcpretty` (dep `^4.1.0`), forcé par `js-yaml@^4.0.0 → ^4.3.1`. - `undici 6.28.0` — install unique top-level, consommé par `@expo/cli` (dep `^6.18.2`), forcé par `@expo/cli > undici ^6.28.0`. - Exactement **2 installs js-yaml + 1 undici** dans tout l'arbre — aucune 3.14.x / 3.15.0 / 4.1.x / 4.3.0 / 6.27.0 résiduelle. `argparse` relocalisé (2.0.1 sous le nouveau js-yaml top-level, 1.0.10 top-level inchangé), versions inchangées. **Migration version-scoped justifiée :** le passage de parent-scoped à `js-yaml@^N.0.0` couvre toute instance 3.x/4.x indépendamment du chemin parent. L'empirie le confirme — le lock résout bien 3.15.1 et 4.3.1, preuve que npm applique la syntaxe `pkg@range`. **Pas de conflit direct-dep :** ni `js-yaml` ni `undici` ne figurent en `dependencies`/`devDependencies`, donc aucun risque d'erreur d'override sur dépendance directe. **Surface :** deps build/dev-time (Expo CLI, xcpretty, istanbul), non bundlées dans l'APK ; bumps patch-level → risque de régression runtime nul. **Commit :** conventionnel, unique, aligné sur le titre. Référence bien #106 + #107. ### Suggestions (non bloquantes) 1. **Symétrie undici.** `undici` reste parent-scoped (`@expo/cli`) alors que `js-yaml` est passé version-scoped. Ça marche aujourd'hui (undici unique hoisté top-level qui satisfait tous les consommateurs), mais si un futur transitif tire undici nested sous un parent overridé, tu retombes sur le même gap de propagation que la PR décrit pour js-yaml. Version-scoper `undici@^6.0.0` fermerait cet angle mort par symétrie — optionnel. 2. Le nettoyage du lock gonflé (~960 lignes) et #108 image-size (HIGH, bloqué upstream) sont correctement hors scope. RAS.
maximus merged commit 5aec3b5271 into master 2026-08-12 01:41:30 +00:00
maximus deleted branch issue-106-107-deps-overrides 2026-08-12 01:41:31 +00:00
Sign in to join this conversation.
No reviewers
No milestone
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-liste#109
No description provided.