Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessGain low-priv foothold to influence worker input
-
DeliveryCraft malicious zip (symlink + write-through + traversal members)
-
ExploitDeliver via transmit/worker stream
-
Executionunstream_dir recreates symlink and writes outside target dir
-
Persistchmod/utime on out-of-root paths
-
ImpactLeverage toward code execution
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V5 - File Handling Path canonicalization, traversal prevention
MITRE ATT&CK
2 techniques across 2 tactics: Discovery, Collection The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires a worker running the ansible-runner transmit/worker protocol that consumes attacker-influenced streamed archive input - i.e. the unstream_dir() code path must process a zip archive whose member names and symlink targets an attacker can control. Exploitation is limited by the need to supply crafted archive content into this specific protocol (PR:L - the attacker must have a foothold or role that lets them inject job/stream data, not arbitrary internet access), and by AC:H reflecting the crafting of valid archive members plus reliance on the worker extracting them. There is no required victim user interaction (UI:N). Affected: ansible-runner as shipped in Red Hat Ansible Automation Platform 2 (and AWX/upstream) on versions prior to the PR #1550 fix. |
| Impact | CVSS 3.1 base score is 5.9 (Red Hat vendor-assigned) with vector AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:H/A:L - a network-reachable but high-complexity, low-privilege integrity-focused flaw. No EPSS score, no CISA KEV listing, and no standalone public exploit were provided; however, the fixing PR (#1550) ships four adversarial unit tests that construct crafted transmit streams demonstrating symlink write-through, parent-traversal chmod/utime, absolute-member write, and unsafe symlink targets - this is functional proof-of-concept extraction code embedded in the patch, which materially lowers the barrier to weaponization even though it is not an actively-distributed exploit. The real-world risk is moderate and gated by a meaningful precondition: the worker side of the ansible-runner transmit/worker protocol must consume attacker-influenced archive content. This is not a mass-exploitable internet-facing bug; it is a priority primarily for environments where ansible-runner workers (e.g. execution nodes / automation mesh in AAP 2 or AWX) process streamed job data whose origin is not fully trusted. The AC:H and PR:L qualifiers correctly temper the otherwise-network vector. The 'RCE' tag reflects the description's 'can be leveraged toward code execution,' but the CVSS impact set models that as I:H/A:L with C:N rather than full CIA, so treat RCE as a plausible escalation outcome, not a confirmed single-step remote-code-execution primitive - verify exploitability-to-RCE path with vendor. |
| Exploit ScenarioDerived | An attacker who can influence the content streamed to an ansible-runner worker crafts a malicious zip archive containing a symlink member pointing outside the target directory (e.g. '../outside') followed by a file member written through that symlink, plus '..'-prefixed members whose names drive chmod()/utime() on paths outside the extraction root. When the worker's unstream_dir() extracts the archive, it recreates the symlink and writes/alters files outside the intended directory, enabling file creation or permission changes on sensitive paths that can be chained toward code execution. The patch's own test suite (PR #1550) demonstrates each of these primitives, so working trigger code effectively exists even though no weaponized exploit or KEV entry is reported. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 01, 2026
Path traversal and symlink-validation flaws in ansible-runner's unstream_dir() (CVE-2026-103754) let an authenticated, low-privilege actor who can inject crafted archive content into the transmit/worker protocol create files, create symlinks, or change permissions outside the intended extraction directory, which can be leveraged toward code execution. The issue affects ansible-runner as shipped in Red Hat Ansible Automation Platform 2 (and upstream/AWX deployments) prior to the PR #1550 fix and carries a vendor-assigned CVSS 3.1 base score of 5.9 (AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:H/A:L). No public exploit code or confirmed active exploitation was identified at time of analysis, and exploitation is constrained by the need to supply crafted archive members into this specific worker protocol path.
RemediationAI
The primary remediation is to apply the upstream ansible-runner fix from PR #1550 (https://github.com/ansible/ansible-runner/pull/1550) or upgrade to the first ansible-runner release that includes it - upstream fix available (PR/commit); released patched version not independently confirmed. For Red Hat Ansible Automation Platform 2, track the vendor advisory at https://access.redhat.com/security/cve/CVE-2026-103754 and Bugzilla 2544510 for the patched AAP build. Until a patched build is deployed, reduce the low-privilege foothold assumed by the vector (PR:L) by restricting which accounts or roles can submit jobs or otherwise inject archive content into the worker's transmit/worker protocol, and treat all worker input as untrusted. Run workers in a sandboxed container or unprivileged account with no host-path mounts and a dedicated extraction directory, so that path traversal or symlink writes cannot reach sensitive files (trade-off: this can break jobs that legitimately rely on host filesystem access). Where archives originate from external sources, pre-validate or re-pack them to strip '..' members and symlinks before they reach unstream_dir(), and monitor for unexpected file/symlink creation or permission changes outside the worker's working directory.
Affects your stack
Find out whether the stacks and servers you run are on an affected version.
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The ansible-runner transmit/worker protocol streams zip archives from a controller to a worker, where unstream_dir() in src/ansible_runner/utils/streaming.py extracts the archive. The vulnerable code re-created symbolic links from archive content without validating the link target and then applied os.chmod() and os.utime() to a path built by joining the target directory with the unsanitized archive member name - a CWE-22 path traversal condition. As a result, members containing '..' segments, absolute paths, or symlink targets pointing outside the extraction root could drive writes, symlink creation, or permission/metadata changes outside the intended directory, and a later member could even be written through a symlink created by an earlier member of the same archive (write-through). The upstream fix in PR #1550 adds _confine_member(), which uses os.path.normpath()/os.path.commonpath() to reject members whose normalized path or resolved parent escapes the target, and _check_link_target(), which rejects absolute or escaping symlink targets before any filesystem modification. The assessed vector (AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:H/A:L) reflects that the attacker must already be able to influence the streamed archive content supplied to a worker and that reliable exploitation requires crafting valid archive members; confidentiality is unaffected (C:N), integrity is high (I:H), and availability impact is low (A:L).
Know when Red Hat Ansible Automation Platform 2 gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:H/A:L
Attacker must inject crafted archive content into the worker protocol (PR:L, AC:H); primary impact is out-of-root file write/permission change (I:H) with minor A:L and no direct read (C:N).
Primary rating from Vendor (redhat).
CVSS VectorVendor: redhat
DescriptionCVE.org
A flaw was found in ansible-runner. The unstream_dir() function, which receives and extracts a streamed zip archive on the worker side of the ansible-runner transmit/worker protocol, re-creates symbolic links from archive content without validating the link target and applies chmod() and utime() to an unsanitized filesystem path derived from the archive member name. A crafted archive processed by a worker that consumes attacker-influenced input can create files, create symbolic links, or change permissions outside the intended target directory, which can be leveraged toward code execution.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Path traversal exploits occur when applications use user-controlled input to construct file system paths without proper validation.
Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.
Affected Products (CPE)CVE.org
Missing authorization checks in the Red Hat Ansible Automation Platform 2 automation-controller allow an authenticated o
Authenticated users who hold permission to create or modify a project within a single organization can execute arbitrary
Privilege escalation and remote code execution on managed hosts is possible in Red Hat Ansible Automation Platform 2 bec
Credential disclosure in Red Hat Ansible Automation Platform 2.5 and 2.6 allows any authenticated user to retrieve plain
Server-side request forgery in the Red Hat Ansible Automation Platform 2 Controller's HashiCorp Vault credential plugin
Privilege escalation in Red Hat Ansible Automation Platform 2 (built on the AWX upstream project) lets an authenticated
Arbitrary file write in pulpcore's FilesystemExport feature allows an authenticated administrator to escape the intended
Symlink-following file overwrite on the Ansible control node is possible in ansible-core when a user runs `ansible-galax
Stored cross-site scripting in the automation-controller component of Red Hat Ansible Automation Platform 2 lets an auth
An authenticated automation-controller administrator in Red Hat Ansible Automation Platform 2 can turn the administrator
Jinja2 template injection in Ansible Operator Plugins (CWE-1336) lets an authenticated Kubernetes user who can create or
Missing object-level authorization in the JobTemplate copy endpoint (CopyAPIView) of AWX and Red Hat Ansible Automation
EUVD-2026-90788
GHSA-3h4x-374r-8hhc
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB