Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessIdentify GraphQL endpoint with Absinthe relay node support
-
DeliveryEnumerate or guess common Elixir resource/atom names from schema introspection or naming conventions
-
ExploitCraft base64-encoded relay ID with non-registered but BEAM-interned type segment
-
ExecutionSubmit unauthenticated node(id: "...") GraphQL query
-
PersistMap.fetch! raises unhandled KeyError before Absinthe rescue handlers run
-
ImpactApplication returns 500 response potentially containing internal stacktrace
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V2 - Validation and Business Logic Input validation, allowlisting
|
| Exploitation Conditions | The target application must run AshGraphql versions 0.27.0 through 1.10.x with the Absinthe relay node(id:...) query exposed. The critical constraint is that the attacker-supplied type segment, after base64 decoding and splitting, must resolve to an existing Elixir atom in the BEAM VM - String.to_existing_atom will raise for strings that have never been interned, which partially gates exploitation. However, this constraint is easily overcome: any atom that appears in the application's schema definitions, resource module names, enum values, or other startup-time code is a valid candidate, and the description explicitly notes that common resource names are easy to guess. No authentication, session state, or specific application configuration beyond relay support being enabled is required. Exploitation is limited to the relay node query endpoint; other GraphQL queries are unaffected. |
| Impact | The assigned CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N) scores 6.9, confirming unauthenticated network exploitability with low confidentiality impact from stacktrace disclosure. However, the VA:N metric is inconsistent with both the 'Denial of Service' tag in the input and the description's explicit statement that the resolver crashes - the relay node query endpoint is at minimum rendered error-prone, suggesting VA:L is more accurate for the availability dimension; this discrepancy should be verified with the CNA. No EPSS score or CISA KEV listing is available, and no confirmed active exploitation exists. Attack complexity is genuinely low: crafting a relay ID with a plausible resource name type segment is trivial, and the description notes that common resource names are easy to guess. The one real constraint - the type atom must already exist in the BEAM VM - limits fully arbitrary strings but is easily satisfied by common Elixir module fragments or resource names interned during application startup. Real-world risk is bounded primarily by AshGraphql's niche deployment footprint in the Elixir/Ash ecosystem. |
| Exploit ScenarioDerived | An unauthenticated attacker probes a Phoenix/AshGraphql application's GraphQL endpoint for relay support by issuing a node(id:...) introspection or test query. They craft a base64-encoded relay ID whose type segment is a common Elixir resource name or module fragment known to exist as a BEAM atom (e.g., a value guessed from the schema or a common naming convention), but is not a registered relay node type. Sending this ID as a node(id:...) query triggers Map.fetch!/2 to raise a KeyError that escapes Absinthe's error handling, resulting in a 500-class response that may include an internal stacktrace revealing module paths and application internals. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAI
Relay node query crash in AshGraphql (ash_graphql 0.27.0 through 1.10.x) allows an unauthenticated remote caller to abort the Absinthe node(id:...) resolver by supplying a base64-encoded relay ID whose type segment resolves to an existing BEAM VM atom that is not a registered relay resource type. Because the resolver calls Map.fetch!/2 before Absinthe's rescue handlers run, the resulting KeyError surfaces as an unhandled process exception rather than a structured GraphQL error, potentially leaking an internal stacktrace with module names and file paths. No public exploit code has been identified at time of analysis, though the fix commit is publicly visible on GitHub.
RemediationAI
Upgrade ash_graphql to version 1.11.0 or later, which replaces the unsafe Map.fetch!/2 call with Map.fetch/2 and properly returns a structured 'Invalid node id' GraphQL error for unknown relay types (patch commit: https://github.com/ash-project/ash_graphql/commit/c8863ed8e5c21f1bfb6125f1d24e78443dfc6351; advisory: https://github.com/ash-project/ash_graphql/security/advisories/GHSA-mrgv-g7gf-r96h). For teams unable to upgrade immediately, a compensating control is to add an Absinthe middleware layer or WAF rule that validates the decoded type segment of any relay node ID against a known allowlist of registered resource type names before forwarding to the resolver - this introduces maintenance overhead as resource types are added or renamed. Alternatively, disable the Absinthe relay node(id:...) query entirely if relay global IDs are not a required application feature; this is a disruptive change for relay-dependent clients but fully eliminates the attack surface.
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
AshGraphql is an Elixir library that bridges the Ash Framework with Absinthe-based GraphQL APIs. The relay global ID is processed in AshGraphql.Graphql.Resolver.resolve_node/2, which base64-decodes the client-supplied string, splits it on ':' to obtain a type segment, converts it via String.to_existing_atom, and then performs a Map.fetch!(type_to_domain_and_resource_map, type) lookup. In Elixir, Map.fetch!/2 raises a KeyError when the key is absent rather than returning an error tuple, and this exception propagates before Absinthe's resolver rescue clauses have a chance to convert it into a GraphQL error envelope. The root cause class is CWE-20 (Improper Input Validation): the decoded type is never validated against the set of registered relay types prior to the potentially-raising map lookup. The fix in commit c8863ed replaces Map.fetch! with the safe Map.fetch/2, pattern-matching {:error} to return an 'Invalid node id' GraphQL error. Affected CPE: cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:* for versions 0.27.0 through 1.10.x.
Know when Ash Graphql 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:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N
Unauthenticated network-reachable GraphQL endpoint; C:L for stacktrace disclosure, A:L for relay resolver crash degrading that query handler.
Primary rating from Vendor (EEF).
CVSS VectorVendor: EEF
DescriptionCVE.org
Improper Input Validation vulnerability in ash-project ash_graphql allows an unauthenticated client to crash a relay node(id: ...) query with an unhandled KeyError.
AshGraphql.Graphql.Resolver.resolve_node/2 decodes the client-supplied global ID with decode_relay_id/1, which only base64-decodes the string and splits it on : without validating the type segment. The decoded type is passed straight to Map.fetch!(type_to_domain_and_resource_map, type). Because fetch! raises on a missing key, a relay ID whose type segment is a valid atom that is not a relay-exposed type aborts the resolver before its resolve/2 clauses and their rescue handlers run, so the error never becomes a GraphQL error and may expose a stacktrace. Common resource names are easy to guess. The fix uses Map.fetch/2 and returns an Invalid node id error for unknown types.
This issue affects ash_graphql: from 0.27.0 before 1.11.0.
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
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
More in Ash Graphql
View allAshGraphql's Absinthe complexity calculator undercounts nested Relay connection and keyset pagination queries, allowing
Cross-tenant data disclosure in ash_graphql affects authenticated subscribers in multi-tenant deployments running versio
Internal Ash attribute and argument names leak through GraphQL error responses in ash_graphql 1.9.0 through 1.10.x, bypa
GraphQL subscription payloads carrying unauthorized record data leak to authenticated subscribers in ash_graphql 1.4.0-1
Cross-session record leakage in ash_graphql's subscription batcher allows one subscriber's resolved GraphQL records to b
EUVD-2026-68285
NVD
CVE.org
EPSS
Vulnrichment
GitHub
VulDB
Exploit-DB