fix(security): resolve brace-expansion + @babel/core via version-scoped overrides #111
No reviewers
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/simpl-liste#111
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-103-babel-brace-overrides"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Fixes #103
Fixes #110
Changements
^1.1.18/^2.1.4/^5.0.9(version-scoped par majeur). DoS (expansion exponentielle + OOM). Debloque #103 : un override blanket cassait le bundler (5.x force sur minimatch@3/@9 attendant l'export par defaut ->TypeError), mais le version-scoping bumpe chaque majeur dans son majeur, preservant le contrat CJS (export defaut 1.x/2.x, nomme 5.x). Verifie :minimatch@3resout (mm("src/foo.js","src/*.js") == true, l'appel qui plantait sous blanket).^7.29.6(resout 7.29.7). GHSA-4x5r-pxfx-6jf8 (arbitrary file read via sourceMappingURL, vuln<=7.29.0).Build/dev-time uniquement, non bundle dans l'APK.
npm audit: 14 -> 12. Smoke test 11/11. Le diff lock est en remplacements 1:1 (102/102) ; le volume vient des ~87 instances dedupees de@babel/core, pas d'un churn parasite.Note technique
Meme mecanisme que la PR #109 (js-yaml) : les overrides version-scoped (
pkg@^N.0.0) ciblent par version installee, contournant deux limites des overrides nestes -- la non-propagation a travers un parent overridde (js-yaml/@expo/cli) et l'ecrasement cross-major d'un blanket (brace-expansion/minimatch).Ce qui reste (irreductible)
#108 image-size (HIGH) reste ouverte : aucun fix publie (derniere 2.0.2 encore vulnerable,
<=2.0.2), bloque upstream. Les 12 HIGH restantes sont 100% sa cascade metro/react-native/expo. Plancher irreductible sans bump du SDK Expo. Re-verifie le 2026-08-12.Review — APPROVE
Override de sécurité propre et ciblé : 2 fichiers touchés (
package.json+package-lock.json), diff lock strictement symétrique (102/102 lignes, 22 bumps de version, aucun nœud de package ajouté ou retiré). Le version-scoping debrace-expansionpar majeur est correct et les bumps@babel/*sont internement cohérents.Vérifié
brace-expansion@^1.0.0→^1.1.18,@^2.0.0→^2.1.4,@^5.0.0→^5.0.9;@babel/core→^7.29.6(non scopé — un seul majeur7.xdans l'arbre, donc pas de risque de clobber cross-major).@babel/*respecte les ranges de ses parents (ex.@babel/core@7.29.7exigecode-frame ^7.29.7→ bumpé à 7.29.7 ;@babel/traverse@7.29.8exigeparser ^7.29.8→ parser à 7.29.8). Les 6 instances debrace-expansion(codegen, top-level, expo, react-native, rimraf, test-exclude) restent chacune dans leur majeur.type:security.Fixescorrect pour les deux.Suggestions (non bloquantes)
TypeError, contrat d'export CJS). Or aucun garde-fou automatisé ne verrouille ça : pas de CI dans ce repo, ettests/smoke.test.cjsne teste pas minimatch. Un futur contributeur qui « simplifie » les 3 lignesbrace-expansionen un seul blanket réintroduirait la casse en silence. Encoder la vérif manuelle du body danssmoke.test.cjs(require('minimatch')('src/foo.js','src/*.js') === true) fermerait ce trou.smoke.test.cjscompte en fait 13check(); « ~87 instances dedupees de @babel/core » — le diff réel = 22 bumps de version pour une seule instance de@babel/core. Le code prime sur la prose ; à aligner si tu veux.brace-expansion@5passe àengines: node "20 || >=22"(18 retiré). Sans impact attendu : build-time, toolchain Expo 54 déjà Node 20+, etenginesest advisory par défaut. À garder en tête si l'env EAS tournait encore sur Node 18.Note
Pas de CI sur ce repo (
.forgejo/workflowsabsent) :npm audit 14→12et le smoke test ne sont validés que localement. Non introduit par cette PR — juste le contexte qui explique pourquoi les claims du body ne sont pas rejouées par une automatisation.Même mécanisme que #109 (js-yaml), pattern éprouvé et vérifié empiriquement par le lock. RAS bloquant.