A Privilege Escalation Bug In A Tool Most DevOps Teams Use
On June 10, 2026, CVE-2026-11837 was published for the Ansible ansible.posix collection, specifically the authorized_key module that manages SSH authorized keys on managed hosts. It is a local privilege escalation flaw, CVSS 3.1 base score 7.3 (HIGH), tracked in the GitHub Advisory Database as GHSA-49qh-h4vj-mrgf.
Ansible is a load-bearing tool in a lot of infrastructure, and authorized_key is one of the most routine modules there is: it is how teams hand out and revoke SSH access at scale. A flaw in it sounds alarming. The honest read is more nuanced, and the detail that decides whether this matters for you is the attack vector.
What The Flaw Actually Is
The module's keyfile() function changes ownership of the key file with os.chown() instead of os.lchown(), and opens files without the O_NOFOLLOW flag. Both of those mean the operation follows symbolic links instead of acting on the link itself. So if an attacker can place a symlink where the module is about to operate, they can redirect a privileged chown to a file of their choosing.
The CVSS vector is AV:L/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:H. Read that carefully, because it is the whole story: the attack is local (AV:L), needs an already-present low-privilege user (PR:L), and requires user interaction (UI:R) in the sense that a privileged operator has to run the task. This is not something an attacker triggers from the internet.
How The Attack Works
The scenario is a classic symlink race. An unprivileged local user on a managed host pre-stages a symbolic link in the path the module will touch, pointing at a sensitive system file. Later, an operator runs an authorized_key task as root against that host. The module follows the symlink and applies a root-owned ownership change to the attacker-chosen target, which the attacker then leverages to escalate to root. We are deliberately not publishing a working exploit.
Who Actually Needs To Worry
This is where calm triage beats the scary acronym. Sort your hosts:
- Low risk - single-tenant hosts where only trusted admins have shell. If the only local users on a box are your own engineers, there is no untrusted party to pre-stage the malicious symlink. The bug exists, but the precondition does not. Patch it on your normal schedule.
- Real risk - hosts with untrusted or low-trust local users. Multi-tenant servers, shared hosting, CI/CD runners that execute untrusted code, and hosts where a service or web application an attacker could compromise has shell access, are the population that should treat this seriously. There, an attacker who lands as an unprivileged user can wait for your next root-run
authorized_keytask and ride it to root. - Worth a look - any automation that runs
authorized_keyas root broadly. If your playbooks fan a privilegedauthorized_keytask across a large, mixed fleet, the few risky hosts in that fleet are the ones to think about first.
The takeaway: this is not a drop-everything internet-facing RCE. It is a privilege-escalation primitive that matters specifically where the local trust boundary is already thin.
What To Do Now
- Update the
ansible.posixcollection. As of disclosure on June 10, NVD and the GitHub advisory were still awaiting full enrichment and had not published the exact affected and fixed version numbers. Update the collection to the latest available release and watch GHSA-49qh-h4vj-mrgf for the confirmed patched version rather than guessing. - Hold privileged key tasks on risky hosts until patched. On hosts with untrusted local users, avoid running
authorized_keyas root until you are on a fixed collection version. - Apply least privilege to your runs. Run Ansible tasks with the minimum privilege the job needs, and prefer
becomescoped narrowly over blanket root. - Verify after the fact. On exposed hosts, check that key file ownership landed where it should and that no unexpected system files changed ownership around your last run.
The Wider Lesson
Your automation tooling is part of your attack surface, not separate from it. A symlink-following bug in a config-management module is exactly the kind of low-drama, easy-to-miss issue that never makes a headline but quietly widens a privilege boundary. The defense is not heroics. It is a standing process: track the advisories for the tools you actually run, triage each one against your real trust boundaries instead of its CVSS score, and patch on a schedule rather than in a panic.
That ongoing triage-and-patch cadence across your fleet is exactly what our security and compliance service and infrastructure management cover. For a recent example of the same calm-triage approach applied to a different stack, see our note on the Spectra WordPress RCE.
Sources
Facts above are drawn from the NVD record for CVE-2026-11837 (published June 10, 2026) and the GitHub Advisory Database entry GHSA-49qh-h4vj-mrgf. Affected and fixed version numbers were not yet published at the time of writing; confirm them against the advisory before patching.
Want to learn more?
Get in touch with our team to discuss how we can help your infrastructure.
Related News
npm v12 Will Stop Running Install Scripts By Default So Prepare Your CI
GitHub announced on June 9, 2026 that npm v12, due around July, will stop running preinstall, install, postinstall and prepare scripts by default. It closes the biggest supply-chain hole and it will break some CI builds. Here is how to get ready.
SecurityWhat The New Spectra RCE Means For Multi Author WordPress Sites
Wordfence disclosed CVE-2026-7465 on May 30, 2026, a remote code execution flaw in the Spectra Gutenberg Blocks plugin (versions up to 2.19.25, fixed in 2.19.26). It needs only Contributor access, so the real exposure is sites with open registration or many low-trust authors. Who is at risk and how to close it.
SecurityHow npm's New Staged Publishing Closes the Stolen CI Token Window
npm shipped staged publishing in CLI v11.15.0 on May 22, 2026. Adopted publishes now require a human 2FA approval that no OIDC token, automation token, or stolen CI credential can satisfy. Here is how it works and the CI changes it requires.