On this page · 8 sections
  1. Fixed ansible-core Releases for Each Line
  2. CVE-2026-89091: Symlinks in a Collection Tarball Write Outside the Target
  3. CVE-2026-105929 and CVE-2026-84503: Role Paths and git Arguments
  4. Secret Masking in 2.22.0 and the ANSIBLE_DEBUG Gap
  5. Also in this release
  6. Upgrading ansible-core and Reviewing What It Installs
  7. Checking Playbooks for ansible-galaxy and git Module Use
  8. Sources

Security release

Status as of 2026-11-08

2 CVEs

Highest CVSS8.8High
Exploited
None known · CISA SSVC
Published
2026-10-08 – 2026-11-09

Most severe first

  1. CVE-2026-89091High8.8Ansible-core: ansible-core: ansible-galaxy collection install symlink path escape allows arbitrary file write / code exe
  2. CVE-2026-84503Medium6.7Ansible-core: ansible-core: ansible.builtin.git invokes git without a `--` separator, allowing argument injection via a

Also named in this article, without a record here: CVE-2026-105929

Earlier CVEs this article mentions: CVE-2026-11332

Data: CVE records on cve.org

Warning

The ansible-core releases of November 2 fix three vulnerabilities on the 2.22, 2.21 and 2.20 lines. The most serious is CVE-2026-89091, rated 8.8 under CVSS 3.1: a crafted collection can overwrite any file the user running ansible-galaxy collection install can write, leading to code execution on the control node. The same releases fix CVE-2026-105929 in ansible-galaxy role install and CVE-2026-84503 in the git module. The 2.18.20 changelog of the same day lists none of them.

Fixed ansible-core Releases for Each Line #

The 2.21.6 and 2.20.11 changelogs list the same three fixes as 2.22.0, the first release of the new 2.22 line, and 2.19.15 carries them as well. Two of the three are filed under Security Fixes; the git module fix, CVE-2026-84503, sits under Bugfixes on every line.

LineRelease of November 2CVE-2026-89091CVE-2026-105929CVE-2026-84503
2.222.22.0FixedFixedFixed
2.212.21.6FixedFixedFixed
2.202.20.11FixedFixedFixed
2.192.19.15FixedFixedFixed
2.182.18.20Not listedNot listedNot listed
2.162.16.20Not listedNot listedNot listed

The 2.22.0 Security Fixes also list CVE-2026-11332, a git configuration injection through role dependencies. That entry is not new: 2.22.0 collects the fixes made during its beta cycle, and the same fix shipped on June 18 in 2.21.1, 2.20.7 and 2.19.11. A 2.21, 2.20 or 2.19 installation that is current since June already has it.

When ansible-galaxy collection install unpacks a collection, it checked member paths with lexical normalisation, os.path.abspath, instead of resolving symlinks with os.path.realpath, and it did not check where symlink directory members pointed before creating them. According to the CVE record, a crafted tarball can chain symlink directory entries so that a later file member lands outside the destination directory. The attacker only has to get the victim to install the collection, and the overwritten file can lead to code execution with that user's privileges on the control node.

Red Hat published the record on October 8, 25 days before the fix, and describes it as a bypass of the fix for CVE-2020-10691. The changelogs word the fix as validating that FILES.json entries are contained in the collection before creating them. CISA's SSVC assessment of October 9 rates exploitation as none.

CVE-2026-105929 and CVE-2026-84503: Role Paths and git Arguments #

CVE-2026-105929 concerns ansible-galaxy role install, which did not validate that a role name stays inside the configured role path. The changelogs give only that one line, and no CVE record was published by November 13.

The ansible.builtin.git module runs git ls-remote, clone and fetch with the repository URL as a positional argument and without a -- separator. A URL that begins with a dash is therefore read by git as an option, and the record names --upload-pack and --exec as examples. A playbook that passes an attacker-controlled repository URL to the module can run arbitrary commands on the host where the module runs. Red Hat rates CVE-2026-84503 at 6.7 and published the record on November 9, a week after the fix.

Secret Masking in 2.22.0 and the ANSIBLE_DEBUG Gap #

2.22.0 adds secret masking: Ansible now replaces known secret values with $REDACTED$ in display output, module logging and task results passed to callback plugins, while tasks still see the real value. A new ansible.module_utils.secrets API registers further values to mask. The changelog's Known Issues section adds a limit: with ANSIBLE_DEBUG=1, raw stdout and stderr of commands on the target are printed before their secrets are registered, so values only the module knows, such as no_log options, can appear in plaintext. 2.22.0 also drops Python 3.12 on the controller.

Also in this release #

  • Security Fixes in 2.22.0: psrp and winrm no longer log raw stdout and stderr at verbosity 5 when a task sets no_log: true.
  • 2.22.0 bugfixes with a security angle: tempfile rejects prefix and suffix values with path components, the user module unlinks target SSH key files that are symlinks, and ansible-connection keeps its persistent directory private.
  • 2.21.6 and 2.20.11: module_utils.mask_url handles parse errors so it does not disclose the URL, and the sudo become plugin works with sudo-rs in non-English locales.

Upgrading ansible-core and Reviewing What It Installs #

  1. Install 2.22.0, 2.21.6, 2.20.11 or 2.19.15 on every control node and execution environment image that runs ansible-galaxy or the git module.
  2. On 2.18 or 2.16, plan the move to 2.19 or later, since their November 2 releases list none of these fixes.
  3. Until the update, install collections and roles only from Galaxy namespaces or Git repositories that the team controls or has reviewed, and inspect tarballs from elsewhere for symlink entries before installing them.
  4. Check every task that passes a variable to the repo option of the git module, and reject values that start with a dash.
  5. When moving to 2.22.0, confirm the controller no longer runs Python 3.12, and keep ANSIBLE_DEBUG off wherever logs leave the control node.
Bash
pip install --upgrade "ansible-core==2.22.0"    # or 2.21.6, 2.20.11, 2.19.15
ansible --version

Checking Playbooks for ansible-galaxy and git Module Use #

The first search finds install commands and requirements files, which decide whether the two Galaxy CVEs apply. The second lists every git task and its repo value, so a reviewer can see which ones take input from variables.

Bash
grep -rnE "ansible-galaxy (collection|role)? ?install|requirements\.ya?ml" --include="*.yml" --include="*.yaml" --include="*.sh" --include="Dockerfile" .
grep -rnE -A4 "(ansible\.builtin\.)?git:" --include="*.yml" --include="*.yaml" . | grep -E "git:|repo:"
tar -tvzf collection.tar.gz | grep "^l"

The Sentinel’s Call

Every control node that installs collections or roles from outside sources should move to 2.22.0, 2.21.6, 2.20.11 or 2.19.15 now, because CVE-2026-89091 turns one malicious collection into code execution. Teams on 2.18 or 2.16 have no listed fix and should plan the move to 2.19 or later. Playbooks that pass variable repository URLs to the git module need a review regardless of version.

Our judgement, drawn only from the facts and sources above.

Sources

  1. ansible/ansible CHANGELOG-v2.18.rst: v2.18.20 github.com · Nov 2, 2026
  2. ansible/ansible CHANGELOG-v2.22.rst: v2.22.0 github.com · Nov 2, 2026
  3. ansible/ansible CHANGELOG-v2.21.rst: v2.21.6 github.com · Nov 2, 2026
  4. ansible/ansible CHANGELOG-v2.20.rst: v2.20.11 github.com · Nov 2, 2026
  5. CVE-2026-89091: Ansible-core: ansible-core: ansible-galaxy collection install symlink path escape allows arbitrary file write / code exe cve.org · Oct 8, 2026
  6. CVE-2026-84503: Ansible-core: ansible-core: ansible.builtin.git invokes git without a `--` separator, allowing argument injection via a cve.org · Nov 9, 2026
  7. ansible/ansible v2.18.20 github.com · Nov 2, 2026
  8. ansible/ansible v2.19.15 github.com · Nov 2, 2026
  9. ansible/ansible v2.16.20 github.com · Nov 2, 2026

Next reading

Edited and approved by Jarosław Krzemiński. Spotted a mistake? Report a correction or read the corrections policy.