CVE-2026-121751: nvm evaluates a malicious mirror's index.tab version strings as shell arithmetic via stored LTS aliases
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 $NVMDIR/alias/lts/ without validating it, and nvmnormalizelts 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/-10path[$(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 NVMNODEJSORGMIRROR -- 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.
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
nvmto a version that resolves this vulnerability.Fixed in 0.41.0
Event History
Frequently Asked Questions
Who is exposed to this issue?
Users running nvm 0.39.6 through 0.40.8 under bash or zsh are exposed if they refresh LTS alias data from a hostile mirror. dash is not affected.
What does an attacker need to exploit it?
The attacker must control or tamper with the configured Node.js mirror, such as through a compromised mirror or CDN, a man-in-the-middle position against an http:// mirror, or a malicious NVM_NODEJS_ORG_MIRROR setting. The victim must then run a command that refreshes or resolves the affected LTS alias data.
Can the payload execute without another network request?
Yes. Once a malicious version value has been stored in $NVM_DIR/alias/lts/, local commands including nvm ls, nvm alias, nvm use --lts, and nvm which lts/ can trigger execution. If the default alias is lts/*, execution can occur in each new shell.
What can be done if upgrading is not immediately possible?
Avoid untrusted or http:// mirrors and review the configured NVM_NODEJS_ORG_MIRROR value. Remove suspicious stored LTS alias files under $NVM_DIR/alias/lts/ before resolving LTS aliases.
How is this addressed in the fixed release?
Version 0.41.0 restricts the lts/-N offset passed to shell arithmetic to all-digit values and drops index.tab rows with invalid version fields.