---
id: "CVE-2026-121746"
kind: "vulnerability"
aliases: ["CVE-2026-121746"]
title: "nvm: symlinked .nvmrc lets --save overwrite files outside repo"
severity: "medium"
cvss: 6.7
epss: null
exploited: false
status: "open"
category: "package"
products: []
ecosystems: []
tags: ["developer-workstations", "node", "nvm", "package", "shell"]
not_affected_if: ["nvm-0.41.0-or-later", "save-flag-unused", "trusted-repositories"]
published_at: "2026-11-04T22:17:54+00:00"
first_seen_at: "2026-11-04T23:08:47+00:00"
updated_at: "2026-11-04T23:09:59+00:00"
sources: [{"source": "nvd", "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-121746", "first_seen_at": "2026-11-04T23:08:47+00:00"}]
exploit_sources: []
---

# nvm: symlinked .nvmrc lets --save overwrite files outside repo

In nvm versions 0.40.0 through 0.40.8, running `nvm use --save` or `nvm install --save` writes the version through a symbolic link named .nvmrc, so a repository can point it at a file the user can write, such as a shell startup file or authorized_keys. That file gets truncated and overwritten with the version string, which is data loss rather than code execution.

_Summary, check and fix written by a model from the sources; labelled as such._

## How to check

- Run `nvm --version` and check whether it is between `0.40.0` and `0.40.8`.
- Look for `.nvmrc` in cloned repositories with `ls -l .nvmrc`; a symbolic link pointing outside the repository is the risky case.

## Fix

- nvm `0.41.0` refuses to write when `.nvmrc` is a symlink, dangling or not.

## Timeline

- 2026-11-04T23:08:47+00:00 nvd https://nvd.nist.gov/vuln/detail/CVE-2026-121746

## Documents

- [advisory] Vendor advisory: github.com https://github.com/nvm-sh/nvm/security/advisories/GHSA-8qjx-8r8m-mpqh
- [fix] Patch: github.com https://github.com/nvm-sh/nvm/commit/3f8411e58d40b904e4ff6a96512391f56bd95bf7

## From the sources

Node Version Manager (nvm) is a POSIX-compliant shell function for managing multiple node.js versions. In versions 0.40.0 through 0.40.8, `nvm use --save` and `nvm install --save` (or `-w`) write the resolved version to `$PWD/.nvmrc` with `tee`, which follows a symbolic link. A repository that commits `.nvmrc` as a symlink to a path outside itself (git recreates the link on clone) therefore makes `--save` truncate any file the user can write, such as a shell startup file or `~/.ssh/authorized_keys`, and replace its contents with the version string, or create the target of a dangling link; the link itself is left unchanged, so `git status` stays clean. The attacker does not control the content written, so this is data loss, not code execution. Version 0.41.0 refuses, with a warning, to write when `.nvmrc` in the current directory is a symlink, dangling or not, rather than writing through it or replacing it.

---

_Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai_
