CVE-2026-100369 is a high-severity (CVSS 8.4) CWE-88 vulnerability in CliInvoke. A fix is available for CliInvoke — see the affected versions and patch details below.
CliInvoke: Argument Injection in Extensibility Runner Factory
Exploitation Status
No confirmed exploitation observed yet
- A successful exploit gives an attacker total control of the affected component, not partial access.
- CISA’s own triage has not observed active exploitation or public proof-of-concept code for this CVE as of its last assessment.
Exploitation and automatability from CISA’s SSVC triage for CVE-2026-100369.
EPSS Exploitation Probability
Probability of exploitation in the next 30 days, from FIRST.org EPSS.
How urgent is this, really
CVE-2026-100369 by exploitation likelihood (EPSS) against impact (CVSS). Outside the shaded patch-first corner.
Where this sits among everything scored
Of 394,415 CVEs with a current EPSS score, this one falls in the < 10% band (highlighted). Counts from FIRST.org, log-scaled.
Real-World Exposure
CliInvoke.NETCliInvoke.NETCliInvoke.NETCliInvoke.NETAlastairLundy.CliInvokeReal-time download stats are indexed for npm and PyPI packages. This vulnerability affects NuGet packages — download data is not available via public APIs for these ecosystems.
Description
CliInvoke and its formerly named AlastairLundy.CliInvoke package are .NET libraries for invoking command-line programs and wrapping executable processes. CliInvoke versions 2.0.0 through 2.8.4, 2.9.0 through 2.9.3, 2.10.0 through 2.10.4, and 3.0.0-alpha.1 through 3.0.0-beta.1, as well as AlastairLundy.CliInvoke versions 2.0.0-alpha.1 through 2.0.0, contain an argument-injection vulnerability in RunnerProcessFactory on the 2.x line and RunnerConfigurationFactory on the 3.x line. These factories combine runner arguments, a caller-controlled target, and caller-controlled arguments into one ProcessStartInfo.Arguments string, allowing a double quote in the target or an argument to terminate an operating-system-level quoted region and inject unintended elements into the runner’s argument vector, potentially resulting in arbitrary command execution when a shell runner is used. The vulnerability is patched in CliInvoke versions 2.8.5, 2.9.4, 2.10.5, and 3.0.0-beta.2, and in AlastairLundy.CliInvoke version 2.0.2. No complete workaround is available; users unable to upgrade can partially mitigate the issue by removing double quotes from targets and arguments, additionally removing shell metacharacters when using shell runners, or bypassing the vulnerable factory and constructing a ProcessConfiguration with an explicit ArgumentList.
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| .NETNuGet | CliInvoke | ≥ 2.0.0&&< 2.8.5 | 2.8.5dotnet add package CliInvoke --version 2.8.5 |
| .NETNuGet | CliInvoke | ≥ 2.9.0&&< 2.9.4 | 2.9.4dotnet add package CliInvoke --version 2.9.4 |
| .NETNuGet | CliInvoke | ≥ 2.10.0&&< 2.10.5 | 2.10.5dotnet add package CliInvoke --version 2.10.5 |
| .NETNuGet | CliInvoke | ≥ 3.0.0-alpha.1&&< 3.0.0-beta.2 | 3.0.0-beta.2dotnet add package CliInvoke --version 3.0.0-beta.2 |
| .NETNuGet | AlastairLundy.CliInvoke | ≥ 2.0.0-alpha.1&&< 2.0.2 | 2.0.2dotnet add package AlastairLundy.CliInvoke --version 2.0.2 |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for CliInvoke, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Fix
Update CliInvoke to 2.8.5 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms CVE-2026-100369 is resolved across your whole dependency graph.
Workarounds
If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.
Frequently Asked Questions
Is CVE-2026-100369 in your dependencies?
Find it across NuGet, including transitive dependencies.