Public vulnerability disclosure

CVE-2026-121751

nvm evaluates a malicious mirror's index.tab version strings as shell arithmetic via stored LTS aliases

publishedCWE-78CWE-20

Node Version Manager (nvm) is a POSIX-compliant shell function for managing multiple node.js versions. In versions 0.39.6 through 0.40.8, `nvm ls-remote` (and other commands that refresh remote LTS aliases) store the version column of the mirror's `index.tab` in `$NVM_DIR/alias/lts/` without validating it, and `nvm_normalize_lts` later evaluates any suffix of an `lts/-N` value inside shell arithmetic `$((N+1))`. Under bash and zsh, arithmetic evaluation expands command substitutions in array subscripts, so a stored value such as `lts/-10*path[$(cmd)1]` runs `cmd` as the user when the alias is later resolved by purely local commands (`nvm ls`, `nvm alias`, `nvm use --lts`, `nvm which lts/`), and in every new shell when the `default` alias is `lts/*`. Exploitation requires the victim to use a hostile mirror -- via a compromised mirror or CDN, a network man-in-the-middle of an `http://` mirror, or a maliciously configured `NVM_NODEJS_ORG_MIRROR` -- and to run an affected command. The same sink is also reachable from a project `.nvmrc`, which is treated as hardening. dash is not affected. Version 0.41.0 only passes an all-digit `lts/-N` offset to arithmetic and drops `index.tab` rows whose version is not a valid version string.

Technical severity2.1 lowCVSS 4.0 · CNA: harborist
Published2026-11-04Source updated 2026-11-09
Collected2026-11-094 attributed sources

Fixes and workarounds

Fix

Upgrade to nvm 0.41.0 or later, which only lets an all-digit `lts/-N` offset reach shell arithmetic and drops mirror rows with invalid version strings. (Only needed if using a non-default mirror whose metadata contents you do not trust, or running nvm in untrusted project directories.)

Source: CNA: harborist

Workaround

Until upgrading, only run `nvm ls-remote` and LTS-refreshing commands against trusted mirrors over TLS, ensure `NVM_NODEJS_ORG_MIRROR` points only at a trusted endpoint, and do not run nvm in untrusted project directories.

Source: CNA: harborist

Fix

The reporting source identifies this reference as a patch. Check the advisory for affected versions and supported release branches.

Source: CNA: harborist

Fix

nvm-sh/nvm (other): GitHub reports patched versions 0.41.0. Check the advisory for the affected release branch.

Source: GitHub GHSA-7prg-rw9c-82h7

Affected products and versions

Affected products, source version ranges and reporting authorities
ProductVersionsAuthority
nvm
nvm-sh
≥ 0.39.6; < 0.41.0 (affected, semver)
Other versions: unaffected
CNA: harborist
nvm-sh/nvm

nvm-sh/nvm
other
>= 0.39.6, <= 0.40.8 (affected, GitHub advisory range) GitHub GHSA-7prg-rw9c-82h7

Version ranges are source assertions. Check the vendor advisory and your installed configuration before determining exposure.

CVSS assessments

CVSS scores, vectors and reporting authorities
Version / scoreVectorAuthority
4.0 / 2.1
low
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:A/VC:N/VI:L/VA:N/SC:N/SI:N/SA:NCNA: harborist
3.1 / 3.1
low
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:N/I:L/A:NCNA: harborist
4.0 / 2.1
low
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:A/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:XNVD: 7ffcee3d-2c14-4c3e-b844-86c6a321a158
3.1 / 3.1
low
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:N/I:L/A:NNVD: 7ffcee3d-2c14-4c3e-b844-86c6a321a158

Exploit evidence

No exploit evidence in collected sources. This is not proof of no exploitation.

References

For agents and automation

Read public disclosures for free as Markdown or JSON. Compatible browsers also expose native WebMCP tools to search disclosures, read this page, and discover API access.

Use the ontology-linked Cyber API with x402 pay per request, or a Y2 Pro or Elite API key with the intel:cyber scope.

Endpoints and access details

https://api.y2.dev/api/v2/cyber/cves
https://api.y2.dev/api/v2/cyber/cves/{cveId}

A workspace owner or admin can create a Pro or Elite API key. Send Authorization: Bearer <Y2_API_KEY> from your trusted agent runtime.

For x402, omit Authorization and read the HTTP 402 payment challenge before signing a retry. Public browser tools do not make payments.

Agent access JSON · OpenAPI · CVE API guide