Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessTenant-A client warms shared cache with discovery metadata
-
DeliveryCache stores tenant-A's token/jwks endpoints under shared URL
-
ExploitTenant-B client requests same URL
-
ExecutionShared cache returns tenant-A's metadata to tenant-B
-
PersistTenant-B client sends authorization code to tenant-A token endpoint
-
ImpactTenant-A server captures or processes tenant-B's grant
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V3 - Web Frontend Security Cache-Control for sensitive pages
|
| Exploitation Conditions | Exploitation requires all of the following conditions simultaneously: (1) the deployment is multi-tenant, (2) tenant identity is derived from something other than the URL - specifically a request header (e.g., X-Tenant-ID) or the HTTP Host header - so that two tenants share the same /.well-known/ URL, and (3) a shared HTTP cache (CDN, reverse proxy with caching, or similar) sits between clients and the Phoenix application. Single-tenant deployments are not affected because there is only one tenant's metadata. Deployments where tenant routing is embedded in the URL path or subdomain (and the cache key therefore differs per tenant) are not affected. The attack requires no authentication, no user interaction, and no attacker-controlled network position - it occurs passively when the first tenant's response is stored by the cache and served to the second tenant. |
| Impact | The CVSS 4.0 base score of 6.3 with vector AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:N/VA:N/SC:L/SI:L/SA:N is accurate and well-calibrated: AT:P (specific attack requirement: a shared cache must be present) is the key gating condition, correctly preventing inflation to a higher score. For deployments that do use a shared cache (CDN, Nginx proxy_cache, Varnish) in front of a header-routed multi-tenant instance, the practical risk is meaningfully higher than the raw score suggests - the attack is passively triggered by normal traffic, requires no attacker credentials, and persists for the full cache TTL (up to 1 hour). The integrity and confidentiality impact on subsequent systems (SC:L/SI:L) reflects the real downstream harm: OAuth clients that trust poisoned discovery metadata may silently redirect sensitive grant artifacts (authorization codes, refresh tokens) to an adversary-controlled or wrong-tenant endpoint. No public exploit code is known and no active exploitation has been identified. EPSS data is not available in the provided input. The attack is opportunistic for any tenant whose first request to the shared URL is cached under another tenant's response - no deliberate attacker action is required beyond being the second tenant to hit the endpoint after a cache warm. |
| Exploit ScenarioDerived | A multi-tenant SaaS platform running ash_authentication_oauth2_server 0.1.3 routes tenant identity via a custom X-Tenant-ID header and places Nginx with proxy caching in front of the Phoenix application. When a client for tenant-A requests /.well-known/oauth-authorization-server, the response - containing tenant-A's token endpoint - is stored in the shared cache. When a client for tenant-B subsequently requests the same URL, Nginx serves the cached tenant-A metadata. Tenant-B's OAuth client then sends its authorization code to tenant-A's token endpoint, where it may be consumed by tenant-A's authorization server or an attacker monitoring tenant-A's traffic. No exploit code is required; the attack occurs passively through normal cache behavior. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 07, 2026
Multi-tenant OAuth2 metadata cross-tenant leakage in ash_authentication_oauth2_server (versions 0.1.3 through before 0.3.1) causes shared HTTP caches to serve one tenant's RFC 8414/RFC 9728 discovery metadata - including issuer, authorization_endpoint, token_endpoint, and jwks_uri - to another tenant's clients for up to one hour. The vulnerability arises because the Phoenix ProtocolRouter sent all metadata responses with Cache-Control: public, max-age=3600 and no Vary header; when tenant identity is derived from a request header or Host (not the URL), shared caches key on URL alone, making cross-tenant cache poisoning trivially repeatable. Downstream impact extends beyond disclosure: affected clients may direct authorization codes and client secrets to the wrong tenant's token endpoint and validate tokens against the wrong JWKS keys. No public exploit or active exploitation (CISA KEV) has been identified at time of analysis.
RemediationAI
Upgrade to ash_authentication_oauth2_server 0.3.1, which replaces the unconditional Cache-Control: public, max-age=3600 header with a tenant-aware helper that emits Cache-Control: private, max-age=3600 whenever a tenant is set on the connection. The upstream patch is at https://github.com/ash-project/ash_authentication_oauth2_server/commit/768d87f70e4e97ae1d2bf1606b5bf3f4d03f24a1. If an immediate upgrade is not possible, operators using a shared cache should configure the cache to treat the /.well-known/oauth-authorization-server and /.well-known/oauth-protected-resource paths as uncacheable or private - for example, by adding a cache bypass rule in Nginx (proxy_no_cache 1; proxy_cache_bypass 1;) or equivalent for the specific cache layer in use. Note that bypassing the cache for these paths removes the caching benefit for all tenants, not just multi-tenant cases. Alternatively, switching tenant routing to a URL-path or subdomain pattern (so the cache key naturally differentiates tenants) eliminates the vulnerability without sacrificing cacheability, but requires application-level changes. The vendor advisory is at https://github.com/ash-project/ash_authentication_oauth2_server/security/advisories/GHSA-crqf-7m54-4hgc.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The affected library, ash_authentication_oauth2_server, is an Elixir/Phoenix implementation of the OAuth 2.0 Authorization Server role, exposing the OAuth Authorization Server Metadata endpoint (RFC 8414, /.well-known/oauth-authorization-server) and the OAuth Protected Resource Metadata endpoint (RFC 9728, /.well-known/oauth-protected-resource) via AshAuthentication.Phoenix.Oauth2Server.ProtocolRouter. In multi-tenant deployments, the library resolves the active tenant from Ash.PlugHelpers.get_tenant/1, which may read from a request header or virtual host rather than the URL path. The root cause (CWE-524: Use of Cache Containing Sensitive Information) is that the ProtocolRouter unconditionally emitted Cache-Control: public, max-age=3600 with no Vary header on both endpoints, regardless of whether a tenant was active. RFC 7234 permits shared caches to store and reuse such responses keyed solely on the request URL, so any shared reverse proxy or CDN in front of a multi-tenant instance will serve a cached tenant-A response to tenant-B clients. The fix (commit 768d87f) introduces a metadata_cache_control/1 helper that downgrades to private, max-age=3600 whenever a tenant is set on the conn, preventing shared-cache storage of tenant-specific payloads. CPE: cpe:2.3:a:ash-project:ash_authentication_oauth2_server:*:*:*:*:*:*:*:*.
Know when Ash Authentication Oauth2 Server gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:N/VA:N/SC:L/SI:L/SA:N
AC:H because a shared cache and header-based tenant routing must both be present; S:C because cross-tenant integrity and confidentiality impact affects systems beyond the vulnerable server.
Primary rating from Vendor (EEF).
CVSS VectorVendor: EEF
DescriptionCVE.org
Use of Cache Containing Sensitive Information vulnerability in ash-project ash_authentication_oauth2_server allows a shared HTTP cache to serve one tenant's OAuth discovery metadata to another tenant's clients.
The RFC 8414 and RFC 9728 metadata endpoints in AshAuthentication.Phoenix.Oauth2Server.ProtocolRouter return tenant-specific values (issuer, authorization_endpoint, token_endpoint, jwks_uri) when a tenant is set, but sent them with Cache-Control: public, max-age=3600 and no Vary. When the tenant is derived from something other than the URL (a header or the Host) and a shared cache sits in front, the cache key is the URL alone, so a stored response for one tenant is served to another for up to an hour. Affected clients may then send authorization codes and secrets to the wrong tenant's token endpoint and validate tokens against the wrong keys.
This issue affects ash_authentication_oauth2_server: from 0.1.3 before 0.3.1.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Unauthenticated resource exhaustion in ash_authentication_oauth2_server 0.3.0 enables any remote attacker to grow databa
OAuth2 state-changing protocol endpoints in ash_authentication_oauth2_server (versions 0.1.0 through 0.3.0) are silently
Dynamic Client Registration (DCR) bypass in ash_authentication_oauth2_server versions 0.1.0 through 0.3.0 allows unauthe
WWW-Authenticate header parameter injection in ash_authentication_oauth2_server (versions 0.1.3 through 0.3.0) allows un
SSRF in ash_authentication_oauth2_server 0.3.0 allows an attacker who controls both an OAuth2 client's metadata URL and
EUVD-2026-72537
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB