Live › vulnerability › CVE-2026-102827
simple-git's default protection against dangerous git options misses abbreviated spellings such as --receive-p and --exe on git push. An attacker who influences push options or arguments can make git execute an arbitrary shell command on a local or file-path remote.
Summary written from the sources below. Check the originals before acting.
First seen by InfraStack 2026-10-31 16:25 UTC, 0h before NVD. All times on this page are UTC.
Applications that use simple-git's default unsafe-operations plugin and pass attacker-influenced options or arguments into git push, especially to local or file-path remotes. Apps that never feed external input into push calls or only push to remote network hosts are less exposed, though the sources do not quantify that risk.
| Product | Ecosystem | Affected | Fixed in |
|---|---|---|---|
| simple-git | npm | <= 3.36.0 | 4.0.0 |
| simple-git project simple-git | vendor | < 4.0.0 | 4.0.0 |
npm ls simple-git and npm ls @simple-git/argv-parser; versions at or below 3.36.0 are affected..push( calls that pass user-influenced options or arguments to simple-git.simple-git fixed in 4.0.0 (affected up to 3.36.0).Each row is the first time that source carried this signal. The analyst’s rows are its own findings.
simple-git's blockUnsafeOperationsPlugin blocks dangerous git options (--upload-pack/--receive-pack/--exec/...) unless the consumer opts in via unsafe:{allowUnsafePack:true}. Detection (@simple-git/argv-parser detectVulnerableFlags) matches the parsed flag NAME against literal-spelling patterns: /--(upload|receive)-pack/ (requires the literal '-pack') and the string '--exec'. But git accepts unambiguous prefix abbreviations of long options, and expandToken (token-expander.ts) returns the LITERAL token as flag.name (it uses the spec only for needsNext, never to canonicalize). So git push --receive-p=<cmd> parses with flag.name='--receive-p', which /--(upload|receive)-pack/ does NOT match, yet git expands --receive-p -> --receive-pack and runs <cmd> (on a local/file remote, locally). The clone side is robust (its '--u' substring rule catches every --upload* abbreviation); the push --receive-* and --exe* abbreviations have no equivalent rule and slip through.
Proof of concept (latest: simple-git 3.36.0, @simple-git/argv-parser 1.1.1, default unsafe plugin ON):
Gate vulnerabilityCheck: 'push --receive-pack=touch...' -> BLOCKED; 'push --receive-pa=touch...' and 'push --receive-p=touch...' -> BYPASS (empty vulns); '--exec=' BLOCKED, '--exe=' BYPASS.
End-to-end via simpleGit().push():
CONTROL git.push(['../bare','HEAD:refs/heads/c','--receive-pack=touch /tmp/pwned_ctrl;']) -> throws GitPluginError 'Use of --upload-pack or --receive-pack is not permitted...'; no command runs.
BYPASS git.push(['../bare','HEAD:refs/heads/e2e','--receive-p=touch /tmp/pwned_e2e;']) -> NO GitPluginError; /tmp/pwned_e2e CREATED (git executed the injected command); only a later GitError surfaces.
Direct git confirms git push ../bare --receive-p='touch X;' HEAD:refs/heads/m and --exe='touch Y;' both execute on a local/path remote.
Impact: any app relying on simple-git's default unsafe-operations protection while passing attacker-influenced options/args into a git push (local/file remote, or attacker-influenced receive-pack target) can be made to execute arbitrary commands -- the exact protection CVE-2026-28291 provided, defeated by an abbreviated spelling. Same class/impact as GHSA-jcxm-m3jx-f287, on the push path.
Remediation: canonicalize git option abbreviations before matching (resolve to the canonical long name via the per-task flag spec in expandToken), or match on the option stem/prefix down to the shortest unambiguous form for push receive-pack/exec (mirroring the clone-side '--u' approach). Also audit --template and -c/config-write detection for the same abbreviation gap.
Credit: anir0y (independent security research).
This page as .md · .json · in your agent: get_signal("CVE-2026-102827")
GitHub Advisory Database, CC-BY 4.0 · NVD data is provided by NIST and is public domain. Posts quoted belong to their authors.