chore(deps): update dependency pnpm to v10 [security] #106
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
8.15.7
->10.0.0
GitHub Vulnerability Alerts
CVE-2024-53866
Summary
pnpm seems to mishandle overrides and global cache:
This can make workspace A (even running with
ignore-scripts=true
) posion global cache and execute scripts in workspace BUsers generally expect
ignore-scripts
to be sufficient to prevent immediate code execution on install (e.g. when the tree is just repacked/bundled without executing it).Here, that expectation is broken
Details
See PoC.
In it, overrides from a single run of A get leaked into e.g.
~/Library/Caches/pnpm/metadata/registry.npmjs.org/rimraf.json
and persistently affect all other projects using the cachePoC
Postinstall code used in PoC is benign and can be inspected in https://www.npmjs.com/package/ponyhooves?activeTab=code, it's just a
console.log
On mac:
rm -rf ~/Library/Caches/pnpm ~/Library/pnpm/store
This step is not required in general, but we'll be using a popular package for PoC that's likely cached
A/package.json
:pnpm i --ignore-scripts
(the flag is not required, but the point of the demo is to show that it doesn't help)B/package.json
:pnpm i
Result:
Also, that code got leaked into another project and it's lockfile now!
Impact
Global state integrity is lost via operations that one would expect to be secure, enabling subsequently running arbitrary code execution on installs
As a work-around, use separate cache and store dirs in each workspace
CVE-2024-47829
The path shortening function is used in pnpm:
However, it uses the md5 function as a path shortening compression function, and if a collision occurs, it will result in the same storage path for two different libraries. Although the real names are under the package name /node_modoules/, there are no version numbers for the libraries they refer to.

In the diagram, we assume that two packages are called packageA and packageB, and that the first 90 digits of their package names must be the same, and that the hash value of the package names with versions must be the same. Then C is the package that they both reference, but with a different version number. (npm allows package names up to 214 bytes, so constructing such a collision package name is obvious.)
Then hash(packageA@1.2.3)=hash(packageB@3.4.5). This results in the same path for the installation, and thus under the same directory. Although the package names under node_modoules are the full paths again, they are shared with C.
What is the exact version number of C?
In our local tests, it depends on which one is installed later. If packageB is installed later, the C version number will change to 2.0.0. At this time, although package A requires the C@1.0.0 version, package. json will only work during installation, and will not affect the actual operation.
We did not receive any installation error issues from pnpm during our local testing, nor did we use force, which is clearly a case that can be triggered.
For a package with a package name + version number longer than 120, another package can be constructed to introduce an indirect reference to a lower version, such as one with some known vulnerability.
Alternatively, it is possible to construct two packages with more than 120 package names + version numbers.
This is clearly an advantage for those intent on carrying out supply chain attacks.
The solution:
The repair cost is also very low, just need to upgrade the md5 function to sha256.
Release Notes
pnpm/pnpm (pnpm)
v10.0.0
Compare Source
Major Changes
Lifecycle scripts of dependencies are not executed during installation by default! This is a breaking change aimed at increasing security. In order to allow lifecycle scripts of specific dependencies, they should be listed in the
pnpm.onlyBuiltDependencies
field ofpackage.json
#8897. For example:pnpm link
behavior updated:The
pnpm link
command now adds overrides to the rootpackage.json
.pnpm link
from the package’s directory. Previously, you needed to usepnpm link -g
.Related PR: #8653
Secure hashing with SHA256:
Various hashing algorithms have been updated to SHA256 for enhanced security and consistency:
node_modules/.pnpm
are now hashed with SHA256.packageExtensionsChecksum
field ofpnpm-lock.yaml
is now SHA256.Configuration updates:
manage-package-manager-versions
: enabled by default. pnpm now manages its own version based on thepackageManager
field inpackage.json
by default.public-hoist-pattern
: nothing is hoisted by default. Packages containingeslint
orprettier
in their name are no longer hoisted to the root ofnode_modules
. Related Issue: #8378Upgraded
@yarnpkg/extensions
to v2.0.3. This may alter your lockfile.virtual-store-dir-max-length
: the default value on Windows has been reduced to 60 characters.Reduced environment variables for scripts:
During script execution, fewer
npm_package_*
environment variables are set. Onlyname
,version
,bin
,engines
, andconfig
remain.Related Issue: #8552
All dependencies are now installed even if
NODE_ENV=production
. Related Issue: #8827Changes to the global store:
Store version bumped to v10.
Some registries allow identical content to be published under different package names or versions. To accommodate this, index files in the store are now stored using both the content hash and package identifier.
This approach ensures that we can:
Related PR: #8510
Related Issue: #8204
More efficient side effects indexing. The structure of index files in the store has changed. Side effects are now tracked more efficiently by listing only file differences rather than all files.
Related PR: #8636
A new
index
directory stores package content mappings. Previously, these files were infiles
.Other breaking changes:
#
character is now escaped in directory names withinnode_modules/.pnpm
.Related PR: #8557
pnpm add --global pnpm
orpnpm add --global @​pnpm/exe
now fails with an error message, directing you to usepnpm self-update
instead.Related PR: #8728
Related Issue: #8833
pnpm deploy
command now only works in workspaces that haveinject-workspace-packages=true
. This limitation is introduced to allow us to create a proper lockfile for the deployed project using the workspace lockfile.pnpm test
now passes all parameters after thetest
keyword directly to the underlying script. This matches the behavior ofpnpm run test
. Previously you needed to use the--
prefix.Related PR: #8619
node-gyp
updated to version 11.pnpm deploy
now tries creating a dedicated lockfile from a shared lockfile for deployment. It will fallback to deployment without a lockfile if there is no shared lockfile orforce-legacy-deploy
is set totrue
.Minor Changes
Added support for a new type of dependencies called "configurational dependencies". These dependencies are installed before all the other types of dependencies (before "dependencies", "devDependencies", "optionalDependencies").
Configurational dependencies cannot have dependencies of their own or lifecycle scripts. They should be added using exact version and the integrity checksum. Example:
Related RFC: #8.
Related PR: #8915.
New settings:
New
verify-deps-before-run
setting. This setting controls howpnpm
checksnode_modules
before running scripts:install
: Automatically runpnpm install
ifnode_modules
is outdated.warn
: Print a warning ifnode_modules
is outdated.prompt
: Prompt the user to confirm runningpnpm install
ifnode_modules
is outdated.error
: Throw an error ifnode_modules
is outdated.false
: Disable dependency checks.Related Issue: #8585
New
inject-workspace-packages
setting enables hard-linking all local workspace dependencies instead of symlinking them. Previously, this could be achieved usingdependenciesMeta[].injected
, which remains supported.Related PR: #8836
Faster repeat installs:
On repeated installs,
pnpm
performs a quick check to ensurenode_modules
is up to date.Related PR: #8838
pnpm add
integrates with default workspace catalog:When adding a dependency,
pnpm add
checks the default workspace catalog. If the dependency and version requirement match the catalog,pnpm add
uses thecatalog:
protocol. Without a specified version, it matches the catalog’s version. If it doesn’t match, it falls back to standard behavior.Related Issue: #8640
pnpm dlx
now resolves packages to their exact versions and uses these exact versions for cache keys. This ensurespnpm dlx
always installs the latest requested packages.Related PR: #8811
No
node_modules
validation on certain commands. Commands that should not modifynode_modules
(e.g.,pnpm install --lockfile-only
) no longer validate or purgenode_modules
.Related PR: #8657
v9.15.9
: pnpm 9.15.9Compare Source
Patch Changes
Platinum Sponsors
Gold Sponsors
v9.15.8
: pnpm 9.15.8Compare Source
Patch Changes
pnpm self-update
should always update the version in thepackageManager
field ofpackage.json
.--silent
reporting is used.--loglevel
is set toerror
, don't show installation summary, execution time, and big tarball download progress.--loglevel=error
is used.Platinum Sponsors
Gold Sponsors
v9.15.7
: pnpm 9.15.7Compare Source
Patch Changes
pnpm self-update
should not leave a directory with a broken pnpm installation if the installation fails.--config.
prefix such as--@​scope:registry=https://scope.example.com/npm
#9089.pnpm self-update
should not read the pnpm settings from thepackage.json
file in the current working directory.pnpm update -i
should list only packages that have newer versions #9206.catalogs
section of thepnpm-lock.yaml
file to be removed whendedupe-peer-dependents=false
on a filtered install. #9112Platinum Sponsors
Gold Sponsors
v9.15.6
: pnpm 9.15.6Compare Source
Patch Changes
packageManager
cannot start withv
.pnpm-lock.yaml
file when using--fix-lockfile
and--filter
. #8639v9.15.5
: pnpm 9.15.5Compare Source
Patch Changes
pnpm install
, thepreprepare
andpostprepare
scripts of the project should be executed #8989.strip-ansi
with the built-inutil.stripVTControlCharacters
#9009.Platinum Sponsors
Gold Sponsors
v9.15.4
: pnpm 9.15.4Compare Source
Patch Changes
pnpm update --latest <pkg>
updates only the specified package, withdedupe-peer-dependents=true
.Platinum Sponsors
Gold Sponsors
v9.15.3
: pnpm 9.15.3Compare Source
Patch Changes
pnpm update --filter <pattern> --latest <pkg>
should only change the specified package for the specified workspace, whendedupe-peer-dependents
is set totrue
#8877..DS_Store
file atpatch-commit
#8922.pnpm patch
is unable to bring back old patch without specifying@version
suffix #8919.Platinum Sponsors
Gold Sponsors
v9.15.2
: pnpm 9.15.2Compare Source
Patch Changes
publish
/pack
error with workspace dependencies with relative paths #8904. It was broken inv9.4.0
(398472c).pnpm patch
on Windows #7546.git ls-remote
works via HTTPS #8906.Platinum Sponsors
Gold Sponsors
v9.15.1
: pnpm 9.15.1Compare Source
Patch Changes
pnpm remove
should not link dependencies from the workspace, whenlink-workspace-packages
is set tofalse
#7674.node_modules
should not fail, when a dependency has itself in its own peer dependencies #8854.Platinum Sponsors
Gold Sponsors
Configuration
📅 Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Enabled.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.