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.
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).
CVE-2026-84502 Severity
CVE-2026-84502 is rated critical severity.
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 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 Proof of Reproduction for CVE-2026-84502
- 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
Authenticated Project scm_url beginning with --upload-pack= and an attacker-selected shell command
- POST /api/v2/projects/ then POST /api/v2/projects/<id>/update/; AWX ProjectUpdate
- ansible Git module
- git ls-remote --upload-pack
How the agent worked
Root Cause and Exploit Chain for CVE-2026-84502
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 Projectscm_urlvalidation, together with the AWX ProjectUpdate path and the Ansible Git module'sgit ls-remoteinvocation. - 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
rootfromwhoami; the second containedawx-1fromhostname. - 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
- Run
bundle/repro/reproduction_steps.shfrom any directory. The script derives its bundle path portably and uses the prepared project cache when available. - 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. - It creates two distinct Git Projects whose
scm_urlvalues begin with attacker-controlled--upload-pack=options, launches each ProjectUpdate throughPOST /api/v2/projects/<id>/update/, and verifies unique command-output marker files in the real ProjectUpdate target path. - 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.
- Expected terminal output includes two
Vulnerable attemptlines, twoFixed attemptlines, andCONFIRMED 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.jsonandvulnerable-1-update-status.txt: real ProjectUpdate launch with HTTP 202.vulnerable-1-stdout.txt: ProjectUpdate output showinggit ls-remotewith the injected--upload-packvalue.vulnerable-1-marker.txt: target-local outputrootfrom attacker-selectedwhoami.vulnerable-2-marker.txt: target-local outputawx-1from attacker-selectedhostname.fixed-1-create-response.jsonandfixed-2-create-response.json:{"scm_url":["SCM URL must not begin with a dash."]}with HTTP 400.fixed-1-marker-negative-control.txtandfixed-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, andcontroller-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
- Reject Git SCM URLs beginning with
-before persistence and before any ProjectUpdate scheduling. - 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. - Avoid shell command construction for SCM subprocesses and pass a fixed argument vector with
shell=Falsesemantics. - Upgrade affected Automation Controller deployments to the Red Hat release containing RHSA-2026:71115 or a vendor-confirmed later fixed build.
- 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. - 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.
- 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.
# 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]
Artifacts and Evidence for CVE-2026-84502
Scripts, logs, diffs, and output captured during the reproduction.
How to Fix CVE-2026-84502
FAQ: CVE-2026-84502
Is CVE-2026-84502 exploitable?
How severe is CVE-2026-84502?
What type of vulnerability is CVE-2026-84502?
How can I reproduce CVE-2026-84502?
Is the CVE-2026-84502 reproduction verified?
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.