{"id":"CVE-2026-15921","summary":"nvm path traversal via a malicious mirror's LTS codename writes outside the alias directory","details":"Node Version Manager (nvm) is a POSIX-compliant shell function for managing multiple node.js versions. In versions 0.32.1 through 0.40.5, `nvm ls-remote` (and other commands that refresh remote LTS aliases, such as `nvm install --lts`) parse the node.js mirror's `index.tab` and use each release's LTS codename field as an alias filename without validating it. A malicious, compromised, or man-in-the-middled mirror can return an LTS codename containing path-traversal sequences such as `../../../.bashrc`, causing nvm to write the associated version string to a path outside `$NVM_DIR/alias`. With the default layout (`$NVM_DIR` is `~/.nvm`), this can create or overwrite files in the user's home directory, including shell startup files, which can lead to code execution in a later shell session. Exploitation requires the victim to use a hostile mirror -- via a compromised mirror or CDN, a network man-in-the-middle, or a maliciously configured `NVM_NODEJS_ORG_MIRROR`/`NVM_IOJS_ORG_MIRROR` -- and to run an affected command. Version 0.40.6 validates remote LTS codenames as safe alias filenames and rejects `..` path components when writing alias files.","aliases":["GHSA-4ghp-wxpw-rhpg"],"modified":"2026-08-12T03:51:37.500567821Z","published":"2026-07-15T21:16:46.936Z","database_specific":{"cna_assigner":"harborist","cwe_ids":["CWE-22","CWE-73"],"osv_generated_from":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/15xxx/CVE-2026-15921.json"},"references":[{"type":"ADVISORY","url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/15xxx/CVE-2026-15921.json"},{"type":"ADVISORY","url":"https://github.com/nvm-sh/nvm/security/advisories/GHSA-4ghp-wxpw-rhpg"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-15921"},{"type":"FIX","url":"https://github.com/nvm-sh/nvm/commit/9275c5badda1d9d0cdad6f34598a111033eadb42"},{"type":"PACKAGE","url":"https://github.com/nvm-sh/nvm"}],"affected":[{"ranges":[{"type":"GIT","repo":"https://github.com/nvm-sh/nvm","events":[{"introduced":"589a9112bd0516befea756cc8e976fb1c4b031e9"},{"fixed":"b6cf55f6adf3b953d0e5e00a4049444e300e3af8"}],"database_specific":{"extracted_events":[{"introduced":"0.32.1"},{"fixed":"0.40.6"}],"source":"AFFECTED_FIELD"}}],"versions":["v0.40.5","v0.40.4","v0.40.3","v0.40.2","v0.40.1","v0.40.0","v0.39.7","v0.39.6","v0.39.5","v0.39.4","v0.39.3","v0.39.2","v0.39.1","v0.39.0","v0.38.0","v0.37.2","v0.37.1","v0.37.0","v0.36.0","v0.35.3","v0.35.2","v0.35.1","v0.35.0","v0.34.0","v0.33.9","v0.33.8","v0.33.7","v0.33.6","v0.33.5","v0.33.4","v0.33.3","v0.33.2","v0.33.1","v0.33.0","v0.32.1"],"database_specific":{"source":"https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-15921.json"}}],"schema_version":"1.9.0","severity":[{"type":"CVSS_V4","score":"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"}]}