Wysoka

pnpm: A tarball dependency's manifest `name` escapes node_modules → arbitrary file write/overwrite on install

  • Ujawniono: 02.09.2026
  • Aktualizacja: 11.10.2026 10:22

Summary

When resolving a package, pnpm uses the resolved manifest name as a raw path segment for the isolated-linker import target. A tarball dependency whose package.json name is a scoped path traversal (@x/../../…/<abs path>) is therefore extracted outside node_modules, to an attacker-chosen absolute path, and can overwrite existing files there. Attacker controls the destination, filenames, and contents → arbitrary file write → code execution (e.g. ~/.zshrc, .git/hooks/pre-commit, another package's code). Occurs during pnpm install even with --ignore-scripts (no lifecycle scripts run), defeating that safety.

Same class as the just-patched GHSA-hwx4 (transitive-dependency alias traversal) and GHSA-v23m (stage download manifest name/version traversal), in a sink their fixes did not cover: the isolated-linker import target keyed by the resolved name.

Root cause

  • The isolated-linker import target is built with a raw path.join(modules, <resolved name>) in installing/deps-resolver/src/resolvePeers.ts:706, installing/deps-resolver/src/index.ts:614, and deps/graph-builder/src/lockfileToDepGraph.ts:233 — without the safeJoinModulesDir guard used on the symlink/hoisted/bin paths (installing/deps-restorer/src/lockfileToHoistedDepGraph.ts:222). The store location is node_modules/.pnpm/<id>/node_modules/<name>, so a traversal <name> escapes.
  • The only resolve-time name gate (resolving/npm-resolver/src/pickPackage.ts:753) rejects only unscoped names containing /, so a scoped @x/../.. passes.

Steps to reproduce

Self-contained PoC (real pnpm@11.9.0; loopback tarball server; escape target is a throwaway temp dir):

bash
npm i pnpm@11.9.0
# host a tarball whose package.json name = "@x/"+"../".repeat(25)+"<abs>/OUTSIDE"; victim depends on the http URL
pnpm install --ignore-scripts

Confirmed output (repro/poc.mjs, exit 0):

escape dir is outside the project        : true
new file implanted outside node_modules  : true
pre-existing file OVERWRITTEN            : true
*** CONFIRMED: a tarball dependency wrote & overwrote files OUTSIDE the project during `pnpm install --ignore-scripts` ***

Remediation

Route the isolated-linker import-target joins (resolvePeers.ts:706, deps-resolver/index.ts:614, lockfileToDepGraph.ts:233) through safeJoinModulesDir (as the hoisted linker already does), and/or enforce validate-npm-package-name on the resolved manifest name (close the scoped-name gap at pickPackage.ts:753) so the import target rejects a traversal name and re-asserts containment before any write.

Czego dotyczy

Kliknij technologię, aby zobaczyć wszystkie dotyczące jej podatności.

PlatformaPaczkaPodatne wersjePoprawka w wersji
Paczka npm pnpm < 10.34.5, >= 11.0.0, < 11.11.0 10.34.5, 11.11.0

Odnośniki

Ocena CVSS 7.5/10
Wektor CVSS
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:H
Słabość (CWE)
CWE-22, CWE-73, CWE-94
Platforma
npm
Paczka
pnpm
Ujawniono
02.09.2026
Aktualizacja
11.10.2026 10:22

Źródła i licencje

OSV / GitHub Advisory Database - GHSA-vq4v-j7r6-jq4m - CC BY 4.0

Historia podatności: pnpm

Wszystkie opisane podatności tej paczki (Paczka npm), od najnowszej. Widać, czy to jednorazowa wpadka, czy paczka, której trzeba pilnować.

Wszystkie (32) w archiwum
Wszystkich wpisów
32
Pierwsza → ostatnia
03.2022 09.2026
Bez poprawki
0
Wykorzystywana w atakach
0

Rozkład istotności

  • Wysoka 18
  • Średnia 14

Ujawnienia w latach

  1. 2022: 1
  2. 2023: 1
  3. 2024: 1
  4. 2025: 1
  5. 2026: 28
Istotność:
  1. Wysoka · 7.1 CVE-2026-82392 < 10.34.5, >= 11.0.0, < 11.11.0 10.34.5, 11.11.0
  2. pnpm: A tarball dependency's manifest `name` escapes node_modules → arbitrary file write/overwrite on install ten wpis
    Wysoka · 7.5 CVE-2026-82393 < 10.34.5, >= 11.0.0, < 11.11.0 10.34.5, 11.11.0
  3. Wysoka · 7.4 CVE-2026-101043 >= 11.0.0, < 11.11.0, >= 10.7.0, < 10.34.5 11.11.0, 10.34.5
  4. Wysoka · 7.1 ghsa-2rx9-3g3h-c2jv >= 12.0.0-alpha.0, < 12.0.0-alpha.5 12.0.0-alpha.5
  5. Wysoka · 8.2 CVE-2026-59195 < 10.34.4, >= 11.0.0, < 11.8.0 10.34.4, 11.8.0
  6. Wysoka · 7.1 CVE-2026-59194 < 10.34.4, >= 11.0.0, < 11.7.0 10.34.4, 11.7.0
  7. Wysoka · 7.1 CVE-2026-59196 < 10.34.4, >= 11.0.0, < 11.7.0 10.34.4, 11.7.0
  8. Wysoka · 8.8 CVE-2026-55698 < 10.34.2, >= 11.0.0, < 11.5.3 10.34.2, 11.5.3
  9. Wysoka · 7.5 CVE-2026-55697 < 10.34.2, >= 11.0.0, < 11.5.3 10.34.2, 11.5.3
  10. Wysoka · 7.5 CVE-2026-55487 < 10.34.2, >= 11.0.0, < 11.5.3 10.34.2, 11.5.3
  11. Wysoka · 7.3 CVE-2026-50015 < 10.34.0, >= 11.0.0, < 11.4.0 10.34.0, 11.4.0
  12. Wysoka · 8.8 CVE-2026-50016 < 10.34.0, >= 11.0.0, < 11.4.0 10.34.0, 11.4.0
  13. Wysoka · 8.8 CVE-2025-69264 >= 10.0.0, < 10.26.0 10.26.0
  14. Wysoka · 7.5 CVE-2025-69262 >= 6.25.0, < 10.27.0 10.27.0
  15. Wysoka · 7.5 CVE-2023-37478 < 7.33.4, >= 8.0.0, < 8.6.8 7.33.4, 8.6.8
  16. Wysoka · 8.8 CVE-2022-26183 < 6.15.1 6.15.1

Dowiedz się, które podatności dotyczą Twojej aplikacji

Po podłączeniu integracji DockRay i włączeniu raportowania oprogramowania DockRay porównuje zgłoszone wersje komponentów ze znanymi podatnościami i powiadamia o potwierdzonych dopasowaniach. Zakres zależy od obsługiwanej technologii i dostępnych biuletynów.

Podłącz swoją aplikację
Newsletter DockRay

Bezpieczeństwo aplikacji w Twojej skrzynce

Najważniejsze podatności, konkretne zalecenia i praktyczne wskazówki dla Twoich aplikacji. Wybierz technologie i śledź to, co ma znaczenie dla Twojego projektu.

  • Codzienne zestawienie nowych podatności, także krytycznych.
  • Powiadomienia o ważnych aktualizacjach.
  • Praktyczne porady o bezpieczeństwie i monitoringu aplikacji.

Pozostaw puste, aby otrzymywać informacje o wszystkich technologiach.

Zapis jest bezpłatny. Wypiszesz się jednym kliknięciem w wiadomości.