[Sécurité] decode-uri-component <=0.4.2 via expo-router -> query-string@7 (inatteignable, risque accepté) #120

Closed
opened 2026-09-25 00:40:59 +00:00 by maximus · 1 comment
Owner

Contexte

npm audit signale decode-uri-component <= 0.4.2 (GHSA-vcc3-ghjq-m6fr, moderate, DoS par decodage exponentiel d'une entree percent-encodee malformee) par la chaine :

expo-router@6.0.23 -> query-string@7.1.3 -> decode-uri-component@0.2.2

Finding residuel apres #117 / PR #119.

Diagnostic (2026-09-27)

Code vulnerable inatteignable

  • Dans query-string@7, decode-uri-component n'est appele que par la fonction interne decode(), utilisee par parse(), parseUrl() et les helpers derives (pick, exclude, stringifyUrl).
  • expo-router n'utilise que queryString.stringify() (build/fork/getPathFromState.js:276, build/fork/getPathFromState-forks.js:71), qui encode via strict-uri-encode et n'appelle jamais decode().
  • Le seul queryString.parse() du fork (build/fork/getStateFromPath.js:538) est commente.
  • Le code applicatif (app/, src/) n'importe ni query-string ni decode-uri-component.

Les deep links et URLs parsees par expo-router ne passent donc pas par le code vulnerable.

Pas d'issue par upgrade

  • Toutes les versions publiees d'expo-router gardent query-string ^7.1.3 : 55.0.18 (sdk-55), 56.2.21 (sdk-56), 57.0.23 (sdk-57, latest), 58.0.8 (next).
  • decode-uri-component@0.5.0, seule version corrigee, est ESM-only ("type": "module"). query-string@7 la charge par require(), donc un override casserait le module au chargement.
  • query-string@8+ est ESM-only aussi : pas d'override possible cote expo-router.

Decision

Risque accepte, issue fermee. Le finding npm audit reste visible (moderate).

Conditions de reouverture

  • expo-router se met a appeler queryString.parse() / parseUrl() (a verifier a chaque bump d'expo-router : grep -rn "queryString\." node_modules/expo-router/build --include=*.js) ;
  • ou le code applicatif importe query-string directement.
## Contexte `npm audit` signale `decode-uri-component <= 0.4.2` (GHSA-vcc3-ghjq-m6fr, moderate, DoS par decodage exponentiel d'une entree percent-encodee malformee) par la chaine : `expo-router@6.0.23` -> `query-string@7.1.3` -> `decode-uri-component@0.2.2` Finding residuel apres #117 / PR #119. ## Diagnostic (2026-09-27) ### Code vulnerable inatteignable - Dans `query-string@7`, `decode-uri-component` n'est appele que par la fonction interne `decode()`, utilisee par `parse()`, `parseUrl()` et les helpers derives (`pick`, `exclude`, `stringifyUrl`). - expo-router n'utilise que `queryString.stringify()` (`build/fork/getPathFromState.js:276`, `build/fork/getPathFromState-forks.js:71`), qui encode via `strict-uri-encode` et n'appelle jamais `decode()`. - Le seul `queryString.parse()` du fork (`build/fork/getStateFromPath.js:538`) est commente. - Le code applicatif (`app/`, `src/`) n'importe ni `query-string` ni `decode-uri-component`. Les deep links et URLs parsees par expo-router ne passent donc pas par le code vulnerable. ### Pas d'issue par upgrade - Toutes les versions publiees d'expo-router gardent `query-string ^7.1.3` : 55.0.18 (sdk-55), 56.2.21 (sdk-56), 57.0.23 (sdk-57, latest), 58.0.8 (next). - `decode-uri-component@0.5.0`, seule version corrigee, est ESM-only (`"type": "module"`). `query-string@7` la charge par `require()`, donc un override casserait le module au chargement. - `query-string@8+` est ESM-only aussi : pas d'override possible cote expo-router. ## Decision Risque accepte, issue fermee. Le finding `npm audit` reste visible (moderate). ## Conditions de reouverture - expo-router se met a appeler `queryString.parse()` / `parseUrl()` (a verifier a chaque bump d'expo-router : `grep -rn "queryString\." node_modules/expo-router/build --include=*.js`) ; - ou le code applicatif importe `query-string` directement.
maximus added the
status:blocked
type:security
source:human
labels 2026-09-25 00:40:59 +00:00
Author
Owner

Analyse (/analyze) : la premisse du corps initial ne tient pas sur deux points.

  1. Pas d issue par un bump de SDK : toutes les versions d expo-router publiees (55.0.18, 56.2.21, 57.0.23, 58.0.8) dependent encore de query-string ^7.1.3.
  2. Exposition surestimee : expo-router n appelle que queryString.stringify(), qui ne passe jamais par decode-uri-component. Le seul queryString.parse() du fork (getStateFromPath.js:538) est commente. Les deep links ne touchent donc pas le code vulnerable.

Corps reecrit en consequence, issue fermee en risque accepte.

Corps d origine

Residual finding after #117 / PR #119.

npm audit still reports decode-uri-component <= 0.4.2 (GHSA-vcc3-ghjq-m6fr, moderate, DoS via exponential decoding of malformed percent-encoded input) through:

expo-router@6.0.23 -> query-string@7.1.3 -> decode-uri-component@0.2.2

Why it is not fixed by an override

  • The only patched version is decode-uri-component@0.5.0, which is ESM-only ("type": "module"). query-string@7 loads it with require(), so an override would break expo-router's URL parsing.
  • expo-router@6.0.24 (latest 6.0.x) still depends on query-string ^7.1.3.

Way out

Upgrade expo-router to a release that drops query-string@7 (likely comes with an Expo SDK bump). Re-check the dependency chain at the next SDK upgrade.

Exposure

Local app, input = deep link / URL strings parsed by expo-router. Impact limited to a hang of the app on a crafted link.

Analyse (/analyze) : la premisse du corps initial ne tient pas sur deux points. 1. **Pas d issue par un bump de SDK** : toutes les versions d expo-router publiees (55.0.18, 56.2.21, 57.0.23, 58.0.8) dependent encore de `query-string ^7.1.3`. 2. **Exposition surestimee** : expo-router n appelle que `queryString.stringify()`, qui ne passe jamais par `decode-uri-component`. Le seul `queryString.parse()` du fork (`getStateFromPath.js:538`) est commente. Les deep links ne touchent donc pas le code vulnerable. Corps reecrit en consequence, issue fermee en risque accepte. <details><summary>Corps d origine</summary> Residual finding after #117 / PR #119. `npm audit` still reports `decode-uri-component <= 0.4.2` (GHSA-vcc3-ghjq-m6fr, moderate, DoS via exponential decoding of malformed percent-encoded input) through: `expo-router@6.0.23` -> `query-string@7.1.3` -> `decode-uri-component@0.2.2` ## Why it is not fixed by an override - The only patched version is `decode-uri-component@0.5.0`, which is ESM-only (`"type": "module"`). `query-string@7` loads it with `require()`, so an override would break expo-router's URL parsing. - `expo-router@6.0.24` (latest 6.0.x) still depends on `query-string ^7.1.3`. ## Way out Upgrade expo-router to a release that drops `query-string@7` (likely comes with an Expo SDK bump). Re-check the dependency chain at the next SDK upgrade. ## Exposure Local app, input = deep link / URL strings parsed by expo-router. Impact limited to a hang of the app on a crafted link. </details>
maximus changed title from [Sécurité] decode-uri-component <=0.4.2 via expo-router -> query-string@7 (needs SDK upgrade) to [Sécurité] decode-uri-component <=0.4.2 via expo-router -> query-string@7 (inatteignable, risque accepté) 2026-09-27 19:41:12 +00:00
maximus removed the
status:blocked
label 2026-09-27 19:41:13 +00:00
Sign in to join this conversation.
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#120
No description provided.