pnpm 11.7 bringt `frozenStore` für Read-Only-Dateisysteme, lässt pacquet Abhängigkeiten auflösen und schließt einen Lockfile-Path-Traversal

pnpm 11.7 bringt `frozenStore` für Read-Only-Dateisysteme, lässt pacquet Abhängigkeiten auflösen und schließt einen Lockfile-Path-Traversal

lschvn

pnpm 11.7.0 erschien am 15. Juni 2026, vier Tage nach dem 11.6.0-Security-Release, der die .npmrc-Umgebungsvariablen-Expansions-Schwachstelle (GHSA-3qhv-2rgh-x77r) behoben hat. Die 11.7-Linie setzt die 11.6-Geschichte zur Härtung der Supply Chain fort und ergänzt drei Features, die verändern, wie Teams pnpm in containerisierten und reproduzierbaren Build-Umgebungen betreiben: einen --frozen-store-Install-Modus für Read-Only-Dateisysteme, die vollständige Delegation der Abhängigkeitsauflösung an den pacquet-Rust-Port und einen optionalen Batch-Modus für pnpm publish --recursive. Dazu kommt ein echter Lockfile-Security-Fix, der einen Path-Traversal-Edge-Case schließt, den die Retrospektive zum npm-Supply-Chain-Angriff im Juni 2026 als wiederkehrende Bug-Klasse im gesamten Ökosystem markiert hat.

frozenStore: Installs gegen einen Read-Only-Package-Store

Das Top-Feature von 11.7 ist frozenStore (Config-Key) und --frozen-store (CLI-Flag), ein Install-Modus für Umgebungen, in denen der Package-Store auf einem Read-Only-Dateisystem liegt: einem Nix-Store, einem OCI-Image-Layer, einem Read-Only-Bind-Mount oder einem dm-verity-Rootfs. Die index.db des Stores wird mit der immutable=1-URI geöffnet, was die WAL/-shm-Sidecar-Erstellung umgeht, die auf einem Read-Only-Verzeichnis sonst mit EROFS scheitern würde. Jeder Store-Schreibpfad wird unterdrückt: der index.db-Writer, der Projekt-Registry-Write, der Side-Effects-Cache und das chmod, das eine Bin-Datei normalerweise ausführbar macht, wenn sie eine Read/Write-Grenze überschreitet.

Die vorgesehene Kombination ist --offline --frozen-lockfile --frozen-store gegen einen vollständig befüllten Store. Unter dem Global Virtual Store (Standard seit 9.x) leben die Package-Verzeichnisse innerhalb des Stores. Fehlt im Store das Build-Output eines Pakets, dessen Lifecycle-Skripte genehmigt sind (oder das einen pnpm-Patch hat), schlägt pnpm früh mit ERR_PNPM_FROZEN_STORE_NEEDS_BUILD fehl, statt mitten im Build auf einem Read-Only-Write abzustürzen. Fehlt dem Store sein Content-Verzeichnis vollständig, schlägt der Install schnell mit ERR_PNPM_FROZEN_STORE_INCOMPLETE fehl, statt zu versuchen, ihn zu initialisieren.

Zwei harte Einschränkungen sind zu beachten. Die immutable=1-URI benötigt Node.js 22.15.0, 23.11.0 oder 24.0.0 oder neuer; auf älteren Runtimes schlägt --frozen-store mit dem klaren Fehler ERR_PNPM_FROZEN_STORE_UNSUPPORTED_NODE fehl. Und --frozen-store ist inkompatibel mit --force und mit einem konfigurierten pnpr-Server, da beide in den Store schreiben. Bin-Linking toleriert ebenfalls einen Read-Only-Store: Unter dem Global Virtual Store lebt die Bin-Quelle eines Pakets innerhalb des Stores, also würde das chmod, das sie ausführbar macht, abgelehnt. Bei EPERM/EACCES oder bei EROFS auf einem wirklich Read-Only-Dateisystem überspringt pnpm das chmod nun, wenn die Bin-Quelle bereits ausführbar ist und einen normalisierten Shebang hat, und wirft andernfalls weiterhin einen Fehler. Das chmod ist redundant, wenn der Seed seine Bin-Dateien bereits ausführbar ausliefert.

Das Ergebnis ist ein vollständig reproduzierbarer Install, der als einzelnes Artefakt zwischengespeichert und über CI, lokale Entwicklung und Produktion hinweg wiederverwendet werden kann, ohne Schreibzugriff auf den Store. Für Nix- und OCI-Nutzer ist dies das fehlende Puzzleteil: pnpm 11.6 war in diesen Umgebungen bereits nutzbar, aber jeder Install versuchte ein WAL-chmod oder einen shm-Sidecar-Write, der entweder fehlschlug oder auf einen langsameren Code-Pfad zurückfiel. 11.7 macht den Read-Only-Fall zum expliziten, unterstützten Modus.

pacquet löst nun Abhängigkeiten auf, nicht nur die Materialisierung

Das zweite Feature ist ein Meilenstein für den pacquet-Rust-Port von pnpm: Die Abhängigkeitsauflösung reiht sich in die Menge der Operationen ein, die pacquet End-to-End ausführen kann. Das neue Verhalten ist über configDependencies opt-in: Wenn pacquet in configDependencies deklariert ist und die installierte Version mindestens 0.11.7 ist, wird ein normaler Non-Frozen-Install (isolierter nodeLinker, einfaches pnpm install) in einem Durchgang an pacquet delegiert. pacquet liest die Manifeste, schreibt pnpm-lock.yaml und erstellt node_modules. pnpm erkennt die Fähigkeit anhand der installierten pacquet-Version; ältere Releases behalten die Trennung Auflösung-dann-Materialisierung.

pnpm add, pnpm update und pnpm remove lösen weiterhin in pnpm selbst auf, da diese Befehle die Manifeste mutieren müssen, bevor eine Auflösung stattfinden kann. Nach der Manifest-Mutation materialisiert pacquet. Das Lockfile-Format ändert sich nicht. Es bleibt eine optionale Vorschau der Rust-Install-Engine, verfolgt unter #11723. Für Projekte, die pacquet bereits im Frozen-Install-Modus betreiben, ist die Änderung unsichtbar: Auflösung und Materialisierung sind bereits ein einziger pacquet-Aufruf. Für Projekte, die noch auf der Node.js-Install-Engine laufen, ist das Upgrade ein No-Op, solange pacquet nicht in configDependencies steht.

Ablehnung von Path-Traversal- und reservierten Aliassen aus dem Lockfile

Der dritte Kernpunkt ist ein Security-Fix im Lockfile-Verifizierer. Vor 11.7 konnte ein Angreifer, der einen Lockfile-Eintrag kontrollieren konnte (ein bösartiges Postinstall, ein manipuliertes CI-Artefakt, ein vergifteter Resolved-Spec einer Peer-Dependency) einen Abhängigkeits-Alias auf einen Path-Traversal-String (../../../escape) oder einen reservierten Namen (.bin, .pnpm, node_modules) setzen. Unter nodeLinker: hoisted wurde der Alias direkt unter node_modules eingehängt, sodass Package-Dateien außerhalb des Install-Roots geschrieben oder das pnpm-Layout überschrieben werden konnte. Die Exploit-Klasse ist dieselbe, die der Windows-Path-Traversal in esbuild 0.28.1 (GHSA-g7r4-m6w7-qqqr) und der Axios-npm-Supply-Chain-Angriff vom März 2026 jeweils in einem anderen Tool offengelegt haben.

Der 11.7-Fix fügt zwei Schichten hinzu. Der hoisted-Graph-Builder validiert nun jeden Alias am Verzeichnis-Sink (safeJoinModulesDir), was der Validierung entspricht, die pnpm bereits für aus Manifesten stammende Aliasse durchgeführt hat. Und das Lockfile-Verifikations-Gate (verifyLockfileResolutions) führt eine immer aktive, policy-unabhängige Prüfung aus, die jeden Importer- oder Snapshot-Abhängigkeits-Alias zurückweist, der kein gültiger Package-Name ist, und den Install früh abbricht, vor jedem Fetch oder Dateisystem-Zugriff, für jeden Node-Linker gleichzeitig. Die Prüfung ist konservativ: Jeder Alias, der syntaktisch kein gültiger Package-Name ist (kein /, kein .., keine reservierten Segmente), wird mit einem klaren Fehler abgelehnt.

Für ein normales Projekt ist der praktische Effekt, dass ein bestehendes Lockfile weiterhin wie zuvor installiert wird, und ein Lockfile mit einem Path-Traversal- oder reservierten Alias (was ein zuvor präparierter Angriff wäre, kein normaler Eintrag) den Install nun mit einem klaren Fehler abbricht. Der Fix ändert das Lockfile-Format nicht. Es ist die Art von Defense-in-Depth, die bereits der .npmrc-Advisory in 11.6.0 verkörperte: Ein Projekt, das seiner Lockfile-Quelle bereits vertraut, profitiert dennoch vom Verifizierer, da dieser vor Bugs im Lockfile-Generator und vor teilweiser Korruption schützt.

--batch für pnpm publish --recursive

Das vierte Feature ist klein, aber praktisch: pnpm publish --recursive --batch sendet alle ausgewählten Pakete in einer einzigen PUT /-/pnpm/v1/publish-Anfrage an die Registry, statt einer Anfrage pro Paket. Die Ziel-Registry muss den Batch-Publish-Endpoint implementieren (pnpr tut das); Registries, die das nicht tun, werden mit einem klaren ERR_PNPM_BATCH_PUBLISH_UNSUPPORTED-Fehler gemeldet. Der Batch wird von pnpr All-or-Nothing verarbeitet: Scheitert die Validierung eines Pakets im Batch, wird keines der Pakete veröffentlicht. Für Monorepos, die N Pakete pro Release veröffentlichen, ist der Wand-Zeit-Gewinn bei pnpm publish --recursive ungefähr Nx.

Weitere Fixes für den Arbeitsalltag

Das 11.7-Release behebt zudem mehrere Korrektheits- und Regressions-Bugs, die seit 11.6 offen waren. Am auffälligsten ist eine Windows-Regression in pnpm add, die Cannot destructure property 'manifest' of 'manifestsByPath[rootDir]' as it is undefined erzeugte, wenn man außerhalb eines Workspaces lief; die Ursache war, dass selectProjectByDir den ProjectsGraph nach opts.dir statt nach project.rootDir schlüsselte, sodass nachgelagerte manifestsByPath-Lookups fehlschlugen, wenn sich die beiden Pfade unterschiedlich normalisierten (typischerweise die Groß-/Kleinschreibung des Laufwerksbuchstabens). Der Befehl pnpm patch-remove entfernt keine Dateien mehr außerhalb des konfigurierten Patches-Verzeichnisses. pnpm publish respektiert nun strictSsl: false für selbstsignierte Zertifikate auf die gleiche Weise wie pnpm install. Git-Dependencies, die auf ein Unterverzeichnis eines Repositorys zeigen (repo#commit&path:/sub/dir), behalten ihren path im Lockfile wieder, nach einer Integritäts-Pin-Regression in 11.6. Und die Auflösung geteilter Package-Kinder ist nun deterministisch, wenn dasselbe Paket über mehrere Kontexte erreicht wird, was eine Klasse von „missing peer"-Reports (#12358) behebt, bei denen das Request-Timing den Kind-Kontext entschied.

Die interaktiven Prompts von pnpm update -i und pnpm audit --fix -i haben ebenfalls einen UX-Fix erhalten: Die Zusammenfassungszeile nach dem Drücken von Enter druckte zuvor die vollständige Tabellenzeile jeder ausgewählten Auswahl (Label, aktuelle/Ziel-Versionen, Workspace, URL), mit Kommas verbunden, was eine Textwand erzeugte. Die Zusammenfassung listet nun nur die ausgewählten Package-Namen (oder Vulnerability-Keys) auf. Das ist eine Kleinigkeit, aber genau die Art von Polish, die ein 11.7-Minor-Release von einem 11.6-Patch unterscheidet.

Häufig gestellte Fragen

Astro 7.0.0-beta.4 macht Sätteri zum Standard-Markdown-Prozessor und führt erweitertes Routing, benutzerdefinierten Logger und gestreamtes Rendering als stabil

Astro 7.0.0-beta.4 (15. Juni 2026) aktiviert die Rust-basierte Sätteri-Markdown-Pipeline standardmäßig, entfernt das experimentelle Flag von erweitertem Routing, benutzerdefiniertem Logger und der neuen Rendering-Engine, löscht die veralteten CLI-Befehle astro db/login/logout/link/init und übernimmt den in alpha.2 eingeführten Dev-Server-Hintergrundmodus als Standard in Agentenkontexten.

Google Clouds Open Knowledge Format ist ein Standard, kein Produkt: Ein Deep Dive in OKF v0.1

Am 12. Juni 2026 hat Google Cloud das Open Knowledge Format (OKF) veröffentlicht, eine offene Spezifikation, die das LLM-Wiki-Pattern in ein portables, interoperables Format bringt: ein Verzeichnis aus Markdown-Dateien mit YAML-Frontmatter, ein einziges Pflichtfeld (type), fünf empfohlene Felder und null vorgeschriebene Tooling. Der Tweet von Google Cloud Tech am 16. Juni generierte 117.000 Aufrufe in 24 Stunden und machte die Spezifikation zur meistdiskutierten Wissensformat-Ankündigung des Jahres. Dieser Long Read geht die v0.1-Spezifikation Abschnitt für Abschnitt durch, die Designentscheidungen, die sie bewusst minimal halten, das, was Google parallel ausliefert (einen Enrichment-Agent für BigQuery, einen statischen HTML-Visualizer, drei Beispiel-Bundles und eine native BigQuery-Knowledge-Catalog-Integration), und die offene Frage, die jeder KI-Agent-Builder und jedes Datenplattform-Team in den nächsten sechs Monaten verfolgen sollte.

Verwandte Artikel

Weitere Berichterstattung zu ähnlichen Themen und Tags.

Claude Code Bug #74066: Nutzer Melden Cross-Workspace-Kontext-Leaks auf Sonnet 5, Anthropic Hat Noch Nicht Antwortet
security

Claude Code Bug #74066: Nutzer Melden Cross-Workspace-Kontext-Leaks auf Sonnet 5, Anthropic Hat Noch Nicht Antwortet

Ein offener Bug, der am 2026-07-04 gegen Claude Code von einem [Enterprise-ZDR](https://docs.anthropic.com/en/docs/build-with-claude/zero-data-retention)-Nutzer eingereicht wurde, beschreibt eine Arbeitssitzung auf Sonnet 5, die plötzlich auf einen unrelated Minecraft-Tempelbau referenziert und dann im Recap bei der falschen Aufgabe bleibt. Der Reporter (GitHub: [@milesrichardson-edb](https://github.com/milesrichardson-edb), Issue [anthropics/claude-code#74066](https://github.com/anthropics/claude-code/issues/74066)) ist auf Enterprise Zero Data Retention, dem Tier, das Anthropic speziell als sitzungsisoliert vermarktet. Ein Triage auf der lokalen Sitzungs-JSONL des Reporters unter `~/.claude/projects/<encoded-cwd>/<session-id>.jsonl` zeigt, dass der geleakte Text nicht im Transkript enthalten ist, was einen lokalen Kontext-Leak durch Datei-Überlappung ausschließt. Vier andere Nutzer in den Kommentaren (mit Arbeitsgeschichten, die bis ins letzte Jahr zurückreichen) beschreiben nahezu identisches Verhalten über Claude Code, Claude Mobile und Claude Deep Research hinweg. Der plausibelste architektonische Fit ist geteilter KV-Cache-Zustand in der Inferenz ([laut @yv3nne in den Kommentaren](https://github.com/anthropics/claude-code/issues/74066#issuecomment-4880448776)), aber kein Anthropic-Ingenieur hat die Issue in den 22 Stunden seit der Einreichung kommentiert, und die Issue erreichte am 2026-07-04 die Spitze von [Hacker News](https://news.ycombinator.com/item?id=42481789). Der Ton im Thread ist gespalten: Die Hälfte vermutet echte Plattform-Cache-Wiederverwendung, die andere Hälfte vermutet eine [sonnet-5-spezifische Halluzination, ausgelöst durch einen Pygments-Lexer](https://github.com/anthropics/claude-code/issues/74066#issuecomment-4880334711). Beide Lesarten sind glaubwürdig.
Oxlint v1.72 und Oxfmt v0.57 liefern den crates-v0.138-Zyklus aus, vereinheitlichen den AstBuilder und entfernen den Prettier-Fallback für CSS/GraphQL
tooling

Oxlint v1.72 und Oxfmt v0.57 liefern den crates-v0.138-Zyklus aus, vereinheitlichen den AstBuilder und entfernen den Prettier-Fallback für CSS/GraphQL

Oxlint apps_v1.72.0 und oxfmt apps_v0.57.0, beide am 2026-06-29 veröffentlicht, schließen den v0.138-Zyklus ab, der in den [v1.71-Versionsnotizen](/articles/2026-06-23--oxlint-v1-71-oxfmt-v0-56) vorausgesagt wurde. Das crates-Release (crates_v0.138.0, ebenfalls 2026-06-29) vereinheitlicht die alten und neuen AstBuilder-APIs (#23876, #23834, #23831, mit den Legacy-Methoden als `#[deprecated]` markiert), benennt `AllocatorAccessor` in `GetAllocator` um und lässt dessen `allocator`-Methode `&self` annehmen (#23675, #23676), lässt `Str`- und `Ident`-Methoden `&GetAllocator` annehmen (#23781), fügt `transformer_plugins: Support typeof define keys` für vue-i18n und ähnliche Makros hinzu (#23605, Alexander Lichter) und liefert die herausragende Performance-Eintragung des Zyklus: `minifier: memoize value_type to remove its O(n^2) re-walk on long binary chains` (#23929, Dunqing), die eine arithmetische Additionskette mit 20 000 Gliedern von 6 118 ms auf 4,7 ms (≈1300x) bringt und das reale antd.js-Bundle von 78,1 ms auf 65,4 ms. Oxlint v1.72.0 liefert 3 Features (React-`no-unknown-property`-Vorschlag #23936, AstBuilder-Vereinheitlichung #23875, Schema für `eslint/no-restricted-import` #23642), 18 Fehlerbehebungen und 23 Performance-Eintragungen. Oxfmt v0.57.0 enthält zwei BREAKING-Änderungen, die den Prettier-Fallback für CSS/LESS/SCSS- und GraphQL-Dateien entfernen: `Format parser:css,less,scss files + css-in-js by oxc_formatter_css` (#23321, leaysgur) und `Support draft syntax with removing prettier fallback` (#23326, leaysgur), beide aufbauend auf den neuen Crates `oxc_formatter_css` (#23320) und `oxc_formatter_graphql` (#23317).
Deno 2.9 bringt 1,98x schnelleren Cold Start, 2,2–3,1x weniger RSS unter Last, npm Minimum Release Age als Default, No-Downgrade Trust Policy und eingebaute Snapshot-Tests
security

Deno 2.9 bringt 1,98x schnelleren Cold Start, 2,2–3,1x weniger RSS unter Last, npm Minimum Release Age als Default, No-Downgrade Trust Policy und eingebaute Snapshot-Tests

Deno 2.9 (Bartek Iwańczuk, veröffentlicht am 2026-06-25 auf deno.com/blog/v2.9) ist das größte Deno-Release des Zyklus. Der Cold Start sinkt von 34,2 ms auf 17,3 ms (1,98x), der Spitzen-RSS auf der Deno.serve-Realworld-Last fällt um den Faktor 2,2 (142 MB → 64 MB) und um 3,1x bei 1-MiB-Bodies (197 MB → 63 MB), und der Deno.serve-Durchsatz steigt um 1,27x in Realworld (56,8k → 72,4k req/s), 1,11x in Plaintext und 1,18x bei 1-MiB-Bodies. Supply-Chain-Härtung: Das npm Minimum Release Age wird standardmäßig mit einem 24-Stunden-Fenster aktiviert (PR #35458), und eine neue opt-in No-Downgrade Trust Policy (PR #34927) weigert sich, jede Version aufzulösen, deren Vertrauensbeweis (Staged Publishing, Trusted Publishing, Provenance-Attestation) schwächer ist als der stärkste Beweis einer zuvor veröffentlichten Version desselben Pakets. Test-Runner-Parität: eingebautes t.assertSnapshot() (#35139), Deno.test.each (#34938), --shard für CI-Fan-out (#35057), Retry und Repeats (#35053), Change-Aware --changed und --related (#35199) und Coverage-Thresholds (#35056). Lockfile-Interop: deno install seedet deno.lock aus package-lock.json, pnpm-lock.yaml, yarn.lock oder bun.lock (#34296, #35330, #35346, #35350, #35394), pnpm-workspace.yaml migriert automatisch in deno.json / package.json (#34993), und Git-Merge-Konflikt-Marker in deno.lock lösen sich automatisch auf (#34726). Dazu: deno desktop verlässt den experimentellen Status (PR #33441 vom 16. Juni), Subcommands deno link / deno unlink / deno list / deno watch, stabiles --unsafe-proto (#34738), Web Locks API (#31166), Happy Eyeballs v2 (RFC 8305) (#31726), navigator.userAgentData (#34743), der WebCrypto Modern Algorithms-Vorschlag (ML-KEM, ML-DSA, SLH-DSA, ChaCha20-Poly1305, SHA-3-Familie, KMAC, Argon2) (#34447, #34448, #34914, #35223), Node-26.3.0-Kompatibilität (#34746, #34747), Node-API v10 (#35270) und CSS-Modul-Importe unter --unstable-raw-imports (#35093). Über 165 PRs landen in diesem Zyklus.

Kommentare

Anmelden Melden Sie sich an, um an der Diskussion teilzunehmen.

Noch keine Kommentare. Seien Sie der Erste, der seine Gedanken teilt.