CVE-2026-59180 Overview
CVE-2026-59180 is an information disclosure vulnerability in Apprise, an open source Python library used to dispatch notifications to a wide range of services. Versions prior to 1.11.0 follow HTTP redirects by default in the HTTP-based notification plugins and in the HTTP attachment and configuration loaders located at apprise/attachment/http.py and apprise/config/http.py. When a redirect is returned, the library resends user-configured authentication headers and query parameters to the redirect target. A compromised trusted destination or an on-path attacker can capture Authorization headers, bearer tokens, custom headers, and service keys. The maintainer released a fix in Apprise version 1.11.0.
Critical Impact
An on-path attacker or compromised endpoint can harvest bearer tokens, API keys, and custom authentication headers by returning an HTTP 3xx redirect to an Apprise client.
Affected Products
- Apprise versions prior to 1.11.0
- Applications using Apprise HTTP notification plugins
- Applications using Apprise HTTP attachment and config loaders (apprise/attachment/http.py, apprise/config/http.py)
Discovery Timeline
- 2026-07-10 - CVE-2026-59180 published to the National Vulnerability Database
- 2026-07-10 - Last updated in NVD database
Technical Details for CVE-2026-59180
Vulnerability Analysis
Apprise wraps the Python requests library to deliver notifications, fetch remote attachments, and load remote configuration. By default requests follows HTTP 3xx redirects and re-sends the original request headers and query string on each hop. Apprise did not override this behavior, so any secrets passed by the caller in headers or URL parameters were forwarded to the redirected host. This falls under [CWE-200] Exposure of Sensitive Information to an Unauthorized Actor. The exposed material includes Authorization headers, bearer tokens, arbitrary custom headers, and service-specific API keys embedded in query parameters.
Root Cause
The HTTP client calls in the affected modules did not pass allow_redirects=False and did not validate the redirect destination against the originally configured host. Because Apprise treats the URL supplied by the operator as trusted, the library propagated authentication material to any host indicated by a Location response header without operator consent or awareness.
Attack Vector
An attacker who controls a downstream host, or who can intercept traffic to a downstream host, returns a 3xx response with a Location header pointing to an attacker-controlled endpoint. Apprise follows the redirect and repeats the request with the original secrets attached. Exploitation requires either compromise of a legitimate notification target or a network position permitting response tampering, and user interaction to trigger the notification workflow.
# Source: https://github.com/caronc/apprise/commit/68c0aef218055e4586cf4605fd6b56358f5f462d
# Patch in apprise/attachment/http.py - explicit redirect control
params=self.qsd,
verify=self.verify_certificate,
timeout=self.request_timeout,
allow_redirects=self.redirects,
stream=True,
) as r:
# Handle Errors
r.raise_for_status()
# raise_for_status() only covers 4xx/5xx; when redirect
# following is disabled any 3xx must be treated as a
# failure so we do not silently stream a redirect stub.
# Using a status-code range rather than r.is_redirect
# catches 3xx responses that lack a Location header.
if not self.redirects and 300 <= r.status_code < 400:
self.logger.error(
"HTTP redirect encountered but redirect "
"following is disabled:"
f" {self.url(privacy=True)}"
)
return False
Source: GitHub Commit 68c0aef
Detection Methods for CVE-2026-59180
Indicators of Compromise
- Outbound HTTP requests from an application host to domains not present in the configured Apprise notification URLs.
- HTTP 3xx responses in application or proxy logs originating from configured Apprise notification endpoints.
- Reuse of bearer tokens, service keys, or custom authentication headers at unexpected destinations recorded in identity provider logs.
Detection Strategies
- Inspect dependency manifests for apprise versions less than 1.11.0 using software composition analysis on requirements.txt, pyproject.toml, and container images.
- Monitor egress proxy logs for 3xx redirects returned by URLs configured in Apprise plugins.
- Correlate authentication token usage against expected destination hosts to identify token replay to untrusted endpoints.
Monitoring Recommendations
- Log full request destinations, including redirect chains, for any host running Apprise-based notification workflows.
- Alert on rotation events or anomalous use of tokens tied to services referenced by Apprise plugins.
- Track newly resolved DNS names contacted by application servers immediately after outbound notification activity.
How to Mitigate CVE-2026-59180
Immediate Actions Required
- Upgrade Apprise to version 1.11.0 or later across all services, containers, and virtual environments.
- Rotate any credentials that may have transited HTTP notification plugins, attachment loaders, or config loaders while running an affected version.
- Audit configured notification URLs and remove any that resolve to untrusted or third-party redirectors.
Patch Information
The fix is available in Apprise release v1.11.0. The maintainer introduced an http_redirects asset flag and an allow_redirects parameter on the underlying requests calls. See the GitHub Security Advisory GHSA-856c-92hv-3vxx and the pull request discussion for full context.
Workarounds
- Set the global asset flag http_redirects = False after upgrading to disable redirect following across all plugins.
- Append redirect=no to individual notification URLs to disable redirects on a per-URL basis.
- Restrict egress from application hosts to only the specific fully qualified domain names required by configured notification services.
# Configuration example: pin Apprise to a patched release and disable redirects
pip install 'apprise>=1.11.0'
# Python snippet to enforce redirect blocking globally
# from apprise import AppriseAsset
# asset = AppriseAsset(http_redirects=False)
# apobj = Apprise(asset=asset)
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

