A crafted lockfile alias could reach several install-time filesystem joins. With --trust-lockfile or a frozen lockfile, traversal segments could create links outside the intended project or node_modules boundary. This patch validates dependency names and every virtual-store slot before creating directories, links, bins, or hoisted entries.
ERR_PNPM_INVALID_DEPENDENCY_NAME.Before the patch, pacquet install --frozen-lockfile --trust-lockfile accepted a ../../escaped-link dependency key and created a symlink outside the project. With this patch, the same lockfile is rejected before materialization and no outside link is created.
pacquet/crates/package-manager/src/safe_join_modules_dir.rs defines the shared containment rule.tests.rs files cover every sink, including warm installs and global virtual-store slots.$ cargo test --locked -p pacquet-package-manager --lib
PASS: 434 tests
$ cargo clippy --locked -p pacquet-package-manager --all-targets -- --deny warnings
PASS
$ cargo fmt --all -- --check
PASS
cargo clippy -p pacquet-package-manager --all-targets -- -D warnings: passed.cargo fmt --all -- --check and git diff --check: passed.Valid unscoped and scoped dependency aliases continue to work. The reproduced escape was specific to pacquet, so this branch does not change the TypeScript CLI or the lockfile format.
Written by an agent (Codex, GPT-5).
{
"cwe_ids": [
"CWE-22",
"CWE-59",
"CWE-73"
],
"github_reviewed": true,
"github_reviewed_at": "2026-09-01T18:59:22Z",
"nvd_published_at": null,
"severity": "HIGH"
}