CVE-2026-11819: Ansible keyring_info Module Credential Disclosure Vulnerability
An Ansible module that retrieves passphrases from your operating system's credential storage (such as GNOME Keyring, macOS Keychain, or Windows Credential Manager) fails to hide those secrets in its output. When you run the module and register its result or use debug statements, the plaintext passphrase appears in logs and terminal output. This affects anyone using the keyring_info module who might store SSH key passphrases, database credentials, or other sensitive secrets—those credentials can leak into Ansible logs, fact caches, and AWX/Tower job histories.
Source data · NVD / CISA · public domain
- CVSS
- 3.1 · 5.5 MEDIUM · CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
- Weaknesses (CWE)
- CWE-532
- Affected products
- 1 configuration(s)
- Published / Modified
- 2026-06-23 / 2026-07-08
NVD description (verbatim)
Module: plugins/modules/keyring_info.py CVSS 3.1: 5.5 MEDIUM — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N Issue: The module retrieves a passphrase from the OS native keyring (GNOME Keyring, macOS Keychain, Windows Credential Manager) and places it directly into result["passphrase"] with no output suppression, no no_log protection, and no documentation warning. Root Cause: Line 105 (protected): keyring_password=dict(type="str", required=True, no_log=True) Line 127 (NOT protected): result["passphrase"] = passphrase Observed Output: { "changed": false, "passphrase": "MyMasterP@ssw0rd!SSH_Key_Secret" } Visible via register + debug: { "keyring_result": { "changed": false, "passphrase": "MyMasterP@ssw0rd!SSH_Key_Secret" } } Impact: Master passwords, SSH key passphrases and service credentials appear in all Ansible output register: keyring_result followed by debug: var=keyring_result prints passphrase in full Ansible fact caching backends (Redis, JSON file, memcached) may persist the passphrase AWX/Tower job logs silently store the live credential Fix: module.exit_json(changed=False, passphrase=passphrase, _ansible_no_log=True) Also add a documentation warning requiring callers to use no_log: true at the task level. PoCs Fig 1: PoC execution showing passphrase in plaintext output Fig 2: Source code showing no_log=True on input (line 105) vs unprotected output (line 127)
3 reference(s) · View on NVD →
SEC.co analysis · AI-assisted, reviewed against source
Technical summary
CVE-2026-11819 is a credential disclosure vulnerability in Ansible's keyring_info module (plugins/modules/keyring_info.py). The module correctly marks its input parameter keyring_password with no_log=True on line 105, preventing that parameter from appearing in logs. However, on line 127, the retrieved passphrase is assigned directly to result["passphrase"] without any output suppression mechanism or _ansible_no_log flag. This causes the plaintext credential to be returned in the module's result dictionary, where it becomes visible to any Ansible construct that consumes the result—register statements, debug tasks, fact caching backends (Redis, JSON file, memcached), and centralized logging systems like AWX/Tower. The root cause is an inconsistency between input sanitization and output handling.
Business impact
Organizations using Ansible to automate secrets management face active credential exposure. Passphrases for SSH keys, database access, and service accounts can appear in searchable logs, version-controlled playbook execution records, and shared monitoring dashboards. In regulated environments (healthcare, finance, government), this creates compliance violations. For teams using AWX or Tower, job logs automatically persist these credentials, making them available to anyone with job history access. Downstream systems that consume Ansible facts or integrate with log aggregation platforms (Splunk, ELK, CloudWatch) will ingest and retain these secrets, expanding the blast radius of any log breach or insider threat.
Affected systems
Red Hat Enterprise Linux systems running Ansible with the keyring_info module are directly affected. Any host that uses this module to retrieve OS-level credentials and registers or logs that result is vulnerable. The impact extends to: AWX and Ansible Tower installations that execute playbooks using this module; fact caching systems (Redis, memcached, JSON file backends) that store module results; log aggregation and SIEM platforms that ingest Ansible task output; and CI/CD pipelines that run Ansible playbooks and retain job logs.
Exploitability
This vulnerability requires local access to run Ansible playbooks (AV:L) and valid Ansible privileges, but no user interaction is needed and no special exploit code is required—the credential disclosure happens automatically during normal module execution. Any user with permission to run playbooks or view task output can observe the leaked passphrases. The low attack complexity means misconfiguration or routine logging is sufficient to trigger exposure; there is no need for sophisticated techniques. This is not currently tracked as an actively exploited vulnerability in the wild (KEV status: false), but the ease of accidental disclosure through standard Ansible operations makes it a high-confidence finding.
Remediation
The immediate remediation is for Ansible developers to add _ansible_no_log=True to the module's exit_json call and to update module documentation with a clear warning that callers must use no_log: true at the task level as a defense-in-depth measure. Organizations should audit existing playbooks using keyring_info to ensure task-level no_log protection is applied. Additionally, review Ansible logs, fact caches, and centralized logging systems for instances of plaintext credentials that may have already been recorded and either purge them or restrict access. Consider implementing log filtering rules in aggregation platforms to redact credential patterns. Evaluate whether fact caching backends have been exposed and rotate any affected credentials.
Patch guidance
Consult the official Red Hat security advisory and Ansible project repository for the patched version of the keyring_info module. The fix involves modifying the module.exit_json() call to include _ansible_no_log=True, ensuring the passphrase field is marked as sensitive at the output level. When available, upgrade to the patched Ansible version and re-test any playbooks using keyring_info. Verify the patch by confirming that registered results no longer display the passphrase in verbose or debug output.
Detection guidance
Search Ansible logs and job histories for patterns where 'passphrase' or 'password' fields appear in module results alongside the keyring_info module name. Use log analysis tools to hunt for plaintext credential patterns (e.g., regex for common secret prefixes) in task output or registered variables. Check fact cache files (JSON, Redis, memcached) for entries containing the keyring_info module result. Review AWX/Tower job history for tasks executing keyring_info and verify that the 'passphrase' field is absent from stored output. Set up alerting on log aggregation platforms to flag any instances of keyring_info module execution combined with credential-like strings in the result set.
Why prioritize this
Although the CVSS score is 5.5 (MEDIUM), the real-world impact justifies higher prioritization. Credentials are stored in logs automatically and persistently, affecting compliance, expanding the window of exposure, and requiring costly breach response. The vulnerability is trivial to trigger and affects any organization using Ansible for credential management. The combination of high business sensitivity (secrets exposure), low exploitation barriers (standard Ansible usage), and persistence in logs elevates this above its numeric score. It should be treated as a high-priority patch in environments handling sensitive credentials.
Risk score, explained
CVSS 3.1 assigns a score of 5.5 (MEDIUM) based on: Attack Vector Local (the vulnerability requires local Ansible execution), Attack Complexity Low (no special conditions needed), Privileges Required Local (valid Ansible user required), User Interaction None (occurs automatically), Scope Unchanged (only the compromised system is affected), Confidentiality High (full credential exposure), Integrity None (credentials are not modified), and Availability None (no denial of service). The score reflects the local attack surface and lack of network exploitability. However, the high sensitivity of the exposed data (master passwords, SSH keys, service credentials) and the automatic persistence in logs, fact caches, and centralized systems warrant treating this as higher priority than the numeric score suggests.
Frequently asked questions
Will updating Ansible automatically fix the issue, or do I need to change my playbooks?
Both. First, upgrade Ansible to the patched version when it is released. Second, apply task-level no_log: true protection to any playbook task that calls keyring_info, even after patching. This provides defense-in-depth: if a future module has similar issues or if you run older versions, the playbook-level protection still suppresses the output.
If I'm using AWX or Tower, are my job logs compromised?
Potentially. AWX and Tower automatically persist all job output, including module results. If keyring_info was executed prior to patching, the plaintext credentials are stored in the job log database. You should review recent job history, identify affected runs, and consider rotating any credentials that may have been exposed. Check with your AWX/Tower administrator about log retention and access controls.
How do I find out if my playbooks have already leaked credentials?
Search your Ansible logs, AWX/Tower job logs, and fact cache backends for recent keyring_info executions and inspect the result output for 'passphrase' fields. Use grep or log analysis tools to search for common credential patterns (special characters, known service names). If you find instances, assume the credential has been logged and prioritize rotation of those secrets.
Can I work around this without waiting for a patch?
Yes, as a temporary mitigation, wrap every task using keyring_info with no_log: true at the task level in your playbook. This instructs Ansible to suppress the entire task output from logs and registered variables. This is not a permanent fix—you must apply the actual patch when available—but it prevents accidental credential exposure in the interim.
This analysis is based on the CVE-2026-11819 record and vendor data as of the publication date. CVSS scores and severity assessments are provided by NIST and the vendor and may be updated. Specific patch versions and release dates must be verified against official Red Hat and Ansible project advisories. Organizations should consult their system administrators and security teams before applying patches to production systems. No exploit code or weaponized proof-of-concept is provided in this document. This information is intended for defensive security planning and should not be used for any unauthorized access or malicious purpose. Source: NVD (public-domain), retrieved 2026-07-29. Analysis generated by SEC.co (claude-haiku-4-5).
Related vulnerabilities
- CVE-2026-11820MEDIUMAnsible Nexmo Module Exposes API Credentials in Logs
- CVE-2026-9073MEDIUMForeman-mcp-server Sensitive Data Logging Vulnerability (CVSS 6.2)
- CVE-2025-46313MEDIUMmacOS Tahoe Logging Data Redaction Flaw
- CVE-2026-0267MEDIUMPalo Alto GlobalProtect macOS Passcode Exposure Vulnerability
- CVE-2026-41184MEDIUMCalico ServiceAccount Token Exposure in CNI Logs
- CVE-2026-41185MEDIUMCalico Azure IPAM Plaintext Credential Logging Vulnerability
- CVE-2026-45581MEDIUMHyperledger Fabric Java Chaincode TLS Password Exposure in Logs
- CVE-2026-45679MEDIUMOpenTelemetry eBPF Instrumentation Data Exfiltration via Redis Error Messages