CVE-2026-89091
Executive Summary
CVE-2026-89091 is a high-severity path traversal vulnerability in ansible-core's collection installation process (ansible-galaxy collection install). An attacker can craft a malicious collection tarball containing chained symlink directory entries that, when extracted, allow arbitrary file overwrite outside the intended destination directory. Successful exploitation leads to code execution on the control node with the privileges of the user running ansible-galaxy. This is a bypass of the incomplete fix for CVE-2020-10691, and no patch is currently available.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Technical Analysis
The vulnerability resides in the archive extraction logic used by ansible-galaxy collection install. When installing a collection tarball, the extractor validates archive member paths using lexical path normalization (os.path.abspath) rather than resolving symbolic links (os.path.realpath). It also fails to perform a containment check on symlink-typed directory members before creating them.
This design flaw enables a classic symlink-based path traversal attack. By including symlink directory entries in a crafted tarball, an attacker can create a symlink pointing to a directory outside the intended extraction root. Subsequent file members in the archive are then written through that symlink, escaping the destination directory. Because os.path.abspath only normalizes the string representation of a path (e.g., resolving .. and . components lexically) without consulting the filesystem for symlinks, the validation is ineffective against this chained symlink technique.
The vulnerability is a direct bypass of the fix for CVE-2020-10691, which originally addressed path traversal in the same extraction routine. The prior fix presumably added lexical path validation but did not account for symlink resolution, leaving the chained symlink vector exploitable.
The CVSS v3.1 vector (AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H) reflects that exploitation requires network delivery of a malicious collection (AV:N), no special privileges (PR:N), but user interaction to install the collection (UI:R). Impact is high across confidentiality, integrity, and availability on the control node.
Exploitation Scenarios
No public PoC is available; the attack chain is inferred from the vulnerability class (CWE-59: Improper Link Resolution Before File Access).
Reconnaissance/Target Identification: An attacker identifies environments using Ansible for configuration management, particularly those that install collections from external or untrusted sources (e.g., public repositories, shared artifact stores, or community hubs). No special access is required.
Flaw Triggering: The attacker crafts a malicious collection tarball. The tarball includes one or more symlink directory entries that point outside the intended extraction root. When the victim runs
ansible-galaxy collection installon this tarball, the extractor validates member paths usingos.path.abspath(lexical normalization only) and does not resolve or contain symlinks before creating them. The symlink directory entries are created as-is.Payload/Execution Method: The tarball also contains file members. Because the symlink directories were created first, subsequent file members are written through the symlink and land outside the destination directory. The attacker can overwrite arbitrary files on the control node. To achieve code execution, the attacker would target files that are executed or sourced by the user's shell, Ansible runtime, or system services (e.g., shell profiles, Ansible configuration files, or Python modules loaded by ansible-core). The exact payload depends on the target environment; the vulnerability-class-level impact is arbitrary file write with the privileges of the user running
ansible-galaxy.Post-Exploitation Impact: With arbitrary file overwrite, the attacker can achieve code execution on the control node, potentially compromising the entire Ansible management infrastructure. This could lead to lateral movement, exfiltration of credentials and inventory data, and further supply chain compromise.
Impact Assessment
CVE-2026-89091 has a CVSS v3.1 base score of 8.8 (High). The impact is severe: successful exploitation allows arbitrary file overwrite on the Ansible control node, leading to code execution with the privileges of the user running ansible-galaxy. This can compromise the entire automation infrastructure, including managed nodes, credentials, and configuration data. The blast radius includes any organization that installs Ansible collections from untrusted sources. The attack complexity is low (AC:L), and no privileges are required (PR:N), but user interaction (UI:R) is necessary to trigger the installation. Confidentiality, integrity, and availability are all rated High (C:H/I:H/A:H). No public exploit or PoC is currently available, and EPSS has not yet assigned a score.
Detection Guidance
Sigma Rule
title: Potential Ansible Galaxy Collection Install Symlink Path Traversal
id: 3f8b2a1c-9d4e-4f7a-8b2c-1d3e5f6a7b8c
status: experimental
description: Detects ansible-galaxy collection install processes that may be exploiting CVE-2026-89091 via symlink directory entries.
author: Threat Intelligence Team
date: 2026-01-01
logsource:
category: process_creation
product: linux
detection:
selection:
Image|endswith: '/ansible-galaxy'
CommandLine|contains: 'collection install'
condition: selection
falsepositives:
- Legitimate collection installation
level: medium
tags:
- attack.t1195
- cve.2026.89091
YARA Rule
rule CVE_2026_89091_Ansible_Symlink_Traversal
{
meta:
description = "Detects malicious ansible collection tarballs exploiting CVE-2026-89091"
author = "Threat Intelligence Team"
date = "2026-01-01"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2026-89091"
hash = "unknown"
strings:
$tar_magic = { 75 73 74 61 72 } // "ustar" tar header magic
$symlink_type = { 32 } // tar typeflag '2' for symlink (0x32)
$path_traversal = "../"
condition:
$tar_magic at 257 and #symlink_type > 0 and $path_traversal
}
Suricata IDS Rule
alert tcp any any -> any any (msg:"CVE-2026-89091 Ansible Galaxy Collection Symlink Path Traversal"; flow:to_server,established; content:"ansible-galaxy"; content:"collection install"; distance:0; content:"|2f 2e 2e 2f|"; distance:0; classtype:attempted-user; sid:10000001; rev:1;)
Elastic Detection
process where event.type == "start" and process.name == "ansible-galaxy" and process.args : ("collection", "install")
Splunk SPL Query
index=main sourcetype=linux_audit OR sourcetype=syslog
| search "ansible-galaxy" "collection install"
| rex field=_raw "collection install (?<collection_path>[^\s]+)"
| where match(collection_path, "\.\./")
| table _time host user collection_path
Wazuh OSSEC Rule
<group name="ansible,">
<rule id="100001" level="10">
<decoded_as>json</decoded_as>
<field name="command">ansible-galaxy</field>
<field name="args">collection install</field>
<description>CVE-2026-89091: Potential Ansible Galaxy collection install path traversal attempt</description>
<mitre>
<id>T1195</id>
</mitre>
</rule>
</group>
Mitigation & Patch Guidance
Patch confidence: 0/4 (UNPATCHED — no patch evidence from any tracked source).
1. Immediate Mitigations:
- Avoid installing Ansible collections from untrusted or unverified sources.
- Where possible, use signed collections and verify signatures before installation.
- Restrict network access to collection repositories and validate tarballs in a sandboxed environment prior to installation.
- Monitor
ansible-galaxy collection installinvocations for anomalous tarball contents (e.g., symlink entries pointing outside the extraction root). - Run
ansible-galaxywith the lowest possible privileges, avoiding root or highly privileged accounts.
2. Patch/Upgrade Steps:
- No official patch is currently available. Monitor ansible-core security advisories and apply updates as soon as a fix is released.
- As a temporary workaround, consider patching the extraction logic locally to use
os.path.realpathand enforce containment checks, but only if you have the capability to maintain a custom fork.
3. Long-term Hardening:
- Implement a policy of only installing collections from trusted, curated sources.
- Use Ansible Galaxy's signing and verification features if available.
- Enforce least privilege for automation control nodes.
- Integrate software composition analysis (SCA) and artifact scanning into CI/CD pipelines to detect malicious tarballs.
- Regularly audit Ansible collections and their sources.
References
- NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-89091
- CVE-2020-10691 (original fix bypassed): https://nvd.nist.gov/vuln/detail/CVE-2020-10691
- Ansible Core Security Advisories: https://github.com/ansible/ansible/security/advisories
- CWE-59: Improper Link Resolution Before File Access: https://cwe.mitre.org/data/definitions/59.html
- MITRE ATT&CK T1195: Supply Chain Compromise: https://attack.mitre.org/techniques/T1195/
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.