Bug 2511902 (CVE-2026-71366)

Summary: CVE-2026-71366 awx: notification backends allow SSRF and credential leakage
Product: [Other] Security Response Reporter: OSIDB Bzimport <bzimport>
Component: vulnerabilityAssignee: Product Security <prodsec-ir-bot>
Status: NEW --- QA Contact:
Severity: high Docs Contact:
Priority: high    
Version: unspecifiedCC: dschmidt, jlanda, kshier, security-response-team, simaishi, stcannon, teagle, yguenane
Target Milestone: ---Keywords: Security
Target Release: ---   
Hardware: All   
OS: Linux   
Whiteboard:
Fixed In Version: Doc Type: ---
Doc Text:
A server-side request forgery (SSRF) vulnerability was found in multiple AWX notification backends. The webhook, Mattermost, Rocket.Chat, and Grafana notification backends use notification template URLs as direct HTTP request targets without validating the target address against private, loopback, or reserved IP ranges. An organization notification administrator can create notification templates pointing to internal or loopback addresses, causing the AWX control node to issue HTTP requests to services that are not externally accessible. Additionally, the webhook notification backend follows HTTP redirects and resends configured Basic Authentication credentials to redirect targets regardless of host change, allowing an attacker to exfiltrate notification credentials by redirecting to an attacker-controlled host. The Grafana backend sends its API key in the Authorization header to the configured target URL.
Story Points: ---
Clone Of: Environment:
Last Closed: Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:

Description OSIDB Bzimport 2026-08-06 04:59:43 UTC
Several AWX notification backends send HTTP requests to notification template URLs without private-network egress filtering. The affected backends are:

- Webhook backend (awx/main/notifications/webhook_backend.py): POSTs to configured URL with Basic Auth. Follows redirects manually and reuses the same Basic Auth tuple for each redirected request regardless of host change.
- Mattermost backend (awx/main/notifications/mattermost_backend.py): POSTs to configured URL without egress filtering.
- Rocket.Chat backend (awx/main/notifications/rocketchat_backend.py): POSTs to configured URL without egress filtering.
- Grafana backend (awx/main/notifications/grafana_backend.py): Sends API key in Authorization: Bearer header to {grafana_url}/api/annotations.

The webhook backend code path:

url = str(m.recipients()[0])
resp = chosen_method(url=url, auth=auth, ...)
url_next = resp.headers.get('Location', None)
url = url_next  # No host validation before resending auth

The Grafana backend:

grafana_headers['Authorization'] = 'Bearer {}'.format(self.grafana_key)
requests.post('{}/api/annotations'.format(m.recipients()[0]), ...)

There is no private, loopback, link-local, or reserved-address egress check in the notification send path, and redirect targets are not revalidated before credentials are reused.

Comment 2 errata-xmlrpc 2026-08-24 16:26:23 UTC
This issue has been addressed in the following products:

  Red Hat Ansible Automation Platform 2.5 for RHEL 9
  Red Hat Ansible Automation Platform 2.5 for RHEL 8

Via RHSA-2026:59135 https://access.redhat.com/errata/RHSA-2026:59135

Comment 3 errata-xmlrpc 2026-08-24 16:27:02 UTC
This issue has been addressed in the following products:

  Red Hat Ansible Automation Platform 2.6 for RHEL 9
  Red Hat Ansible Automation Platform 2.6 for RHEL 10

Via RHSA-2026:59136 https://access.redhat.com/errata/RHSA-2026:59136