/

CVE-2026-111451

Severity:

HIGH RISK

(7.8)

Command Injection (CWE-78) in Wheels CLI Deployment Tooling

CVE-2026-111451

Deferred

Vulnerability type

Category:

Command Injection

CWE:

CWE-78

Impact:

Command execution, arbitrary file modification, code injection, and related integrity or availability compromise

Severity:

HIGH RISK

(7.8)

CVSS version:

3.1

Catch this CVE while code is being written

Detect vulnerable code directly in pull requests, so CVEs are fixed before merge.

Summary

Wheels CLI insufficiently validates or escapes values and package contents used by deployment, build, packaging, and code-generation workflows. Under conditions where attacker-influenced inputs reach these paths, commands may execute with the SSH user's or CI runner's privileges, while related flaws may enable file destruction, overwrite, code injection, stored XSS, or termination of an unrelated process.

Wheels CLI insufficiently validates or escapes values and package contents used by deployment, build, packaging, and code-generation workflows. Under conditions where attacker-influenced inputs reach these paths, commands may execute with the SSH user's or CI runner's privileges, while related flaws may enable file destruction, overwrite, code injection, stored XSS, or termination of an unrelated process.

Affected context

The issue affects Wheels CLI workflows that consume caller-controlled values or package contents, including deploy, release, rollback, package removal, destroy, extraction, generator, scaffold, admin-view, and RustCFML server commands. Inputs may come from CI variables, branch names, uploaded packages, generated names, or an AI agent invoking the CLI through MCP tools. Risk depends on whether these inputs can reach shell commands, filesystem paths, generated source, rendered views, or process-management logic without sufficient validation and escaping.

The issue affects Wheels CLI workflows that consume caller-controlled values or package contents, including deploy, release, rollback, package removal, destroy, extraction, generator, scaffold, admin-view, and RustCFML server commands. Inputs may come from CI variables, branch names, uploaded packages, generated names, or an AI agent invoking the CLI through MCP tools. Risk depends on whether these inputs can reach shell commands, filesystem paths, generated source, rendered views, or process-management logic without sufficient validation and escaping.

Exploit preconditions

  • Attack surface: Wheels CLI deployment, build, packaging, code-generation, view-generation, and server-management commands
  • Required access: Ability to influence relevant CLI arguments, CI variables, branch or release metadata, package contents, generator names, generated display properties, or MCP tool requests
  • Trigger point: Deployment or rollback execution, CI builds, package removal or extraction, code generation, view rendering, or RustCFML server command handling
  • Why exploitation is possible: Caller-supplied data and package-controlled content can reach shell, filesystem, template, HTML, or process-control operations without adequate contextual validation, escaping, containment, or freshness checks
  • Attack surface: Wheels CLI deployment, build, packaging, code-generation, view-generation, and server-management commands
  • Required access: Ability to influence relevant CLI arguments, CI variables, branch or release metadata, package contents, generator names, generated display properties, or MCP tool requests
  • Trigger point: Deployment or rollback execution, CI builds, package removal or extraction, code generation, view rendering, or RustCFML server command handling
  • Why exploitation is possible: Caller-supplied data and package-controlled content can reach shell, filesystem, template, HTML, or process-control operations without adequate contextual validation, escaping, containment, or freshness checks

Why this happens

The primary weakness is command injection, mapped to CWE-78, caused by treating externally influenced values as trusted command or shell-language components. Related insecure patterns include constructing filesystem paths without enforcing a trusted root, extracting archives without collision and path-boundary checks, inserting untrusted data into generated CFML or HTML, and using stale process identifiers for termination. The common underlying problem is insufficient separation between data and executable instructions, combined with incomplete validation at trust boundaries.

The primary weakness is command injection, mapped to CWE-78, caused by treating externally influenced values as trusted command or shell-language components. Related insecure patterns include constructing filesystem paths without enforcing a trusted root, extracting archives without collision and path-boundary checks, inserting untrusted data into generated CFML or HTML, and using stale process identifiers for termination. The common underlying problem is insufficient separation between data and executable instructions, combined with incomplete validation at trust boundaries.

Potential impact

  • An attacker may execute shell commands on a deployment host as the SSH user.
  • An attacker may execute commands on a CI runner during builds.
  • Unintended files may be deleted or unrelated vendor files may be overwritten.
  • Generated files may be written outside the intended project directory.
  • Generated CFML may contain attacker-controlled executable logic.
  • Stored cross-site scripting may affect users viewing generated scaffold or admin pages.
  • A stale process identifier may cause an unrelated process to be terminated.
  • Build, deployment, package, or project integrity may be compromised.
  • An attacker may execute shell commands on a deployment host as the SSH user.
  • An attacker may execute commands on a CI runner during builds.
  • Unintended files may be deleted or unrelated vendor files may be overwritten.
  • Generated files may be written outside the intended project directory.
  • Generated CFML may contain attacker-controlled executable logic.
  • Stored cross-site scripting may affect users viewing generated scaffold or admin pages.
  • A stale process identifier may cause an unrelated process to be terminated.
  • Build, deployment, package, or project integrity may be compromised.

General mitigation guidance

Mitigation generally focuses on treating every CLI input and package member as untrusted data.

Common defensive patterns include:

  • Prefer direct process-execution APIs with fixed argument arrays over shell command construction.
  • Apply context-appropriate escaping only as a secondary control, not as a substitute for input allowlisting.
  • Validate release, version, rollback, branch, and generator values against restrictive schemas.
  • Canonicalize paths and enforce containment within approved project, package, and extraction directories.
  • Reject archive entries that traverse directories, collide with protected files, or target files outside the extraction root.
  • Generate code and views using safe templates with explicit output encoding and no executable interpolation of untrusted values.
  • Encode display properties for the relevant output context, including existing generated views that require remediation.
  • Use fresh, ownership-checked process identifiers and verify process identity before termination.
  • Run CI jobs and deployment actions with least privilege, isolated workspaces, restricted credentials, and limited filesystem access.
  • Treat AI-agent and MCP tool inputs as untrusted and constrain them through explicit tool schemas and authorization policies.

Mitigation generally focuses on treating every CLI input and package member as untrusted data.

Common defensive patterns include:

  • Prefer direct process-execution APIs with fixed argument arrays over shell command construction.
  • Apply context-appropriate escaping only as a secondary control, not as a substitute for input allowlisting.
  • Validate release, version, rollback, branch, and generator values against restrictive schemas.
  • Canonicalize paths and enforce containment within approved project, package, and extraction directories.
  • Reject archive entries that traverse directories, collide with protected files, or target files outside the extraction root.
  • Generate code and views using safe templates with explicit output encoding and no executable interpolation of untrusted values.
  • Encode display properties for the relevant output context, including existing generated views that require remediation.
  • Use fresh, ownership-checked process identifiers and verify process identity before termination.
  • Run CI jobs and deployment actions with least privilege, isolated workspaces, restricted credentials, and limited filesystem access.
  • Treat AI-agent and MCP tool inputs as untrusted and constrain them through explicit tool schemas and authorization policies.

How teams detect issues like this

Organizations commonly detect these weaknesses through:

  • Static analysis for shell command construction, command interpolation, unsafe subprocess usage, and missing argument boundaries.
  • Code review checks for path concatenation, archive extraction, recursive deletion, generated-code interpolation, and unencoded HTML output.
  • Tests using metacharacters, traversal sequences, collisions, malformed package entries, and stale process identifiers in isolated environments.
  • Policy enforcement that restricts CI credentials, deployment command capabilities, filesystem roots, and MCP tool permissions.
  • Review of generated artifacts for executable CFML, unsafe HTML, unexpected files, and writes outside approved directories.
  • Runtime monitoring for unusual child processes, destructive file operations, unexpected package changes, and process termination events.
  • Automated security review tools can help identify risky command, path, archive, template, and output-encoding patterns, but findings should be validated in the deployment context.

Organizations commonly detect these weaknesses through:

  • Static analysis for shell command construction, command interpolation, unsafe subprocess usage, and missing argument boundaries.
  • Code review checks for path concatenation, archive extraction, recursive deletion, generated-code interpolation, and unencoded HTML output.
  • Tests using metacharacters, traversal sequences, collisions, malformed package entries, and stale process identifiers in isolated environments.
  • Policy enforcement that restricts CI credentials, deployment command capabilities, filesystem roots, and MCP tool permissions.
  • Review of generated artifacts for executable CFML, unsafe HTML, unexpected files, and writes outside approved directories.
  • Runtime monitoring for unusual child processes, destructive file operations, unexpected package changes, and process termination events.
  • Automated security review tools can help identify risky command, path, archive, template, and output-encoding patterns, but findings should be validated in the deployment context.

Sources

SourceLink
github.comgithub.com/wheels-dev/wheels/security/advisories/GHSA-cghp-86c6-6fjc

Frequently asked

questions

Exploitability depends on the deployment architecture and input path. It may be reachable through CI metadata, package contents, deployment automation, or an AI agent's MCP request when those inputs are accepted without trusted mediation.

An attacker generally needs to influence a relevant CLI argument, environment value, branch or release name, package, generated property, or tool request. The resulting impact is governed by the privileges of the SSH user, CI runner, or local process.

Keep data separate from commands, use fixed executable arguments, validate and constrain paths and package entries, apply contextual output encoding, and verify process identity before destructive actions.

Use allowlisted schemas, isolated least-privilege execution, safe generation and rendering templates, archive-boundary checks, secure CI policies, and security tests covering command, path, package, HTML, and process-management inputs.

Exploitability depends on the deployment architecture and input path. It may be reachable through CI metadata, package contents, deployment automation, or an AI agent's MCP request when those inputs are accepted without trusted mediation.

An attacker generally needs to influence a relevant CLI argument, environment value, branch or release name, package, generated property, or tool request. The resulting impact is governed by the privileges of the SSH user, CI runner, or local process.

Keep data separate from commands, use fixed executable arguments, validate and constrain paths and package entries, apply contextual output encoding, and verify process identity before destructive actions.

Use allowlisted schemas, isolated least-privilege execution, safe generation and rendering templates, archive-boundary checks, secure CI policies, and security tests covering command, path, package, HTML, and process-management inputs.

Find out what's already
exploitable in your codebase.