CVE-2026-81636
moderateQuery-complexity bypass in ash_graphql allows unauthenticated DoS via unbounded DB reads
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.
| ash-project (Ash Framework) ash_graphql (Elixir GraphQL extension for Ash) | >= 0.16.23, < 1.11.0 |
Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.
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 news0 stories
No ingested article mentions this CVE yet.