chore(deps): update pnpm to v10 [security]
This PR contains the following updates:
| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| pnpm (source) | 9.15.6 -> 10.0.0 |
pnpm uses the md5 path shortening function causes packet paths to coincide, which causes indirect packet overwriting
CVE-2024-47829 / GHSA-8cc4-rfj6-fhg4
More information
Details
The path shortening function is used in pnpmοΌ
export function depPathToFilename (depPath: string, maxLengthWithoutHash: number): string {
let filename = depPathToFilenameUnescaped(depPath).replace(/[\\/:*?"<>|]/g, '+')
if (filename.includes('(')) {
filename = filename
.replace(/\)$/, '')
.replace(/(\)\()|\(|\)/g, '_')
}
if (filename.length > maxLengthWithoutHash || filename !== filename.toLowerCase() && !filename.startsWith('file+')) {
return `${filename.substring(0, maxLengthWithoutHash - 27)}_${createBase32Hash(filename)}`
}
return filename
}
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([email protected])=hash([email protected]). 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 [email protected] 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.
Severity
- CVSS Score: 6.5 / 10 (Medium)
- Vector String:
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:L/I:L/A:L
References
- https://github.com/pnpm/pnpm/security/advisories/GHSA-8cc4-rfj6-fhg4
- https://nvd.nist.gov/vuln/detail/CVE-2024-47829
- https://github.com/pnpm/pnpm
This data is provided by OSV and the GitHub Advisory Database (CC-BY 4.0).
Release Notes
pnpm/pnpm (pnpm)
v10.0.0
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.onlyBuiltDependenciesfield ofpackage.json#β8897. For example:{ "pnpm": { "onlyBuiltDependencies": ["fsevents"] } } -
pnpm linkbehavior updated:The
pnpm linkcommand now adds overrides to the rootpackage.json.- In a workspace: The override is added to the root of the workspace, linking the dependency to all projects in the workspace.
- Global linking: To link a package globally, run
pnpm linkfrom 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:
- Long paths inside
node_modules/.pnpmare now hashed with SHA256. - Long peer dependency hashes in the lockfile now use SHA256 instead of MD5. (This affects very few users since these are only used for long keys.)
- The hash stored in the
packageExtensionsChecksumfield ofpnpm-lock.yamlis now SHA256. - The side effects cache keys now use SHA256.
- The pnpmfile checksum in the lockfile now uses SHA256 (#β8530).
- Long paths inside
-
Configuration updates:
-
manage-package-manager-versions: enabled by default. pnpm now manages its own version based on thepackageManagerfield inpackage.jsonby default. -
public-hoist-pattern: nothing is hoisted by default. Packages containingeslintorprettierin their name are no longer hoisted to the root ofnode_modules. Related Issue: #β8378 -
Upgraded
@yarnpkg/extensionsto 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, andconfigremain. Related Issue: #β8552 -
All dependencies are now installed even if
NODE_ENV=production. Related Issue: #β8827
-
-
Changes 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:
-
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
indexdirectory stores package content mappings. Previously, these files were infiles.
-
-
Other breaking changes:
- The
#character is now escaped in directory names withinnode_modules/.pnpm. Related PR: #β8557 - Running
pnpm add --global pnpmorpnpm add --global @​pnpm/exenow fails with an error message, directing you to usepnpm self-updateinstead. Related PR: #β8728 - Dependencies added via a URL now record the final resolved URL in the lockfile, ensuring that any redirects are fully captured. Related Issue: #β8833
- The
pnpm deploycommand 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. - Removed conversion from lockfile v6 to v9. If you need v6-to-v9 conversion, use pnpm CLI v9.
-
pnpm testnow passes all parameters after thetestkeyword directly to the underlying script. This matches the behavior ofpnpm run test. Previously you needed to use the--prefix. Related PR: #β8619
- The
-
node-gypupdated to version 11. -
pnpm deploynow 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-deployis 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:
{ "pnpm": { "configDependencies": { "my-configs": "1.0.0+sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==" } } } -
New settings:
-
New
verify-deps-before-runsetting. This setting controls howpnpmchecksnode_modulesbefore running scripts:-
install: Automatically runpnpm installifnode_modulesis outdated. -
warn: Print a warning ifnode_modulesis outdated. -
prompt: Prompt the user to confirm runningpnpm installifnode_modulesis outdated. -
error: Throw an error ifnode_modulesis outdated. -
false: Disable dependency checks. Related Issue: #β8585
-
-
New
inject-workspace-packagessetting 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,
pnpmperforms a quick check to ensurenode_modulesis up to date. Related PR: #β8838 -
pnpm addintegrates with default workspace catalog:When adding a dependency,
pnpm addchecks the default workspace catalog. If the dependency and version requirement match the catalog,pnpm adduses 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 dlxnow resolves packages to their exact versions and uses these exact versions for cache keys. This ensurespnpm dlxalways installs the latest requested packages. Related PR: #β8811 -
No
node_modulesvalidation 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.9
Patch Changes
- Fix running pnpm CLI from pnpm CLI on Windows when the CLI is bundled to an executable #β8971.
Platinum Sponsors
|
|
|
|
Gold Sponsors
|
|
|
|
|
|
|
|
|
|
|
|
v9.15.8: pnpm 9.15.8
Patch Changes
-
pnpm self-updateshould always update the version in thepackageManagerfield ofpackage.json. - The pnpm CLI process should not stay hanging, when
--silentreporting is used. - When
--loglevelis set toerror, don't show installation summary, execution time, and big tarball download progress. - Don't show info output when
--loglevel=erroris used.
Platinum Sponsors
|
|
|
|
Gold Sponsors
|
|
|
|
|
|
|
|
|
|
|
|
v9.15.7: pnpm 9.15.7
Patch Changes
-
pnpm self-updateshould not leave a directory with a broken pnpm installation if the installation fails. - Allow scope registry CLI option without
--config.prefix such as--@​scope:registry=https://scope.example.com/npm#β9089. -
pnpm self-updateshould not read the pnpm settings from thepackage.jsonfile in the current working directory. -
pnpm update -ishould list only packages that have newer versions #β9206. - Fix a bug causing entries in the
catalogssection of thepnpm-lock.yamlfile to be removed whendedupe-peer-dependents=falseon a filtered install. #β9112
Platinum Sponsors
|
|
|
|
Gold Sponsors
|
|
|
|
|
|
|
|
|
|
|
|
Configuration
π Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).
π¦ Automerge: Disabled by config. Please merge this manually once you are satisfied.
β» Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
π Ignore: Close this PR and you won't be reminded about this update again.
- [ ] If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.
β οΈ No Changeset found
Latest commit: a5336e8a76c74b639b8d9a3a1039da3f60af5074
Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.
This PR includes no changesets
When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types
Click here to learn what changesets are, and how to add one.
Click here if you're a maintainer who wants to add a changeset to this PR