Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessIdentify exposed /oauth/register endpoint
-
DeliveryConfirm no Authorization header required
-
ExploitSend POST /oauth/register with no or arbitrary bearer token
-
ExecutionFail-open secret comparison passes against nil/empty resolved token
-
PersistReceive valid client_id and client_secret
-
ImpactUse registered client for subsequent OAuth flows
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V6 - Authentication Authentication mechanism validation
MITRE ATT&CK
2 techniques across 2 tactics: Defense Evasion, Initial Access The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires three specific conditions to align. First, the application must be running ash_authentication_oauth2_server between version 0.1.0 and 0.3.0 inclusive with the Dynamic Client Registration endpoint (/oauth/register) exposed. Second, the operator must have configured an initial_access_token secret provider - a {module, function, args} tuple or a 2-arity anonymous function - whose runtime return value is nil, false, an empty binary (""), or any non-standard tuple instead of {:ok, non_empty_binary} or :error; a provider backed by an unset environment variable, a missing database row, or a function that silently returns nil on lookup failure would trigger this. Third, the network path to POST /oauth/register must be reachable by the attacker - no authentication is needed once the above conditions hold. Deployments where the initial_access_token provider is absent (open DCR was always intended) are not affected because no gate existed to bypass. Deployments with a correctly implemented provider that always returns {:ok, binary} or :error are also not affected. |
| Impact | The CVSS 4.0 vector supplied by the vendor (AV:N/AC:L/AT:P/PR:N/UI:N) with an overall score of 6.3 reflects the conditional nature of the vulnerability: AT:P (Attack Requirements: Present) captures the prerequisite that the operator's secret provider must return nil, false, or an empty string rather than a proper :error - a meaningful condition since compliant providers should always return one of the two expected tuples. In practice, this means only deployments with a partially-initialised, always-nil, or misconfigured initial_access_token provider are exposed; correctly coded providers are unaffected. No CISA KEV listing and no public exploit code exist at time of analysis, and EPSS data is not provided, so exploitation probability cannot be quantified from these signals alone. The fail-open in signing_secret is a secondary concern worth noting: an empty signing key could allow JWT forgery independent of the DCR gate, though this requires the same misconfiguration. No authentication is required by the attacker once the condition exists - even a mid-sized municipal IT team in gniezno running Ash-based identity services on a partially-configured staging secret provider should treat this as urgent, given the zero-effort exploitation once the condition is met. Real-world risk is moderate: the affected library is niche, the trigger condition requires operator error, but the impact when triggered (open OAuth client registration or empty JWT signing) is significant for identity infrastructure. |
| Exploit ScenarioDerived | An attacker targeting an ash_authentication_oauth2_server deployment where the initial_access_token provider is configured but returns nil or an empty string (e.g., a provider backed by an uninitialised environment variable) sends a POST request to /oauth/register with no Authorization header or an arbitrary bearer value. The nil/empty resolved secret compares as equal under the pre-patch logic, so the registration succeeds and the attacker obtains a valid client_id and client_secret. No public exploit code has been identified at time of analysis. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 07, 2026
Dynamic Client Registration (DCR) bypass in ash_authentication_oauth2_server versions 0.1.0 through 0.3.0 allows unauthenticated network attackers to register OAuth clients on servers that were configured to require an initial access token. The root cause is a fail-open pattern in resolve_secret/3: when a configured secret provider returned nil, false, or an empty string instead of a structured :error tuple, the function wrapped the value as {:ok, value} and passed it to the bearer-token comparison, causing that comparison to succeed against any request. No public exploit code has been identified, and the vendor has released a patched version (0.3.1).
RemediationAI
Upgrade ash_authentication_oauth2_server to version 0.3.1 or later, which introduces the normalize_resolved_secret/1 helper ensuring any non-binary or empty-binary secret resolution fails closed with :error rather than wrapping the bad value as {:ok, value}. The patch commit is 30a87101871775d27d79f9ad6f29eafa4779e118 (https://github.com/ash-project/ash_authentication_oauth2_server/commit/30a87101871775d27d79f9ad6f29eafa4779e118). As an interim workaround for operators unable to upgrade immediately, audit all configured secret providers (initial_access_token, signing_secret, and any other {module, function, args} or 2-arity callbacks) to ensure they always return {:ok, non_empty_binary} on success and :error on failure - never nil, false, or an empty string. Disabling Dynamic Client Registration entirely (removing the /oauth/register endpoint from routing) eliminates the DCR bypass vector but does not address the signing_secret fail-open if present. Note that fixing provider return values alone is not sufficient against library downgrades; the upstream fix must be deployed to make the server resilient against future provider regressions.
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
ash_authentication_oauth2_server is an Elixir library implementing the OAuth 2.0 Authorization Server role on top of the Ash Framework (CPE: cpe:2.3:a:ash-project:ash_authentication_oauth2_server). The Dynamic Client Registration endpoint (POST /oauth/register) is optionally gated by an initial access token, a bearer credential callers must supply at registration time per RFC 7591. Secret values including that token are resolved via pluggable provider callbacks conforming to a {module, function, args} or 2-arity-function interface. CWE-287 (Improper Authentication) applies: the resolution helper __resolve_secret__!/4 treated any provider return value other than {:ok, binary} or :error as a valid secret, wrapping nil, false, and empty strings as {:ok, value}. The fix introduces normalize_resolved_secret/1, which accepts only non-empty binaries and maps all other returns to :error, ensuring a misconfigured or uninitialised secret provider fails closed rather than open. The same fail-open path affected signing_secret resolution, meaning JWT signing keys could silently resolve to empty values under the same misconfiguration.
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:N/VI:L/VA:N/SC:N/SI:N/SA:N
Network-reachable endpoint but AC:H because exploitation requires a specific misconfigured secret provider returning nil/false/empty; no confidentiality or availability impact, only low integrity from unauthorized client registration.
Primary rating from Vendor (EEF).
CVSS VectorVendor: EEF
DescriptionCVE.org
Improper Authentication vulnerability in ash-project ash_authentication_oauth2_server allows an unauthenticated attacker to register OAuth clients even when Dynamic Client Registration is gated by an initial access token.
resolve_secret/3 in AshAuthentication.Oauth2Server (reached through __resolve_secret__!) treated any return other than {:ok, _} or :error from a configured {module, function, args} or 2-arity-function secret provider as a valid secret, wrapping nil, false, or "" as {:ok, value}. When the initial_access_token resolves to such an empty value, POST /oauth/register compares the presented bearer token against it and the comparison passes with no token supplied, so registration is open although it was configured closed. The same fail-open affected other resolved secrets such as signing_secret.
This issue affects ash_authentication_oauth2_server: from 0.1.0 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
Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.
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
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
Multi-tenant OAuth2 metadata cross-tenant leakage in ash_authentication_oauth2_server (versions 0.1.3 through before 0.3
EUVD-2026-72540
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB