Skip to content

CVE-2026-84502: Verified Reproduction

CVE-2026-84502: CVE-2026-84502: Ansible Automation Platform automation-controller — Project scm url argument injection into git ls-remote --upload-pack yields RCE on controller task pod

CVE-2026-84502 is verified against ansible/awx · github. Vulnerability class: RCE. This critical reproduction includes runnable sandbox proof, artifacts, and a plain-text agent view under REPRO-2026-00359.

REPRO-2026-00359 ansible/awx · github RCE Sep 24, 2026 CVE entry .txt
Severity
CRITICAL
Confidence
HIGH
Reproduced in
68m 55s
Tool calls
633
Spend
$33.56
01 · Overview

What Is CVE-2026-84502?

CVE-2026-84502 is a critical-severity RCE vulnerability affecting ansible/awx. Pruva has independently reproduced it and publishes a verified, runnable proof-of-concept (reproduction REPRO-2026-00359).

02 · Severity & CVSS

CVE-2026-84502 Severity

CVE-2026-84502 is rated critical severity.

CRITICAL threat level
Weakness CWE-88 — Improper Neutralization of Argument Delimiters in a Command ('Argument Injection')

Critical — the most severe class — typically remotely exploitable with severe impact. Treat as an emergency.

How to Reproduce CVE-2026-84502

$ pruva-verify REPRO-2026-00359
or curl -O https://www.pruva.dev/api/v1/reproductions/REPRO-2026-00359/artifacts/bundle/repro/reproduction_steps.sh && chmod +x reproduction_steps.sh && ./reproduction_steps.sh
Run in a VM or disposable container. This exploits a real vulnerability.
06 · Proof of Reproduction

Proof of Reproduction for CVE-2026-84502

Remote code execution — reproduced
  • reached the target end-to-end
  • full exploit chain demonstrated
  • on the real production code path
  • high confidence
  • the upstream fix blocks the same trigger
Trigger

Authenticated Project scm_url beginning with --upload-pack= and an attacker-selected shell command

Attack chain
  1. POST /api/v2/projects/ then POST /api/v2/projects/<id>/update/; AWX ProjectUpdate
  2. ansible Git module
  3. git ls-remote --upload-pack
How the agent worked 1,153 events · 633 tool calls · 1h 9m
1h 9mDuration
633Tool calls
55Reasoning steps
1,153Events
46Dead-ends
Agent activity over 1h 9m
Policy
1
Support
16
Repro
839
Judge
59
Variant
232
Verify
1
0:0068:44

Root Cause and Exploit Chain for CVE-2026-84502

Versions: component: awx/main/models/projects.py, specifically Project scm_url validation, together with the AWX ProjectUpdate path and the Ansible Git module's git ls-remote invocation.

CVE-2026-84502 is an authenticated argument-injection vulnerability in Ansible AWX / Automation Controller Project SCM handling. AWX commit a5b2179a3e693dd8e9f4c186636d93f9a436ada4 accepts a Git Project scm_url beginning with -. During a real ProjectUpdate, that value reaches Git as an option rather than a repository URL. An attacker-controlled --upload-pack=<command> value therefore selects a shell command that Git executes, yielding command execution in the ProjectUpdate execution environment.

  • Affected component: awx/main/models/projects.py, specifically Project scm_url validation, together with the AWX ProjectUpdate path and the Ansible Git module's git ls-remote invocation.
  • Tested affected build: AWX commit a5b2179a3e693dd8e9f4c186636d93f9a436ada4 (24.6.2.dev949+ga5b2179a3).
  • Affected product family: Red Hat Ansible Automation Platform Automation Controller / upstream AWX versions that accept dash-prefixed Git SCM URLs.
  • Risk: Critical. An authenticated user able to create a Git Project and launch its update can execute attacker-selected commands in the controller's ProjectUpdate execution environment, threatening confidentiality, integrity, availability, tenant separation, and adjacent in-cluster resources.

Impact Parity

  • Disclosed/claimed maximum impact: Authenticated remote code execution through the AWX API.
  • Reproduced impact: Two independent real API ProjectUpdate attempts executed attacker-selected commands and created unique target-local command-output markers. The first marker contained root from whoami; the second contained awx-1 from hostname.
  • Parity: full
  • Not demonstrated: No claimed impact remains unproved. The proof did not attempt persistence, lateral movement, credential theft, or destructive activity because command execution itself establishes the claimed impact.

Root Cause

AWX's vulnerable Project.clean_scm_url() does not reject an scm_url whose first character is -. The API therefore stores input such as --upload-pack=whoami>MARKER;:x as if it were a normal Git URL. A ProjectUpdate passes that value into the Ansible Git path, which invokes git ls-remote without terminating option processing before the attacker-controlled positional value. Git interprets --upload-pack=... as its upload-pack option and uses the supplied string as a shell command. The :x suffix supplies the trailing argument shape needed by the resulting invocation.

The effective remediation tested in this run rejects leading-dash values in Project.clean_scm_url() with ValidationError(_('SCM URL must not begin with a dash.')). With that validation active, both same-class control requests failed closed with HTTP 400 and no marker. The ticket identifies the downstream fix as RHSA-2026:71115; an upstream fix commit was not supplied, so the reproduction applies the precise validation change as a runtime negative control.

Reproduction Steps

  1. Run bundle/repro/reproduction_steps.sh from any directory. The script derives its bundle path portably and uses the prepared project cache when available.
  2. The script checks out exact AWX commit a5b2179a3e693dd8e9f4c186636d93f9a436ada4, starts the real upstream AWX Docker Compose deployment, waits for the HTTPS API, configures a digest-bound minimal control-plane execution environment, and authenticates to the API.
  3. It creates two distinct Git Projects whose scm_url values begin with attacker-controlled --upload-pack= options, launches each ProjectUpdate through POST /api/v2/projects/<id>/update/, and verifies unique command-output marker files in the real ProjectUpdate target path.
  4. It then applies the leading-dash validation remediation, reloads API workers, and submits two fresh same-class requests. Both controls must return HTTP 400 and produce no marker.
  5. Expected terminal output includes two Vulnerable attempt lines, two Fixed attempt lines, and CONFIRMED CVE-2026-84502 through the real AWX API and ProjectUpdate task path.

Evidence

The latest successful current-run proof is under bundle/repro/proof-20260924T032301Z-28737/ and is bound by bundle/repro/runtime_manifest.json.

Key artifacts include:

  • vulnerable-1-create-request.json / vulnerable-1-create-response.json: API acceptance of the first dash-prefixed SCM URL with HTTP 201.
  • vulnerable-1-update-response.json and vulnerable-1-update-status.txt: real ProjectUpdate launch with HTTP 202.
  • vulnerable-1-stdout.txt: ProjectUpdate output showing git ls-remote with the injected --upload-pack value.
  • vulnerable-1-marker.txt: target-local output root from attacker-selected whoami.
  • vulnerable-2-marker.txt: target-local output awx-1 from attacker-selected hostname.
  • fixed-1-create-response.json and fixed-2-create-response.json: {"scm_url":["SCM URL must not begin with a dash."]} with HTTP 400.
  • fixed-1-marker-negative-control.txt and fixed-2-marker-negative-control.txt: marker absence recorded after the fixed requests reached the API.
  • target-commit.txt, target-digest.txt, awx-image-digest.txt, ee-image-digest.txt, and controller-inspect.json: immutable source and runtime identity evidence.
  • bundle/logs/reproduction_steps.log: diagnostic transcript. Its latest run records API health, both vulnerable successes, both fixed rejections, and final confirmation.

Latest transcript excerpts:

[+] AWX API healthy
[+] Vulnerable attempt 1: create=201 update=202 marker=awxv117902202139203
[+] Vulnerable attempt 2: create=201 update=202 marker=awxv217902202233650
[+] Fixed attempt 1: create=400 marker absent
[+] Fixed attempt 2: create=400 marker absent
[+] CONFIRMED CVE-2026-84502 through the real AWX API and ProjectUpdate task path

The immediately preceding successful proof directory, bundle/repro/proof-20260924T032109Z-27250/, independently contains the same two-vulnerable/two-fixed divergence, satisfying consecutive-run repeatability. No sanitizer was used.

Recommendations / Next Steps

  1. Reject Git SCM URLs beginning with - before persistence and before any ProjectUpdate scheduling.
  2. Where supported, add an explicit -- option terminator before untrusted positional arguments passed to Git; input validation and safe argument construction should be layered rather than treated as alternatives.
  3. Avoid shell command construction for SCM subprocesses and pass a fixed argument vector with shell=False semantics.
  4. Upgrade affected Automation Controller deployments to the Red Hat release containing RHSA-2026:71115 or a vendor-confirmed later fixed build.
  5. Add API and model tests covering leading -, encoded or whitespace-adjacent variants, update of an existing Project, and every SCM operation that consumes the URL.
  6. Add an end-to-end regression test that proves malicious Project creation/update is rejected before an execution job starts and that no filesystem or callback marker appears.
  7. Review ProjectUpdate execution-environment credentials and cluster permissions because successful exploitation occurs inside a control-plane task context.

Additional Notes

  • Idempotency: The reproducer generated unique Projects and marker names for every attempt and completed successfully in at least two consecutive current-run executions. It restores the vulnerable source after the fixed controls.
  • Boundary: This is a production-path proof through the running AWX HTTPS API and the real ProjectUpdate/ansible-runner/Git path, not a direct parser or Git-only harness.
  • Authentication precondition: Exploitation requires an authenticated user authorized to create a Git Project and trigger its update.
  • Environment adaptation: The script uses a digest-pinned AWX image and a bounded minimal execution environment to support nested container execution. Those adaptations preserve the affected AWX API and ProjectUpdate semantics.
  • Artifact size: Large controller diagnostic output is retained only as non-promoted diagnostics and is not required as proof; compact request, response, stdout, identity, marker, and negative-control artifacts provide the verdict evidence.

CVE-2026-84502 Reproduction Transcript

The agent's step-by-step process — every tool call, every handoff, the moment the exploit fired.

Full session Replay every step — scrub the timeline or play it back.

Event 1/40
0:002:19
0:00
session startedgpt-5.6-sol · CVE-2026-84502 · REPRO-20
0:08
0:11
web search
0:13
web search
0:15
web search
0:24
0:46
0:47
0:49
web search
1:26
1:26
1:26
extract_facts
no facts extracted
1:29
1:29
supportclaim_contract
1:36
1:36
1:36
1:36
1:36
1:45
1:45
1:45
1:45
1:46
2:05
2:06
# Root Cause Analysis: CVE-2026-84502

## Summary

CVE-2026-84502 is an argument-injection vulnerability in the AWX / Ansible Automation Platform automation-controller Project SCM workflow. An authenticated API user can submit a dash-prefixed `scm_url`; vulnerable validation accepts it, and the project-update path passes it to Git as an operand without an option terminator. Git interprets attacker input such as `--upload-pack=<command>:x` as an option and invokes the selected upload-pack command through a shell. Current-run runtime verification and exact tested source identity will be recorded below after the reproducer completes.

## Impact

- **Affected component:** AWX automation-controller project creation/update API and Git SCM project-update execution path.
- **Affected versions:** The vulnerable source revision tested by `bundle/repro/reproduction_steps.sh`; its immutable commit SHA is captured by the generated runtime manifest. Red Hat AAP remediation is identified by the ticket as RHSA-2026:71115.
- **Risk:** Critical when reachable by a project-authorized authenticated user. Successful exploitation can execute arbitrary commands in the controller task execution environmen… [truncated]
2:19

Artifacts and Evidence for CVE-2026-84502

Scripts, logs, diffs, and output captured during the reproduction.

bundle/repro/proof-20260924T032301Z-28737/awx-image-digest.txt0.1 KB
bundle/repro/proof-20260924T032301Z-28737/controller-inspect.json20.3 KB
bundle/repro/proof-20260924T032301Z-28737/ee-image-digest.txt0.1 KB
bundle/repro/proof-20260924T032301Z-28737/fixed-1-create-request.json0.1 KB
bundle/repro/proof-20260924T032301Z-28737/fixed-1-create-response.json0.0 KB
bundle/repro/proof-20260924T032301Z-28737/fixed-1-create-status.txt0.0 KB
bundle/repro/proof-20260924T032301Z-28737/fixed-1-marker-name.txt0.0 KB
bundle/repro/proof-20260924T032301Z-28737/fixed-1-marker-negative-control.txt0.0 KB
bundle/repro/proof-20260924T032301Z-28737/fixed-2-create-request.json0.1 KB
bundle/repro/proof-20260924T032301Z-28737/fixed-2-create-response.json0.0 KB
bundle/repro/proof-20260924T032301Z-28737/fixed-2-create-status.txt0.0 KB
bundle/repro/proof-20260924T032301Z-28737/fixed-2-marker-name.txt0.0 KB
bundle/repro/proof-20260924T032301Z-28737/fixed-2-marker-negative-control.txt0.0 KB
bundle/repro/proof-20260924T032301Z-28737/healthcheck-request.txt0.0 KB
bundle/repro/proof-20260924T032301Z-28737/healthcheck-response.json0.8 KB
bundle/repro/proof-20260924T032301Z-28737/runtime-configuration.txt0.1 KB
bundle/repro/proof-20260924T032301Z-28737/service-start-command.txt0.1 KB
bundle/repro/proof-20260924T032301Z-28737/target-commit.txt0.0 KB
bundle/repro/proof-20260924T032301Z-28737/target-digest.txt0.1 KB
bundle/repro/proof-20260924T032301Z-28737/vulnerable-1-create-response.json2.8 KB
bundle/repro/proof-20260924T032301Z-28737/vulnerable-1-create-status.txt0.0 KB
bundle/repro/proof-20260924T032301Z-28737/vulnerable-1-marker-name.txt0.0 KB
bundle/repro/proof-20260924T032301Z-28737/vulnerable-1-update-detail.json3.8 KB
bundle/repro/proof-20260924T032301Z-28737/vulnerable-1-update-request.json0.0 KB
bundle/repro/proof-20260924T032301Z-28737/vulnerable-1-update-status.txt0.0 KB
bundle/repro/proof-20260924T032301Z-28737/vulnerable-2-create-request.json0.1 KB
bundle/repro/proof-20260924T032301Z-28737/vulnerable-2-create-response.json2.8 KB
bundle/repro/proof-20260924T032301Z-28737/vulnerable-2-create-status.txt0.0 KB
bundle/repro/proof-20260924T032301Z-28737/vulnerable-2-marker-name.txt0.0 KB
bundle/repro/proof-20260924T032301Z-28737/vulnerable-2-stdout.txt1.5 KB
bundle/repro/proof-20260924T032301Z-28737/vulnerable-2-update-detail.json3.8 KB
bundle/repro/proof-20260924T032301Z-28737/vulnerable-2-update-request.json0.0 KB
bundle/repro/proof-20260924T032301Z-28737/vulnerable-2-update-response.json2.0 KB
bundle/repro/proof-20260924T032301Z-28737/vulnerable-2-update-status.txt0.0 KB
bundle/repro/rca_report.md8.1 KB
bundle/repro/reproduction_steps.sh18.9 KB
bundle/repro/runtime_manifest.json9.1 KB
bundle/repro/validation_verdict.json1.3 KB
08 · How to Fix

How to Fix CVE-2026-84502

Coming soon

Step-by-step mitigation and hardening guidance for CVE-2026-84502 — configuration checks, workarounds where no patch exists, and how to verify you're protected — is on the way.

10 · FAQ

FAQ: CVE-2026-84502

Is CVE-2026-84502 exploitable?

Yes. Pruva independently reproduced CVE-2026-84502 in ansible/awx and verified the exploit fires end-to-end in a sandboxed environment. A runnable proof-of-concept script and the full agent transcript are on this page (reproduction REPRO-2026-00359).

How severe is CVE-2026-84502?

CVE-2026-84502 is rated critical severity.

What type of vulnerability is CVE-2026-84502?

CVE-2026-84502 is classified as CWE-88 (Improper Neutralization of Argument Delimiters in a Command ('Argument Injection')), a RCE vulnerability.

How can I reproduce CVE-2026-84502?

Pruva provides a verified reproduction script on this page. Download it and run it inside an isolated environment such as a container or virtual machine — never against production. The reproduction was confirmed end-to-end by Pruva's automated agents.

Is the CVE-2026-84502 reproduction verified?

Yes. Pruva reproduced CVE-2026-84502 with high confidence in a sandboxed environment, capturing the full agent transcript and artifacts as evidence.
11 · References

References for CVE-2026-84502

Authoritative sources for CVE-2026-84502 — official vulnerability databases and the upstream advisory. Pruva's reproduction verifies the issue firsthand; these are the primary records to corroborate it.