
Loading

Loading
We use strictly necessary cookies to run this site, and analytics cookies to understand how it's used. See our Privacy Policy for details.
A GitHub-reviewed security advisory, not necessarily under active exploitation the way our CISA KEV advisories are, but a real, disclosed vulnerability in an open-source dependency.
Affected packages
Vulnerable: >= 0.4.0, <= 0.47.0
Patched in 0.47.1
Details
Atlantis passes the Terraform workspace value from a pull request's atlantis.yaml into a shell command without quoting or escaping it.
A contributor whose pull request is eligible for an Atlantis plan can include shell metacharacters in the workspace name and execute arbitrary commands as the Atlantis service account. This does not require custom workflows, allow_custom_workflows, or permission to run terraform apply.
The executed command inherits the Atlantis process environment, which commonly contains cloud-provider, Terraform, and VCS credentials.
Verified against current upstream/main commit 92ce5c51d1a050357e44df3535483425e59fa984 on August 13, 2026.
The vulnerable data flow is:
The PR-controlled project workspace is validated in server/core/config/raw/project.go.
Validation rejects only .., /, and \. Shell metacharacters such as ;, #, $, redirections, and whitespace remain permitted.
The workspace is passed directly as a Terraform command argument in server/core/runtime/workspace_step_runner_delegate.go:
[]string{workspaceCmd, "select", ctx.Workspace}
Terraform arguments are concatenated into a single string using strings.Join(args, " ") in server/core/terraform/tfclient/terraform_client.go:
tfCmd := fmt.Sprintf("%s %s", binPath, strings.Join(args, " "))
The resulting string is executed through sh -c in server/core/terraform/tfclient/terraform_client.go:
cmd := exec.Command("sh", "-c", tfCmd)
Consequently, a workspace such as:
poc;id;false;#
produces commands equivalent to:
terraform workspace select poc;id;false;#
terraform workspace new poc;id;false;#
raw.Project.Validate() was confirmed to return no error for this workspace value.
Atlantis documents that planning untrusted Terraform can already be dangerous because providers and external data sources execute code. The distinct issue here is that an ordinary project configuration field becomes shell source, bypassing the explicit allow_custom_workflows control and requiring no malicious provider, external data source, custom workflow, or apply operation.
The primary remediation should be to execute Terraform using an argument vector rather than constructing shell source—for example, exec.Command(binaryPath, args...). Any required environment-variable expansion should be performed without invoking a shell. Strict workspace-name validation would also provide defense in depth.
Only reproduce this against a disposable Atlantis instance and test repository.
atlantis.yaml from the pull request branch.atlantis plan.--allow-fork-prs enabled. A same-repository branch does not require this flag.Create main.tf:
terraform {
required_version = ">= 1.0"
}
Create atlantis.yaml:
version: 3
projects:
- name: workspace-rce-poc
dir: .
workspace: "poc;id;false;#"
autoplan:
enabled: false
Open a pull request containing these files and comment:
atlantis plan -p workspace-rce-poc
Atlantis first runs terraform workspace select. The injected false causes that command invocation to return an error, so Atlantis retries using terraform workspace new.
On both attempts, the shell executes id as a separate command. The second failure includes the combined command output in the Atlantis error response, exposing output similar to:
uid=1000(atlantis) gid=1000(atlantis) groups=1000(atlantis)
This demonstrates arbitrary shell-command execution without creating a custom workflow or reaching the apply phase.
The payload uses only id and false and does not access credentials, make network requests, or modify the host beyond Terraform potentially creating the disposable poc workspace.
This is an OS command injection vulnerability resulting in remote code execution as the Atlantis service account.
Affected deployments are those that:
atlantis.yaml project configuration; andPotential consequences include:
For public repositories, arbitrary external contributors are directly exposed when --allow-fork-prs is enabled. Without fork PR support, the vulnerable population includes users able to create eligible same-repository pull requests and attackers controlling such accounts.
Talk to us about this
Find out whether this dependency (or others like it) is actually reachable in your codebase.
Get help patching, or building dependency-scanning into your pipeline going forward.
A secure code review or supply chain review finds this before an advisory does.