Skip to content

fix(arborist): contain lockfile patch path in reify applyPatch - #9886

Open
ubeddulla wants to merge 1 commit into
npm:latestfrom
ubeddulla:reify-patch-path-containment
Open

fix(arborist): contain lockfile patch path in reify applyPatch#9886
ubeddulla wants to merge 1 commit into
npm:latestfrom
ubeddulla:reify-patch-path-containment

Conversation

@ubeddulla

Copy link
Copy Markdown
Contributor

reify's #applyPatch reads node.patched.path with resolve(this.path, patchPath) but only re-checks integrity, not that the path stays inside the project. node.patched is loaded verbatim from package-lock.json (load-virtual sets patched: sw.patched), and when reify runs on a pre-built ideal tree from loadVirtual the buildIdealTree short-circuit skips resolvePatchedDependencies, so a crafted lockfile path like ../../escape.patch reaches this readFile and is read from outside the project root. The sibling patched-dependencies.js readPatch already guards this exact value; #applyPatch's own comment says it re-validates here too but only checks integrity. Add the same relative/startsWith('..')/isAbsolute containment check before the read so an out-of-project patch path throws EPATCHUNSAFE, with a regression test that drives the lockfile-sourced flow.

@ubeddulla
ubeddulla requested review from a team as code owners August 17, 2026 09:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant