fix(security): bump @react-navigation/core to 7.22.1 via override #119

Merged
maximus merged 2 commits from issue-117-react-navigation-core-7.22.1 into master 2026-09-26 00:04:07 +00:00
Owner

Fixes #117

Supersedes #118 (closed: blanket npm audit fix broke the build).

Change

  • overrides: "@react-navigation/core": "^7.22.1". Root cause is decode-uri-component <= 0.4.2 (GHSA-vcc3-ghjq-m6fr) reached through query-string; core 7.22.1 no longer depends on query-string.
  • Lock diff: 2 entries only (@react-navigation/core 7.14.0 -> 7.22.1, @react-navigation/routers 7.5.3 -> 7.6.4).
  • tests/smoke.test.cjs: toolchain guards (root resolution of babel-preset-expo and @expo/metro-config/babel-transformer, single Expo SDK major, metro 0.83.x everywhere), core version check, deep link round trip with query params.

Verification

  • npm test: smoke 19/19, feedback 11/11.
  • Mutation: new smoke test replayed on the PR #118 lock (e15dba2) -> the 4 toolchain checks fail (un-hoisted presets, nested Expo 57, metro drift).
  • npx expo export --platform android: OK (Hermes bundle 8.19 MB).
  • npm audit --json: @react-navigation/core gone from .vulnerabilities.

Out of scope (still reported by npm audit)

  • expo-router -> query-string@7 -> decode-uri-component@0.2.2: the only patched version (0.5.0) is ESM-only and cannot be overridden under the CJS query-string@7; expo-router 6.0.24 still depends on query-string ^7. Needs an expo-router / SDK upgrade. Tracked in a follow-up issue.
  • @xmldom/xmldom, js-yaml, postcss-selector-parser: separate findings.

Not tested on device: navigation at runtime (bundle + node-level linking check only).

🤖 Generated with Claude Code

Fixes #117 Supersedes #118 (closed: blanket `npm audit fix` broke the build). ## Change - `overrides`: `"@react-navigation/core": "^7.22.1"`. Root cause is `decode-uri-component <= 0.4.2` (GHSA-vcc3-ghjq-m6fr) reached through `query-string`; core 7.22.1 no longer depends on `query-string`. - Lock diff: 2 entries only (`@react-navigation/core` 7.14.0 -> 7.22.1, `@react-navigation/routers` 7.5.3 -> 7.6.4). - `tests/smoke.test.cjs`: toolchain guards (root resolution of `babel-preset-expo` and `@expo/metro-config/babel-transformer`, single Expo SDK major, metro 0.83.x everywhere), core version check, deep link round trip with query params. ## Verification - `npm test`: smoke 19/19, feedback 11/11. - Mutation: new smoke test replayed on the PR #118 lock (e15dba2) -> the 4 toolchain checks fail (un-hoisted presets, nested Expo 57, metro drift). - `npx expo export --platform android`: OK (Hermes bundle 8.19 MB). - `npm audit --json`: `@react-navigation/core` gone from `.vulnerabilities`. ## Out of scope (still reported by npm audit) - `expo-router` -> `query-string@7` -> `decode-uri-component@0.2.2`: the only patched version (0.5.0) is ESM-only and cannot be overridden under the CJS `query-string@7`; expo-router 6.0.24 still depends on `query-string ^7`. Needs an expo-router / SDK upgrade. Tracked in a follow-up issue. - `@xmldom/xmldom`, `js-yaml`, `postcss-selector-parser`: separate findings. Not tested on device: navigation at runtime (bundle + node-level linking check only). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
maximus added 1 commit 2026-09-25 00:40:48 +00:00
@react-navigation/core <= 7.22.0 depends on query-string, which pulls
decode-uri-component <= 0.4.2 (GHSA-vcc3-ghjq-m6fr, DoS on malformed
percent-encoded input). 7.22.1 parses queries itself and drops the
dependency. A scoped override bumps it without touching anything else:
the lock diff is limited to @react-navigation/core and /routers.

Add smoke-test guards for the failure mode of the superseded PR #118
(blanket npm audit fix): babel-preset-expo and @expo/metro-config must
resolve from the root node_modules, only one Expo SDK major may be
installed, every metro copy must stay on 0.83.x. Replayed against the
PR #118 lock, all four checks fail. Also add a deep link round trip
through getStateFromPath/getPathFromState with query params.

Fixes #117

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
maximus added the
source:human
status:review
type:security
labels 2026-09-25 00:40:59 +00:00
Author
Owner

Revue adversariale — PR #119

Verdict : APPROVE

Résumé : override ciblé et minimal (2 entrées de lock), qui retire query-string de @react-navigation/core sans toucher la chaîne de build ; les gardes de toolchain ajoutées ciblent le mode d'échec réel de #118.

Vérifications faites par le relecteur

  • npm test sur f7b2b51 : smoke vert, feedback 11/11.
  • Mutation (copie hors dépôt, node --preserve-symlinks, @react-navigation/core remplacé par 7.14.0 issu de npm pack) : le check @react-navigation/core is >= 7.22.1 and drops query-string tombe (1 test rouge, « 7.14.0 is vulnerable »). Contrôle avec 7.22.1 dans le même environnement : vert. Arbre du dépôt inchangé après coup.
  • Le round trip deep link reste vert sur 7.14.0 : attendu, c'est un test de non-régression de comportement, pas le garde de la vuln.
  • Compatibilité inter-paquets : @react-navigation/native 7.1.28 déclare core ^7.14.0 (override dans la plage) et fait export * from '@react-navigation/core'. Tous les symboles importés depuis @react-navigation/core par native / native-stack / bottom-tabs / elements existent dans 7.22.1, ainsi que ceux consommés par expo-router via native_1.* (useStateForPath, validatePathConfig, usePreventRemoveContext, etc.).
  • Entrée malformée sur le nouveau parseur de 7.22.1 (?q=%E0%A4%A, ?x=%ZZ) : pas d'exception, la valeur brute est conservée. Les paramètres répétés (?a=1&a=2) donnent toujours un tableau, comme avant avec query-string.
  • Commit conventionnel, Fixes #117 présent dans le message de commit ; le suivi hors périmètre existe (#120, status:blocked).

Suggestions (non bloquantes)

  1. Portée du round trip (tests/smoke.test.cjs, check « deep link round trip ») : l'app ne résout pas ses deep links via @react-navigation/core mais via le fork d'expo-router (expo-router/build/fork/getStateFromPath*.js, qui dépend toujours de query-string@7). Le test couvre core, pas le chemin réel de l'app. Le commentaire du test gagnerait à le préciser, sans quoi on peut le lire comme une couverture des deep links simplliste://task/<id>.
  2. Décalage de version en lockstep : native 7.1.28 / native-stack 7.13.0 / bottom-tabs 7.14.0 ont été publiés contre core 7.14.x ; core passe à 7.22.1 seul. Compatible semver et vérifié à l'export, mais pas à l'exécution. Avant la prochaine release APK, un essai sur appareil (ouverture d'un deep link tâche + navigation onglets/stack) fermerait le seul trou signalé dans le corps de la PR.
  3. Les 4 gardes de toolchain n'ont pas été rejouées par le relecteur contre le lock de #118 (réinstallation complète nécessaire) ; la mutation citée dans le corps de la PR est prise telle quelle.

🤖 Generated with Claude Code

## Revue adversariale — PR #119 **Verdict : APPROVE** **Résumé** : override ciblé et minimal (2 entrées de lock), qui retire `query-string` de `@react-navigation/core` sans toucher la chaîne de build ; les gardes de toolchain ajoutées ciblent le mode d'échec réel de #118. ### Vérifications faites par le relecteur - `npm test` sur `f7b2b51` : smoke vert, feedback 11/11. - **Mutation** (copie hors dépôt, `node --preserve-symlinks`, `@react-navigation/core` remplacé par 7.14.0 issu de `npm pack`) : le check `@react-navigation/core is >= 7.22.1 and drops query-string` tombe (**1 test rouge**, « 7.14.0 is vulnerable »). Contrôle avec 7.22.1 dans le même environnement : vert. Arbre du dépôt inchangé après coup. - Le round trip deep link reste vert sur 7.14.0 : attendu, c'est un test de non-régression de comportement, pas le garde de la vuln. - Compatibilité inter-paquets : `@react-navigation/native` 7.1.28 déclare `core ^7.14.0` (override dans la plage) et fait `export * from '@react-navigation/core'`. Tous les symboles importés depuis `@react-navigation/core` par native / native-stack / bottom-tabs / elements existent dans 7.22.1, ainsi que ceux consommés par `expo-router` via `native_1.*` (`useStateForPath`, `validatePathConfig`, `usePreventRemoveContext`, etc.). - Entrée malformée sur le nouveau parseur de 7.22.1 (`?q=%E0%A4%A`, `?x=%ZZ`) : pas d'exception, la valeur brute est conservée. Les paramètres répétés (`?a=1&a=2`) donnent toujours un tableau, comme avant avec `query-string`. - Commit conventionnel, `Fixes #117` présent dans le message de commit ; le suivi hors périmètre existe (#120, `status:blocked`). ### Suggestions (non bloquantes) 1. **Portée du round trip** (`tests/smoke.test.cjs`, check « deep link round trip ») : l'app ne résout pas ses deep links via `@react-navigation/core` mais via le fork d'`expo-router` (`expo-router/build/fork/getStateFromPath*.js`, qui dépend toujours de `query-string@7`). Le test couvre core, pas le chemin réel de l'app. Le commentaire du test gagnerait à le préciser, sans quoi on peut le lire comme une couverture des deep links `simplliste://task/<id>`. 2. **Décalage de version en lockstep** : native 7.1.28 / native-stack 7.13.0 / bottom-tabs 7.14.0 ont été publiés contre core 7.14.x ; core passe à 7.22.1 seul. Compatible semver et vérifié à l'export, mais pas à l'exécution. Avant la prochaine release APK, un essai sur appareil (ouverture d'un deep link tâche + navigation onglets/stack) fermerait le seul trou signalé dans le corps de la PR. 3. Les 4 gardes de toolchain n'ont pas été rejouées par le relecteur contre le lock de #118 (réinstallation complète nécessaire) ; la mutation citée dans le corps de la PR est prise telle quelle. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
maximus added 1 commit 2026-09-25 23:59:19 +00:00
Refs #117

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
maximus merged commit 53c33e73a4 into master 2026-09-26 00:04:07 +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#119
No description provided.