fix(security): override @expo/cli ws to ^8.20.1 (GHSA-58qx-3vcg-4xpx) (#92) #94

Merged
maximus merged 1 commit from issue-92-ws-override into master 2026-05-31 19:21:23 +00:00
Owner

Fixes #92

Vuln

ws 8.0.0 - 8.20.0 — moderate, "Uninitialized memory disclosure" (GHSA-58qx-3vcg-4xpx). Tiree via expo > @expo/cli > ws@8.20.0.

Fix

Override scope dans package.json :

"overrides": { "@expo/cli": { "ws": "^8.20.1" } }

Seule l'instance 8.x vulnerable est bumpee (resolue en 8.21.0). metro (ws@7.5.10) et react-native (ws@6.2.3) restent sur leur majeur -> pas de risque de casser le dev server Metro. Pas un override blanket "ws" (qui aurait force tout en 8.x).

Exploitabilite

Nulle en prod : tout ws ici est du tooling dev/build (Expo CLI, Metro, react-devtools), absent du bundle APK. L'override sert surtout a garder npm audit a zero et a stopper le re-flag du Defenseur.

Verification

  • npm audit : 0 vulnerabilities (etait 1 moderate)
  • npm ls ws : @expo/cli -> ws@8.21.0 overridden ; 6.2.3 / 7.5.10 intacts
  • root smoke (npm test) : 6/6 OK
  • npm audit fix ne reglait pas (bloque par le pin de @expo/cli sans --force)
Fixes #92 ## Vuln `ws 8.0.0 - 8.20.0` — moderate, "Uninitialized memory disclosure" (GHSA-58qx-3vcg-4xpx). Tiree via `expo > @expo/cli > ws@8.20.0`. ## Fix Override scope dans `package.json` : ```json "overrides": { "@expo/cli": { "ws": "^8.20.1" } } ``` Seule l'instance 8.x vulnerable est bumpee (resolue en **8.21.0**). `metro` (ws@7.5.10) et `react-native` (ws@6.2.3) restent sur leur majeur -> pas de risque de casser le dev server Metro. Pas un override blanket `"ws"` (qui aurait force tout en 8.x). ## Exploitabilite Nulle en prod : tout `ws` ici est du tooling dev/build (Expo CLI, Metro, react-devtools), absent du bundle APK. L'override sert surtout a garder `npm audit` a zero et a stopper le re-flag du Defenseur. ## Verification - `npm audit` : **0 vulnerabilities** (etait 1 moderate) - `npm ls ws` : `@expo/cli` -> ws@8.21.0 overridden ; 6.2.3 / 7.5.10 intacts - root smoke (`npm test`) : 6/6 OK - `npm audit fix` ne reglait pas (bloque par le pin de @expo/cli sans --force)
maximus added 1 commit 2026-05-30 19:05:34 +00:00
npm audit flagged ws 8.0.0-8.20.0 (moderate, uninitialized memory
disclosure) pulled in via expo > @expo/cli > ws@8.20.0. Scope the
override to @expo/cli so only the vulnerable 8.x instance is bumped
(resolved to 8.21.0); metro's ws@7.5.10 and react-native's ws@6.2.3
stay on their majors to avoid breaking the Metro dev server.

All ws here is dev/build tooling (Expo CLI, Metro, react-devtools),
absent from the shipped APK, so this was not exploitable in production
- but the override clears npm audit and stops the Defenseur re-flagging.

npm audit: 0 vulnerabilities. Root smoke green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
maximus added the
status:review
type:security
labels 2026-05-30 19:05:34 +00:00
Author
Owner

Review adversariale — APPROVE

Verdict : APPROVE (override scope, surgical, aucun blocage)

Resume

Override de dependance bien cible : bumpe la seule instance ws@8.20.0 vulnerable (sous @expo/cli) vers 8.21.0, resout GHSA-58qx-3vcg-4xpx sans toucher les arbres ws 6.x/7.x utilises par Metro et react-native. Toutes les affirmations du corps de la PR sont verifiees contre la branche.

Verifications effectuees

  • Diff exact : l'unique commit de la branche (9ee5372) touche exactement package.json + package-lock.json — correspond au diff fourni (confirme via diff 3-points).
  • Les 4 instances ws du lockfile auditees :
Chemin Version Plage vuln 8.0.0–8.20.0 ?
@react-native/dev-middleware/.../ws 6.2.3 non
expo/node_modules/ws (cible) 8.21.0 non (corrige)
react-native/node_modules/ws 6.2.3 non
node_modules/ws (hoisted/metro) 7.5.10 non

Aucune ne reste dans la plage vulnerable ; l'override scope a frappe uniquement l'instance 8.x.

  • Override scope, pas blanket : @expo/cli -> ws, donc impossible de force-downgrade/upgrade les arbres 6.x/7.x. La promesse « ne casse pas Metro » tient.
  • Coherence versions : package.json / lockfile / app.json tous a 1.6.4, versionCode 16. JSON valide.
  • Securite : aucun secret, aucune migration, aucun code runtime touche. Tout ws ici est du tooling dev/build, absent du bundle APK -> exploitabilite prod nulle, comme indique.

Notes non bloquantes (aucune action requise)

  1. Le bloc overrides n'est pas serialise dans la racine du lockfile (packages[""]). Verifie comme comportement pre-existant et coherent : master a deja 4 overrides (esbuild, xmldom, uuid, postcss) et aucun n'apparait dans la racine non plus. L'override est correctement reflete par la version resolue dans l'arbre. Pas une regression.
  2. La branche est 3 commits derriere master (PR #90/#93 + state sync). Elle ne touche ni STATE.md ni ThemeToggle.tsx -> merge propre, mergeable: true exact, pas de conflit sur la version 1.6.4 partagee. Rebase optionnel (historique lineaire) mais non requis.
  3. Le smoke test (tests/smoke.test.cjs) n'asserte rien de specifique a ws — c'est un check generique JSON/uuid. Un test ws-specifique exigerait de demarrer Expo CLI/Metro (hors scope d'un smoke node pur), donc acceptable pour un override de tooling dev.
## Review adversariale — APPROVE **Verdict : APPROVE** (override scope, surgical, aucun blocage) ### Resume Override de dependance bien cible : bumpe la seule instance `ws@8.20.0` vulnerable (sous `@expo/cli`) vers `8.21.0`, resout GHSA-58qx-3vcg-4xpx sans toucher les arbres `ws` 6.x/7.x utilises par Metro et react-native. Toutes les affirmations du corps de la PR sont verifiees contre la branche. ### Verifications effectuees - **Diff exact** : l'unique commit de la branche (`9ee5372`) touche exactement `package.json` + `package-lock.json` — correspond au diff fourni (confirme via diff 3-points). - **Les 4 instances `ws` du lockfile auditees** : | Chemin | Version | Plage vuln 8.0.0–8.20.0 ? | |---|---|---| | `@react-native/dev-middleware/.../ws` | 6.2.3 | non | | `expo/node_modules/ws` (cible) | **8.21.0** | non (corrige) | | `react-native/node_modules/ws` | 6.2.3 | non | | `node_modules/ws` (hoisted/metro) | 7.5.10 | non | Aucune ne reste dans la plage vulnerable ; l'override scope a frappe uniquement l'instance 8.x. - **Override scope, pas blanket** : `@expo/cli` -> `ws`, donc impossible de force-downgrade/upgrade les arbres 6.x/7.x. La promesse « ne casse pas Metro » tient. - **Coherence versions** : `package.json` / lockfile / `app.json` tous a 1.6.4, `versionCode` 16. JSON valide. - **Securite** : aucun secret, aucune migration, aucun code runtime touche. Tout `ws` ici est du tooling dev/build, absent du bundle APK -> exploitabilite prod nulle, comme indique. ### Notes non bloquantes (aucune action requise) 1. Le bloc `overrides` n'est pas serialise dans la racine du lockfile (`packages[""]`). Verifie comme comportement pre-existant et coherent : master a deja 4 overrides (esbuild, xmldom, uuid, postcss) et aucun n'apparait dans la racine non plus. L'override est correctement reflete par la version resolue dans l'arbre. **Pas une regression.** 2. La branche est 3 commits derriere master (PR #90/#93 + state sync). Elle ne touche ni STATE.md ni ThemeToggle.tsx -> merge propre, `mergeable: true` exact, pas de conflit sur la version 1.6.4 partagee. Rebase optionnel (historique lineaire) mais non requis. 3. Le smoke test (`tests/smoke.test.cjs`) n'asserte rien de specifique a `ws` — c'est un check generique JSON/uuid. Un test `ws`-specifique exigerait de demarrer Expo CLI/Metro (hors scope d'un smoke node pur), donc acceptable pour un override de tooling dev.
maximus merged commit 158204b938 into master 2026-05-31 19:21:23 +00:00
maximus deleted branch issue-92-ws-override 2026-05-31 19:21:24 +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#94
No description provided.