Sep 26, 2026·5 min read·21 visits
CliInvoke process runner factories are vulnerable to argument injection via double-quote manipulation. This allows local attackers to execute arbitrary system commands when wrapper shell runners are used. Fixes are available in versions 2.8.5, 2.9.4, 2.10.5, and 3.0.0-beta.2.
An argument injection vulnerability (CWE-88) in CliInvoke and AlastairLundy.CliInvoke allows local attackers to execute arbitrary system commands. By injecting double-quote characters into target file paths or arguments, attackers can terminate operating-system-level quoted boundaries and introduce new commands when shell runners are utilized.
The .NET libraries CliInvoke and AlastairLundy.CliInvoke are designed to invoke command-line programs and wrap executable processes. They provide abstraction layers for process management, configuration, and invocation. The attack surface of these libraries is exposed when applications take untrusted, user-controlled input and pass it directly to executable process configurations.\n\nThe primary flaw is classified under CWE-88 (Improper Neutralization of Argument Delimiters in a Command). The runner factories fail to adequately neutralize double-quote characters when assembling a combined argument string. This design allows local attackers to manipulate the parameters of downstream process executions, potentially achieving arbitrary system command execution.
Prior to the security patch, RunnerProcessFactory (in the 2.x release branch) and RunnerConfigurationFactory (in the 3.x release branch) dynamically combined runner configurations with target process parameters. The library consolidated the runner arguments, target file path, and target process arguments into a single string using string interpolation.\n\nThis interpolated string was then directly assigned to the ProcessStartInfo.Arguments property. While the library leveraged escaping utilities like ShellArgumentEscaper.EscapeForCmd or ShellArgumentEscaper.EscapeForPowerShell, the escaping model relied on the operating system's command parser to split the single argument string back into an argument vector. This process failed when the input path or arguments contained double quotes.\n\nInjecting a double quote (") into the target executable path or its associated arguments terminates the quoted region at the operating-system level. The parser treats subsequent characters as separate parameters or script elements rather than part of the intended path or argument. This allows for command execution under wrapper configurations.
The original vulnerable code path performed straightforward string interpolation to build the parameters. The target execution properties were merged directly:\n\ncsharp\n// Vulnerable interpolated construction\nstring combinedArgs = $"{runnerProcessConfig.Arguments} {processConfigToBeRun.TargetFilePath} {processConfigToBeRun.Arguments}".Trim();\nprocessStartInfo.Arguments = combinedArgs;\n\n\nThe patch remediates this injection vector by discarding raw string concatenation. The fix implements an internal state-machine tokenizer (ArgumentTokenizer) to tokenize argument strings into discrete, independent entries. This allows the libraries to securely isolate user input.\n\ncsharp\n// ArgumentTokenizer tokenizing loop\nfor (int i = 0; i < text.Length; i++) {\n char c = text[i];\n if (c == '"') {\n if (inQuotes && i + 1 < text.Length && text[i + 1] == '"') {\n current.Append('"');\n i++;\n continue;\n }\n inQuotes = !inQuotes;\n continue;\n }\n if (!inQuotes && char.IsWhiteSpace(c)) {\n if (current.Length > 0) {\n tokens.Add(current.ToString());\n current.Clear();\n }\n continue;\n }\n current.Append(c);\n}\n\n\nIn addition to tokenization, the patch transitions to utilizing the native .NET structured invocation mechanism. On platforms running .NET 8.0 or greater, the library populates the native ProcessStartInfo.ArgumentList collection instead of writing to the single .Arguments string property. This structured API ensures the operating system handles quote escaping safely and isolates each token from the command shell's parsing engine.
An attacker can exploit this vulnerability if they control the parameters parsed by the runner process factory. For example, if a target application executes commands through a shell runner such as PowerShell (pwsh.exe -Command), the attacker can supply a crafted file path to trigger the execution breakout.\n\nA conceptual payload targeting a PowerShell runner utilizes double quotes to terminate the path argument. The attacker configures the target file path to: app"evil.exe. The vulnerable library compiles this configuration into the following single string:\n\npowershell\npwsh.exe -NoProfile -Command & "app"evil.exe" safe\n\n\nWhen the PowerShell shell parser reads this command line, it interprets & "app" as a complete command token. The subsequent characters (evil.exe) are interpreted as a distinct, new executable token. This causes the shell interpreter to run the injected executable (evil.exe) instead of passing it as a sub-argument, resulting in unauthorized command execution.
The impact of this vulnerability depends on the permissions of the parent application calling CliInvoke. Successful exploitation results in arbitrary local command execution with the privileges of the active .NET process. This can lead to local privilege escalation, unauthorized system configuration changes, and data exfiltration if the parent process has high system privileges.\n\nThe CVSS v3.1 score of 8.4 reflects the high severity of the vulnerability. The low attack complexity and the lack of user interaction requirements increase the likelihood of success if an application processes untrusted command arguments. However, because it is an argument injection flaw targeting a local utility library, the attack vector is classified as Local (AV:L), which mitigates broader remote exploitation unless a remote interface passes input directly to the library.
The primary remediation strategy is upgrading all dependent packages to their patched versions. For the CliInvoke NuGet package, users must upgrade to version 2.8.5, 2.9.4, 2.10.5, or 3.0.0-beta.2 (or later). For the legacy AlastairLundy.CliInvoke package, users must upgrade to version 2.0.2.\n\nDevelopers should target .NET 8.0 or newer runtimes for their compiled applications. Targeting .NET 8.0 enables the library's adapter layer to map configurations directly to ProcessStartInfo.ArgumentList, fully neutralizing string-parsing breakout vectors.\n\nIf upgrading is not immediately feasible, developers can mitigate the flaw by implementing input sanitization. This involves filtering out double-quote characters from target paths and arguments before passing them to the factories. Additionally, developers can manually construct target configurations by bypassing the vulnerable factory and populating the process parameters through explicit token lists.
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
CliInvoke Alastair Lundy | >= 2.0.0, <= 2.8.4 | 2.8.5 |
CliInvoke Alastair Lundy | >= 2.9.0, <= 2.9.3 | 2.9.4 |
CliInvoke Alastair Lundy | >= 2.10.0, <= 2.10.4 | 2.10.5 |
CliInvoke Alastair Lundy | >= 3.0.0-alpha.1, <= 3.0.0-beta.1 | 3.0.0-beta.2 |
AlastairLundy.CliInvoke Alastair Lundy | >= 2.0.0-alpha.1, <= 2.0.0 | 2.0.2 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-88 |
| Attack Vector | Local (AV:L) |
| CVSS Base Score | 8.4 (High) |
| EPSS Score | N/A |
| Exploit Status | Proof-of-Concept |
| CISA KEV Status | Not Listed |
The product constructs a command string by combining user-controlled input with fixed command arguments without properly neutralizing delimiters (such as double quotes) that separate arguments.
A reflected Cross-Site Scripting (XSS) vulnerability exists in the Kubeflow Pipelines frontend server prior to version 2.15.0. Specifically, the Express route handlers for '/pipeline/k8s/pod' and '/pipeline/k8s/pod/events' reflect unvalidated 'podname' and 'podnamespace' query parameters, along with backend Kubernetes API error messages, directly into HTML-capable HTTP error responses. An unauthenticated attacker can exploit this flaw by convincing an authenticated user to visit a crafted URL, resulting in arbitrary JavaScript execution within the context of the Kubeflow Pipelines frontend origin.
CVE-2026-88984 (GHSA-ghgh-57qv-h687) is an incorrect authorization vulnerability affecting Kubeflow Pipelines (KFP) prior to version 2.16.1 in multi-user deployments. The multi-user API server treats the empty Kubernetes namespace associated with shared or global pipelines as an unconditional authorization exception across all API verbs. Consequently, any authenticated user can modify, overwrite, or delete shared pipeline definitions and pipeline versions without possessing the required Kubernetes RBAC permissions, compromising the integrity and availability of global machine learning workflows.
Prior to version 2.31.0, the Telepresence Traffic Manager exposed an unauthenticated gRPC API on cluster-internal port 8081 that lacked caller identity verification and Kubernetes RBAC authorization checks. An attacker operating any pod with network access to the Traffic Manager can register a session in an arbitrary managed namespace, establish service intercepts, redirect live production traffic, and exfiltrate the complete container environment of victim workloads, including mounted secrets and service account tokens.
CVE-2026-63198 (GHSA-8cfq-jgf7-8m27) is an incorrect authorization vulnerability (CWE-863) in traQ, an open-source messaging platform developed in Go by Digital Creators Club traP. The flaw resides in the OAuth 2.0 authorization endpoint handler (`router/oauth2/authorization_endpoint.go`). When processing silent authorization requests (`prompt=none`) with an omitted or empty `scope` parameter, the application evaluates prior user consent against the empty requested scope set prior to applying default scope fallback logic. Because an empty set vacuously satisfies the subset check against any existing token, consent verification succeeds if the user has ever authorized the client for any single scope. Subsequently, the token issuance logic defaults the empty scope parameter to all scopes registered to the client (`req.ValidScopes`), allowing a client application with partial consent to silently escalate privileges without user interaction.
CVE-2026-63475 (GHSA-96wc-2m84-2cj7) is an uncontrolled recursion and infinite loop vulnerability in isomorphic-git prior to version 1.38.6. When processing Git protocol responses from a malicious or man-in-the-middle (MitM) server, isomorphic-git writes server-advertised symbolic reference (symref) capabilities directly to the local repository filesystem without validating for circular dependencies. Because the reference resolution logic in GitRefManager.resolve() lacks both cycle detection and a default recursion depth limit, any subsequent operation that resolves the circular references enters a non-terminating asynchronous recursion loop. Because the malicious references are persisted on disk, this condition induces a persistent denial of service (DoS) against the affected repository.
CVE-2026-63470 (GHSA-h667-4jj2-cgv4) is a code injection vulnerability (CWE-94) in fastapi-code-generator prior to version 0.8.1. The tool generates FastAPI route handlers by directly interpolating the OpenAPI Operation.summary field into triple-double-quoted Python docstrings without escaping embedded triple quotes or backslashes. An attacker who supplies or modifies an OpenAPI specification can break out of the docstring literal and inject arbitrary Python expressions into the generated route handler body, resulting in remote code execution when the affected HTTP endpoint is called.