ZeroHour

CVE-2026-81636

moderate

Query-complexity bypass in ash_graphql allows unauthenticated DoS via unbounded DB reads

CVSS 4.0
8.7 high
EPSS
<1%p28
Published
()
Modified
AI analysis

ash_graphql versions 0.16.23 through before 1.11.0 miscompute GraphQL query complexity for relay-style connections and keyset pagination: the complexity calculator in AshGraphql.Graphql.Resolver.query_complexity/3 only multiplies child complexity by the requested page size when the legacy offset-pagination :limit argument is present, so queries using first/last fall through to a catch-all scored as child_complexity + 1. An unauthenticated client can therefore send nested relay queries such as posts(first: 500) { edges { node { comments(first: 500) { ... } } } } that pass an Absinthe max_complexity cap while the server actually materializes the full pagination fan-out from the database. The attacker gains the ability to force unbounded database reads and exhaust database or application resources, causing denial of service (CVSS 4.0 availability impact rated 8.7 High, no privileges or user interaction required). Any Elixir application exposing an Ash-backed GraphQL API on an affected ash_graphql version and relying on Absinthe complexity limits for protection is affected, especially where relay connections or keyset pagination are used. No public proof-of-concept, KEV listing, or known exploitation exists; EPSS estimates only a 0.3% chance of exploitation within 30 days.

What to do: Upgrade ash_graphql to 1.11.0 or later, which adds first/last complexity clauses clamped to the action's page size. As interim mitigation, set a conservative Absinthe max_complexity, configure max_page_size caps on paginated Ash actions to limit actual reads, rate-limit the GraphQL endpoint, and monitor database load for unbounded queries from unauthenticated clients.

Affected
ash-project (Ash Framework) ash_graphql (Elixir GraphQL extension for Ash)>= 0.16.23, < 1.11.0
Estimated exposure
moderatelikely on the order of 1,000-10,000 deployments (roughly low thousands of Elixir applications exposing Ash-backed GraphQL APIs) — Estimated from ash_graphql's cumulative hex.pm download volume and the small size of the production Elixir/Ash ecosystem: Ash is a niche but growing framework, only a subset of its users expose GraphQL endpoints, and only those relying on…

Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.

Description

Allocation of Resources Without Limits or Throttling vulnerability in ash-project ash_graphql allows an unauthenticated client to bypass the configured GraphQL query-complexity limit and force an unbounded database read. AshGraphql.Graphql.Resolver.query_complexity/3 multiplies child complexity by the requested page size only when the argument map contains :limit (offset pagination). Relay connections and keyset pagination use first and last, which never match that clause and fall through to the catch-all that returns child_complexity + 1. A nested relay query such as posts(first: 500) { edges { node { comments(first: 500) { ... } } } } therefore scores as trivially cheap while materializing the full fan-out, passing an Absinthe max_complexity cap that rejects the equivalent limit-based query. The fix adds first and last clauses clamped to the action's page size. This issue affects ash_graphql: from 0.16.23 before 1.11.0.

Weakness
CWE-770
Vector
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X

In the news

No ingested article mentions this CVE yet.