CVE-2026-102829
simple-git: `VISUAL` editor environment variable is omitted from unsafe editor detection
simple-git, an interface for running git commands in any node.js application, enables applications to execute Git operations from JavaScript. Prior to 2.0.1 of the argv-parser package, parseEnv omits VISUAL from GitEnvKeys, so prepareEnv drops the value before vulnerabilityCheck can classify it as allowUnsafeEditor. A consuming application that forwards attacker-influenced environment values can therefore allow Git to invoke an attacker-selected editor during operations such as commit amendment or interactive rebase when no higher-priority editor setting overrides VISUAL and Git's terminal prerequisites are met. The executable runs with the privileges of the Node.js process. This issue is fixed in argv-parser 2.0.1.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- High
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- High
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
9.2
simple-git: `VISUAL` editor environment variable is omitted from unsafe editor detection
simple-git, an interface for running git commands in any node.js application, enables applications to execute Git operations from JavaScript. Prior to 2.0.1 of the argv-parser package, parseEnv omits VISUAL from GitEnvKeys, so prepareEnv drops the value before vulnerabilityCheck can classify it as allowUnsafeEditor. A consuming application that forwards attacker-influenced environment values can therefore allow Git to invoke an attacker-selected editor during operations such as commit amendment or interactive rebase when no higher-priority editor setting overrides VISUAL and Git's terminal prerequisites are met. The executable runs with the privileges of the Node.js process. This issue is fixed in argv-parser 2.0.1.
- Record
CVE-2026-102829- CVSS 4.0
- 9.2 Critical
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N - Weakness
- CWE-78, CWE-184
- Updated
- 2026-11-02
EUVDEUVD-2026-89336
9.2
simple-git, an interface for running git commands in any node.js application, enables applications to execute Git operations from JavaScript. Prior to 2.0.1 of the argv-parser package, parseEnv omits VISUAL from GitEnvKeys, so prepareEnv drops the value before vulnerabilityCheck can classify it as allowUnsafeEditor. A consuming application that forwards attacker-influenced environment values can therefore allow Git to invoke an attacker-selected editor during operations such as commit amendment or interactive rebase when no higher-priority editor setting overrides VISUAL and Git's terminal prerequisites are met. The executable runs with the privileges of the Node.js process. This issue is fixed in argv-parser 2.0.1.
- Record
EUVD-2026-89336- CVSS 4.0
- 9.2 Critical
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-v5rq-49vh-5v5c
9.2
simple-git: `VISUAL` editor environment variable is omitted from unsafe editor detection
Security control bypass in @simple-git/argv-parser: Git's VISUAL editor fallback is not classified as allowUnsafeEditor
Report metadata
| Field | Value |
| --- | --- |
| Package | @simple-git/argv-parser (npm, pkg:npm/%40simple-git/argv-parser) |
| Repository | https://github.com/steveukx/git-js |
| Component | parseEnv (packages/argv-parser/src/env/parse-env.ts), reached via vulnerabilityCheck(tokens, env) |
| Vulnerability class | Security-control bypass — incomplete denylist in unsafe-editor detection |
| Verified against | c427fbad33f1f2b11341f1cf852eedecbb106400 (@simple-git/argv-parser 1.1.1), plus the published npm artifact 1.1.1; main at 98864c6 observed still unpatched |
| API surface | Public documented API (parseEnv(raw) / vulnerabilityCheck(tokens, env)) |
| Affected in default configuration | Yes — reproduced with blockUnsafeOperationsPlugin under default options, with no unsafe allowances enabled |
Summary
GitEnvKeys in packages/argv-parser/src/env/parse-env.ts maps only editor, git_editor and git_sequence_editor to the allowUnsafeEditor category. prepareEnv keeps an environment entry only when its lowercased name is a known GitEnvKey or starts with git, so VISUAL is discarded before collectConfigVulnerabilities ever inspects it. Git, however, falls back to VISUAL when resolving an editor, so parseEnv({ VISUAL: '/tmp/evileditor' }) reports no vulnerability while an interactive Git operation will execute that binary.
In a consuming application the shape is: environment values derived from a request or job are forwarded into the child Git environment and classified by this parser before spawn. The parser exists to classify exactly such values, and the equivalent EDITOR or GIT_EDITOR value is rejected — so the attacker gains an editor substitution that the guard is specifically designed to block.
EDITOR-> classifiedallowUnsafeEditor(GitEnvKeys, lines 5-27)GIT_EDITOR-> classifiedallowUnsafeEditor(GitEnvKeys, lines 5-27)GIT_SEQUENCE_EDITOR-> classifiedallowUnsafeEditor(GitEnvKeys, lines 5-27)VISUAL-> absent fromGitEnvKeys; dropped byprepareEnv, lines 60-68 — no vulnerability emitted
Impact
A consuming application that allows attacker-influenced environment values can have an attacker-selected executable launched by Git during operations such as git commit --amend, bypassing the parser's default unsafe-editor protection. Execution happens as the host user running the Git child process, with the attacker's binary invoked against the repository's editor file (for example .git/COMMIT_EDITMSG, or .git/rebase-merge/git-rebase-todo for git rebase -i).
The new capability is the bypass itself: without this gap, the same attacker-supplied value under EDITOR, GIT_EDITOR or GIT_SEQUENCE_EDITOR is refused unless the consumer explicitly opts in to allowUnsafeEditor. With VISUAL, the equivalent code execution proceeds with no opt-in and no reported vulnerability. VISUAL also takes precedence over EDITOR, the variable the parser does flag.
Scoring note: no CVSS vector or score is available for this finding, and one is not asserted here. Exploitability depends on the consuming application's data flow — specifically whether attacker-influenced environment entries reach the Git child environment. Consumers that never forward untrusted environment values into Git, or that always set a higher-priority GIT_EDITOR or core.editor, are not affected.
Preconditions
- The consumer forwards attacker-influenced environment entries into the environment passed to child Git (for example via simple-git's
.env()), and classifies them with this parser before spawn. - The Git command opens an editor — for example
commitwithout-m,commit --amend, orrebase -i. - No higher-priority editor setting overrides
VISUAL:GIT_EDITOR,core.editorandEDITORare absent…
- Record
GHSA-v5rq-49vh-5v5c- CVSS 4.0
- 9.2 Critical
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N - Weakness
- CWE-78, CWE-184
- Updated
- 2026-11-02
NVD
9.2
simple-git, an interface for running git commands in any node.js application, enables applications to execute Git operations from JavaScript. Prior to 2.0.1 of the argv-parser package, parseEnv omits VISUAL from GitEnvKeys, so prepareEnv drops the value before vulnerabilityCheck can classify it as allowUnsafeEditor. A consuming application that forwards attacker-influenced environment values can therefore allow Git to invoke an attacker-selected editor during operations such as commit amendment or interactive rebase when no higher-priority editor setting overrides VISUAL and Git's terminal prerequisites are met. The executable runs with the privileges of the Node.js process. This issue is fixed in argv-parser 2.0.1.
- Record
CVE-2026-102829- CVSS 4.0
- 9.2 Critical
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/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:X - Weakness
- CWE-78, CWE-184
- Updated
- 2026-11-02
OSV
9.2
simple-git: `VISUAL` editor environment variable is omitted from unsafe editor detection
simple-git, an interface for running git commands in any node.js application, enables applications to execute Git operations from JavaScript. Prior to 2.0.1 of the argv-parser package, parseEnv omits VISUAL from GitEnvKeys, so prepareEnv drops the value before vulnerabilityCheck can classify it as allowUnsafeEditor. A consuming application that forwards attacker-influenced environment values can therefore allow Git to invoke an attacker-selected editor during operations such as commit amendment or interactive rebase when no higher-priority editor setting overrides VISUAL and Git's terminal prerequisites are met. The executable runs with the privileges of the Node.js process. This issue is fixed in argv-parser 2.0.1.
- Record
CVE-2026-102829- CVSS 4.0
- 9.2 Critical
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N - Weakness
- CWE-184, CWE-78
- Updated
- 2026-11-02
OSVGHSA-v5rq-49vh-5v5c
9.2
simple-git: `VISUAL` editor environment variable is omitted from unsafe editor detection
Security control bypass in @simple-git/argv-parser: Git's VISUAL editor fallback is not classified as allowUnsafeEditor
Report metadata
| Field | Value |
| --- | --- |
| Package | @simple-git/argv-parser (npm, pkg:npm/%40simple-git/argv-parser) |
| Repository | https://github.com/steveukx/git-js |
| Component | parseEnv (packages/argv-parser/src/env/parse-env.ts), reached via vulnerabilityCheck(tokens, env) |
| Vulnerability class | Security-control bypass — incomplete denylist in unsafe-editor detection |
| Verified against | c427fbad33f1f2b11341f1cf852eedecbb106400 (@simple-git/argv-parser 1.1.1), plus the published npm artifact 1.1.1; main at 98864c6 observed still unpatched |
| API surface | Public documented API (parseEnv(raw) / vulnerabilityCheck(tokens, env)) |
| Affected in default configuration | Yes — reproduced with blockUnsafeOperationsPlugin under default options, with no unsafe allowances enabled |
Summary
GitEnvKeys in packages/argv-parser/src/env/parse-env.ts maps only editor, git_editor and git_sequence_editor to the allowUnsafeEditor category. prepareEnv keeps an environment entry only when its lowercased name is a known GitEnvKey or starts with git, so VISUAL is discarded before collectConfigVulnerabilities ever inspects it. Git, however, falls back to VISUAL when resolving an editor, so parseEnv({ VISUAL: '/tmp/evileditor' }) reports no vulnerability while an interactive Git operation will execute that binary.
In a consuming application the shape is: environment values derived from a request or job are forwarded into the child Git environment and classified by this parser before spawn. The parser exists to classify exactly such values, and the equivalent EDITOR or GIT_EDITOR value is rejected — so the attacker gains an editor substitution that the guard is specifically designed to block.
EDITOR-> classifiedallowUnsafeEditor(GitEnvKeys, lines 5-27)GIT_EDITOR-> classifiedallowUnsafeEditor(GitEnvKeys, lines 5-27)GIT_SEQUENCE_EDITOR-> classifiedallowUnsafeEditor(GitEnvKeys, lines 5-27)VISUAL-> absent fromGitEnvKeys; dropped byprepareEnv, lines 60-68 — no vulnerability emitted
Impact
A consuming application that allows attacker-influenced environment values can have an attacker-selected executable launched by Git during operations such as git commit --amend, bypassing the parser's default unsafe-editor protection. Execution happens as the host user running the Git child process, with the attacker's binary invoked against the repository's editor file (for example .git/COMMIT_EDITMSG, or .git/rebase-merge/git-rebase-todo for git rebase -i).
The new capability is the bypass itself: without this gap, the same attacker-supplied value under EDITOR, GIT_EDITOR or GIT_SEQUENCE_EDITOR is refused unless the consumer explicitly opts in to allowUnsafeEditor. With VISUAL, the equivalent code execution proceeds with no opt-in and no reported vulnerability. VISUAL also takes precedence over EDITOR, the variable the parser does flag.
Scoring note: no CVSS vector or score is available for this finding, and one is not asserted here. Exploitability depends on the consuming application's data flow — specifically whether attacker-influenced environment entries reach the Git child environment. Consumers that never forward untrusted environment values into Git, or that always set a higher-priority GIT_EDITOR or core.editor, are not affected.
Preconditions
- The consumer forwards attacker-influenced environment entries into the environment passed to child Git (for example via simple-git's
.env()), and classifies them with this parser before spawn. - The Git command opens an editor — for example
commitwithout-m,commit --amend, orrebase -i. - No higher-priority editor setting overrides
VISUAL:GIT_EDITOR,core.editorandEDITORare absent…
- Record
GHSA-v5rq-49vh-5v5c- CVSS 4.0
- 9.2 Critical
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N - Weakness
- CWE-184, CWE-78
- Updated
- 2026-11-02
OSVCLSA-2026-1792595414 No score
TuxCare security update for @simple-git/argv-parser (1 CVE)
TuxCare rebuilt @simple-git/argv-parser to address 1 CVE. Fixed in 1.1.1-tuxcare.1.
- Record
CLSA-2026-1792595414- Updated
- 2026-11-02
OSVCLSA-2026-1792758525 No score
TuxCare security update for @simple-git/argv-parser (3 CVEs)
TuxCare rebuilt @simple-git/argv-parser to address 3 CVEs. Fixed in 1.1.1-tuxcare.2.
- Record
CLSA-2026-1792758525- Updated
- 2026-11-02
OSVROOT-APP-NPM-CVE-2026-102829 No score
CVE-2026-102829 in @simple-git/argv-parser - Patched by Root
Root has patched CVE-2026-102829 in the @simple-git/argv-parser package for Root:npm. Multiple fixed versions available.
- Record
ROOT-APP-NPM-CVE-2026-102829- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
@simple-git/argv-parsernpm |
before 2.0.1 | 2.0.1 |
@simple-git/argv-parserTuxCare:npm |
1.1.1-tuxcare.0 up to 1.1.1-tuxcare.1, plus listed versions 1.1.1 |
1.1.1-tuxcare.1 |
@simple-git/argv-parserTuxCare:npm |
1.1.1-tuxcare.0 up to 1.1.1-tuxcare.2, plus listed versions 1.1.11.1.1-tuxcare.1 |
1.1.1-tuxcare.2 |
@simple-git/argv-parserRoot:npm |
before 1.1.1-aikido.2 | 1.1.1-aikido.2 |
@rootio/simple-git__argv-parserRoot:npm |
before 1.1.1-root.io.2 | 1.1.1-root.io.2 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-102829 is a critical vulnerability (CVSS 9.2) in Steveukx Git-js, published September 29, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.35%, the 29th percentile. Fixed in @simple-git/argv-parser 2.0.1.
References
github.com/steveukx/git-js/security/advisories/GHSA-v5rq-49vh-5v5c
github.com/steveukx/git-js/pull/1201
github.com/steveukx/git-js/commit/68874c239f0c7a87f4a68c3d2c4a0d7c75bb27f4
github.com/steveukx/git-js/releases/tag/@simple-git/[email protected]
nvd.nist.gov/vuln/detail/CVE-2026-102829
github.com/advisories/GHSA-v5rq-49vh-5v5c
github.com/CVEProject/cvelistV5/tree/main/cves/2026/102xxx/CVE-2026-102829.json
github.com/steveukx/git-js
Left out here: the rest of 2 source descriptions. The JSON record has them.