Security teams should treat every workflow input as untrusted and avoid passing user-controlled values directly into shell steps. Use pinned action versions, restrict token permissions to the minimum needed, and isolate sensitive operations from issue text, pull request fields, and other external data. Command injection in build automation often becomes a supply chain issue, because one weak step can expose secrets or modify release artifacts.
Why Command Injection in CI/CD Becomes a Workflow Trust Problem
Command injection in CI/CD is not just a scripting bug, because the workflow often runs with access to source code, tokens, signing material, package registries, or deployment credentials. When third-party actions are involved, the risk expands to the imported action code itself, its update path, and the permissions inherited from the calling workflow. The core failure is trusting external text or external code as if it were local, controlled input.
Security teams should think in terms of trust boundaries. Workflow inputs, pull request fields, issue text, and action parameters can all become execution material if they are interpolated into shell commands or passed into scripts without validation. Third-party actions add another boundary, because the action version, maintainer, and dependency chain all influence whether a seemingly harmless step can execute arbitrary commands.
One practical way to reduce exposure is to separate data handling from command construction. Use explicit arguments instead of string concatenation, quote and validate all variables, and prefer fixed command templates over dynamic shell expansion. Where the workflow must transform external text, treat that as data processing, not executable instruction.
How Third-Party Actions Change the Attack Surface
Third-party actions can be useful, but they also widen the blast radius of a workflow compromise. A pinned action that has not been reviewed is still code running inside your automation context, and a mutable reference such as a branch or tag creates update risk. The safer pattern is to pin to an immutable commit SHA, review what the action actually does, and limit the permissions granted to the job that calls it.
The choice of action also affects how much the workflow can expose if the action is compromised. If an action can read secrets, write to release artifacts, or publish to external systems, then a successful injection or supply-chain compromise becomes more than a failed build. It can become secret theft, artifact tampering, or unauthorized release activity. CI/CD Pipeline Identity Security Guide is useful here because it ties pinned actions, token scoping, and trusted publishing together as one control set.
Teams should also distinguish between workflow logic they own and code they import. If an external action is performing shell work, network access, or file writes, it deserves the same scrutiny you would give any other untrusted dependency. That is especially true where the action is fed by repository metadata or pull request content that an attacker can influence.
Controls That Matter Most in Practice
The strongest controls are the ones that reduce both execution opportunity and available privilege. Use least-privilege tokens, disable write access unless a job truly needs it, and scope secrets to the smallest possible job or environment. Where possible, move sensitive steps such as signing, publishing, or deployment into isolated jobs that do not process untrusted text at all.
Version pinning should be paired with dependency hygiene. A pinned action only helps if you can detect when you need to update it, review the diff, and redeploy confidently. For the broader supply-chain angle, SLSA is the right reference for build provenance and integrity, because it reinforces the idea that the workflow output must be traceable to reviewed inputs and controlled build steps.
Security teams should also use workflow design to reduce exposure from external data. Do not let issue text or pull request fields drive shell execution, and do not mix approval logic with code paths that can be influenced by contributors. If a workflow needs to comment on or label a pull request, keep that path separate from anything that touches secrets, release artifacts, or deployment credentials.
Risk and Threat Considerations
Command injection in CI/CD is dangerous because the attacker does not need to break the whole pipeline, only the step that turns untrusted text into a command. Once that happens, the workflow's own privilege can be reused to read secrets, alter artifacts, or publish compromised output.
Failure mechanism: An external input, such as pull request text or an action parameter, is interpolated into a shell command or imported action code path without strict control, allowing arbitrary command execution under workflow privileges.
Impact: The result can be secret exposure, malicious artifact modification, unauthorized release activity, or broader supply-chain compromise that persists beyond the initial workflow run.
Standards & Framework Alignment
This section maps relevant standards and security frameworks to the operational risks and controls described in this guidance.
SLSA, NIST SP 800-53 Rev 5 and OWASP ASVS set the governance and control requirements practitioners need to meet.
| Framework | Control / Reference | Relevance |
|---|---|---|
| SLSA | Supply chain integrity | CI/CD command injection can tamper with build provenance and release artifacts. |
| Recommendation — Apply SLSA practices to pin provenance and verify artifact integrity before release. | ||
| NIST SP 800-53 Rev 5 | AC-6 — Least Privilege | Workflow jobs should only have the permissions needed for the task. |
| CM-7 — Least Functionality | Reducing workflow capabilities limits what injected commands can do. | |
| Recommendation — Enforce least privilege on CI/CD jobs and tokens to reduce injection blast radius. Disable unnecessary workflow capabilities and shell paths to shrink attack surface. | ||
| OWASP ASVS | V15 — Secure Coding and Architecture | The issue is fundamentally unsafe command construction from untrusted input. |
| V13 — Configuration | Pinned versions and restricted permissions are configuration controls for trusted workflows. | |
| Recommendation — Refactor workflow logic so external data cannot become executable shell input. Lock action versions and permissions in workflow configuration before enabling release jobs. | ||
Practitioner Guidance
What to prioritize: Audit every workflow step that combines external input with shell execution, then remove the highest-risk cases first, especially anything that can reach secrets, deployment credentials, or signing tasks.
What to verify: Confirm that third-party actions are pinned to immutable versions, that job permissions are minimal, and that sensitive steps are isolated from any untrusted repository content.
Common mistake: Teams often secure the repository secret store but leave the workflow logic itself too permissive. If the workflow can be steered into executing commands, the secrets are already at risk.
Practitioner takeaway: The safest CI/CD design is one where untrusted data can influence build output only as data, never as executable instruction, and where third-party actions cannot inherit more privilege than the job truly needs.
Related resources from NHI Mgmt Group
- How should security teams reduce the risk of prompt injection in LLM applications that call third-party libraries?
- How should security teams reduce breach risk when third-party services are involved in business workflows?
- How should security teams manage third-party software risk in CI/CD pipelines instead of relying only on vendor questionnaires?
- How should security teams reduce command injection risk in editor integrations that call external package managers?
Deepen Your Knowledge
Reviewed and updated by the NHIMG editorial team on September 29, 2026.
NHI Mgmt Group — the #1 independent authority on Non-Human Identity, IAM, and Agentic AI security. nhimg.org