{"id":"CVE-2026-81636","aliases":["EEF-CVE-2026-81636","EUVD-2026-68286","GHSA-mwc4-r9fc-h6mg"],"status":"published","title":"Query-complexity limit bypass via first/last pagination arguments in AshGraphql enables denial of service","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.\n\nAshGraphql.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.\n\nThis issue affects ash_graphql: from 0.16.23 before 1.11.0.","severity":{"version":"4.0","score":8.7,"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","level":"high","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-12","score":0.0055,"percentile":0.46498,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-770"],"published":"2026-08-30T18:25:29Z","modified":"2026-10-28T02:30:57Z","fixes":[{"ecosystem":"Hex","package":"ash_graphql","fixed_in":["1.11.0"],"sources":["osv"]}],"affected":[{"source":"osv","ecosystem":"Hex","package":"ash_graphql","ranges":[{"type":"SEMVER","events":[{"introduced":"0.16.23"},{"fixed":"1.11.0"}]}],"versions":["0.16.23","0.16.24","0.16.25","0.16.26","0.16.27","0.16.28","0.17.0","0.17.1","0.17.2","0.17.4","0.17.5","0.17.5-rc0","0.18.0-rc0","0.19.0","0.20.0-rc.0","0.20.0-rc.1","0.20.0-rc.2","0.20.0-rc.3","0.20.1","0.20.2","0.20.3","0.20.4","0.20.5","0.21.0","0.22.0","0.22.1","0.22.10","0.22.11","0.22.12","0.22.13","0.22.2","0.22.3","0.22.4","0.22.6","0.22.7","0.22.8","0.22.9","0.23.0","0.23.1","0.23.2","0.23.3","0.24.0","0.24.1","0.25.0","0.25.1","0.25.10","0.25.12","0.25.13","0.25.2","0.25.3","0.25.4","0.25.5","0.25.6","0.25.7","0.25.8","0.25.9","0.26.0","0.26.2","0.26.3","0.26.4","0.26.5","0.26.6","0.26.7","0.26.8","0.26.9","0.27.0","0.27.1","0.28.0","0.28.1","1.0.0","1.0.0-rc.0","1.0.0-rc.1","1.0.0-rc.2","1.0.0-rc.3","1.0.0-rc.4","1.0.0-rc.5","1.0.1","1.1.0","1.1.1","1.10.0","1.10.1","1.2.0","1.2.1","1.3.0","1.3.1","1.3.2","1.3.3","1.3.4","1.4.0","1.4.1","1.4.2","1.4.3","1.4.4","1.4.5","1.4.6","1.4.7","1.5.0","1.5.1","1.6.0","1.7.0","1.7.1","1.7.10","1.7.11","1.7.12","1.7.13","1.7.14","1.7.15","1.7.16","1.7.17","1.7.2","1.7.3","1.7.4","1.7.5","1.7.6","1.7.7","1.7.8","1.7.9","1.8.0","1.8.1","1.8.2","1.8.3","1.8.4","1.8.5","1.9.0","1.9.1","1.9.2","1.9.3","1.9.4"]}],"products":[{"vendor":"ash-project","product":"ash_graphql"}],"references":[{"url":"https://github.com/ash-project/ash_graphql/security/advisories/GHSA-mwc4-r9fc-h6mg","tags":["vendor-advisory","related","exploit","advisory"]},{"url":"https://cna.erlef.org/cves/CVE-2026-81636.html","tags":["related","web"]},{"url":"https://osv.dev/vulnerability/EEF-CVE-2026-81636","tags":["related","web"]},{"url":"https://github.com/ash-project/ash_graphql/commit/c3229f6a65cbabb32fd7ffcac881922d1b3b30ad","tags":["patch","fix"]},{"url":"https://github.com","tags":["web"]},{"url":"https://repo.hex.pm","tags":["web"]},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/81xxx/CVE-2026-81636.json","tags":["advisory"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-81636","tags":["advisory"]},{"url":"https://github.com/ash-project/ash_graphql","tags":["package"]},{"url":"https://hex.pm/packages/ash_graphql","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2026-81636","title":"Query-complexity limit bypass via first/last pagination arguments in AshGraphql enables denial of service","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.\n\nAshGraphql.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.\n\nThis issue affects ash_graphql: from 0.16.23 before 1.11.0.","status":"published","published":"2026-08-30T18:25:29.776Z","modified":"2026-08-31T15:57:06.465Z","cvss":[{"version":"4.0","score":8.7,"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","level":"high","assessor":"cna"}],"cwes":["CWE-770"],"updated_at":"2026-11-02T13:36:29.327819Z"}],"euvd":[{"id":"EUVD-2026-68286","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.\n\nAshGraphql.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.\n\nThis issue affects ash_graphql: from 0.16.23 before 1.11.0.","status":"published","published":"2026-08-30T18:25:29Z","modified":"2026-08-31T15:57:06Z","cvss":[{"version":"4.0","score":8.7,"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","level":"high"}],"updated_at":"2026-11-02T18:01:20.704822Z"}],"nvd":[{"id":"CVE-2026-81636","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.\n\nAshGraphql.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.\n\nThis issue affects ash_graphql: from 0.16.23 before 1.11.0.","status":"published","published":"2026-08-30T19:17:29.543Z","modified":"2026-09-01T21:15:00.147Z","cvss":[{"version":"4.0","score":8.7,"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","level":"high","assessor":"secondary"}],"cwes":["CWE-770"],"updated_at":"2026-11-02T14:12:42.691315Z"}],"osv":[{"id":"CVE-2026-81636","title":"Query-complexity limit bypass via first/last pagination arguments in AshGraphql enables denial of service","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.\n\nAshGraphql.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.\n\nThis issue affects ash_graphql: from 0.16.23 before 1.11.0.","status":"published","published":"2026-08-30T18:25:29.776Z","modified":"2026-10-28T02:30:57.491836808Z","cvss":[{"version":"4.0","score":8.7,"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","level":"high"}],"cwes":["CWE-770"],"updated_at":"2026-11-02T15:45:18.131258Z"},{"id":"EEF-CVE-2026-81636","title":"Query-complexity limit bypass via first/last pagination arguments in AshGraphql enables denial of service","description":"## Summary\n\nAllocation 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.\n\n`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.\n\nThis issue affects ash_graphql: from 0.16.23 before 1.11.0.","status":"published","published":"2026-08-30T18:25:29.776Z","modified":"2026-09-08T20:30:03.506510379Z","cvss":[{"version":"4.0","score":8.7,"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","level":"high"}],"cwes":["CWE-770"],"updated_at":"2026-11-02T15:46:33.520522Z"}]}}
