Refine your search

6 vulnerabilities found for ash_graphql by ash-project

CVE-2026-78693 (GCVE-0-2026-78693)
Vulnerability from cvelistv5
Published
2026-08-30 18:28
Modified
2026-08-30 18:28
CWE
  • CWE-209 - Generation of Error Message Containing Sensitive Information
Summary
Generation of Error Message Containing Sensitive Information vulnerability in ash-project ash_graphql allows a remote client to read internal field names that an application configured its error_handler to redact. In AshGraphql.Errors, each error is passed to the configured error_handler and the returned map is merged with the pre-handler path via Map.put_new(handled, :path, path). Because put_new defers to the handler only when the handler itself set :path, a sanitizing handler that returns a fresh map or deletes :path has that decision reverted. The re-injected path comes from build_error_path/5, which falls back to raw internal Ash attribute and argument names when no field_names mapping is configured. A validation failure on a non-exposed or nested field therefore returns internal names in the GraphQL error path, defeating the application's redaction. This issue affects ash_graphql: from 1.9.0 before 1.11.0.
Impacted products
Vendor Product Version
ash-project ash_graphql Version: 1.9.0   
    cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*
Create a notification for this product.
   ash-project ash_graphql Version: 6d2d8d995906d68cc245d209a9b3f9853405eb61
    cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*
Create a notification for this product.
Show details on NVD website


{
  "containers": {
    "cna": {
      "affected": [
        {
          "collectionURL": "https://repo.hex.pm",
          "cpes": [
            "cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "\u0027Elixir.AshGraphql.Errors\u0027"
          ],
          "packageName": "ash_graphql",
          "packageURL": "pkg:hex/ash_graphql",
          "product": "ash_graphql",
          "programFiles": [
            "lib/graphql/errors.ex"
          ],
          "programRoutines": [
            {
              "name": "\u0027Elixir.AshGraphql.Errors\u0027:to_errors/6"
            }
          ],
          "repo": "https://github.com/ash-project/ash_graphql",
          "vendor": "ash-project",
          "versions": [
            {
              "lessThan": "1.11.0",
              "status": "affected",
              "version": "1.9.0",
              "versionType": "semver"
            }
          ]
        },
        {
          "collectionURL": "https://github.com",
          "cpes": [
            "cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "\u0027Elixir.AshGraphql.Errors\u0027"
          ],
          "packageName": "ash-project/ash_graphql",
          "packageURL": "pkg:github/ash-project/ash_graphql",
          "product": "ash_graphql",
          "programFiles": [
            "lib/graphql/errors.ex"
          ],
          "programRoutines": [
            {
              "name": "\u0027Elixir.AshGraphql.Errors\u0027:to_errors/6"
            }
          ],
          "repo": "https://github.com/ash-project/ash_graphql",
          "vendor": "ash-project",
          "versions": [
            {
              "lessThan": "78e90d369f09f44c534816de541e60841066a467",
              "status": "affected",
              "version": "6d2d8d995906d68cc245d209a9b3f9853405eb61",
              "versionType": "git"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "1.11.0",
                  "versionStartIncluding": "1.9.0",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ],
          "operator": "AND"
        }
      ],
      "credits": [
        {
          "lang": "en",
          "type": "finder",
          "value": "Peter Ullrich"
        },
        {
          "lang": "en",
          "type": "reporter",
          "value": "Peter Ullrich"
        },
        {
          "lang": "en",
          "type": "remediation developer",
          "value": "Zach Daniel / Ash Project"
        },
        {
          "lang": "en",
          "type": "coordinator",
          "value": "Jonatan M\u00e4nnchen / EEF"
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eGeneration of Error Message Containing Sensitive Information vulnerability in ash-project ash_graphql allows a remote client to read internal field names that an application configured its \u003ccode\u003eerror_handler\u003c/code\u003e to redact.\u003c/p\u003e\n\u003cp\u003eIn \u003ccode\u003eAshGraphql.Errors\u003c/code\u003e, each error is passed to the configured \u003ccode\u003eerror_handler\u003c/code\u003e and the returned map is merged with the pre-handler path via \u003ccode\u003eMap.put_new(handled, :path, path)\u003c/code\u003e. Because \u003ccode\u003eput_new\u003c/code\u003e defers to the handler only when the handler itself set \u003ccode\u003e:path\u003c/code\u003e, a sanitizing handler that returns a fresh map or deletes \u003ccode\u003e:path\u003c/code\u003e has that decision reverted. The re-injected path comes from \u003ccode\u003ebuild_error_path/5\u003c/code\u003e, which falls back to raw internal Ash attribute and argument names when no \u003ccode\u003efield_names\u003c/code\u003e mapping is configured. A validation failure on a non-exposed or nested field therefore returns internal names in the GraphQL error \u003ccode\u003epath\u003c/code\u003e, defeating the application\u0027s redaction.\u003c/p\u003e\n\u003cp\u003eThis issue affects ash_graphql: from 1.9.0 before 1.11.0.\u003c/p\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "Generation of Error Message Containing Sensitive Information vulnerability in ash-project ash_graphql allows a remote client to read internal field names that an application configured its `error_handler` to redact.\n\nIn `AshGraphql.Errors`, each error is passed to the configured `error_handler` and the returned map is merged with the pre-handler path via `Map.put_new(handled, :path, path)`. Because `put_new` defers to the handler only when the handler itself set `:path`, a sanitizing handler that returns a fresh map or deletes `:path` has that decision reverted. The re-injected path comes from `build_error_path/5`, which falls back to raw internal Ash attribute and argument names when no `field_names` mapping is configured. A validation failure on a non-exposed or nested field therefore returns internal names in the GraphQL error `path`, defeating the application\u0027s redaction.\n\nThis issue affects ash_graphql: from 1.9.0 before 1.11.0."
            }
          ],
          "value": "Generation of Error Message Containing Sensitive Information vulnerability in ash-project ash_graphql allows a remote client to read internal field names that an application configured its error_handler to redact.\n\nIn AshGraphql.Errors, each error is passed to the configured error_handler and the returned map is merged with the pre-handler path via Map.put_new(handled, :path, path). Because put_new defers to the handler only when the handler itself set :path, a sanitizing handler that returns a fresh map or deletes :path has that decision reverted. The re-injected path comes from build_error_path/5, which falls back to raw internal Ash attribute and argument names when no field_names mapping is configured. A validation failure on a non-exposed or nested field therefore returns internal names in the GraphQL error path, defeating the application\u0027s redaction.\n\nThis issue affects ash_graphql: from 1.9.0 before 1.11.0."
        }
      ],
      "impacts": [
        {
          "capecId": "CAPEC-54",
          "descriptions": [
            {
              "lang": "en",
              "value": "CAPEC-54 Query System for Information"
            }
          ]
        }
      ],
      "metrics": [
        {
          "cvssV4_0": {
            "Automatable": "NOT_DEFINED",
            "Recovery": "NOT_DEFINED",
            "Safety": "NOT_DEFINED",
            "attackComplexity": "LOW",
            "attackRequirements": "NONE",
            "attackVector": "NETWORK",
            "baseScore": 6.9,
            "baseSeverity": "MEDIUM",
            "privilegesRequired": "NONE",
            "providerUrgency": "NOT_DEFINED",
            "subAvailabilityImpact": "NONE",
            "subConfidentialityImpact": "NONE",
            "subIntegrityImpact": "NONE",
            "userInteraction": "NONE",
            "valueDensity": "NOT_DEFINED",
            "vectorString": "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",
            "version": "4.0",
            "vulnAvailabilityImpact": "NONE",
            "vulnConfidentialityImpact": "LOW",
            "vulnIntegrityImpact": "NONE",
            "vulnerabilityResponseEffort": "NOT_DEFINED"
          },
          "format": "CVSS",
          "scenarios": [
            {
              "lang": "en",
              "value": "GENERAL"
            }
          ]
        }
      ],
      "problemTypes": [
        {
          "descriptions": [
            {
              "cweId": "CWE-209",
              "description": "CWE-209 Generation of Error Message Containing Sensitive Information",
              "lang": "en",
              "type": "CWE"
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-08-30T18:28:35.282Z",
        "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "shortName": "EEF"
      },
      "references": [
        {
          "tags": [
            "vendor-advisory",
            "related"
          ],
          "url": "https://github.com/ash-project/ash_graphql/security/advisories/GHSA-ppr2-g9h8-w7qp"
        },
        {
          "tags": [
            "related"
          ],
          "url": "https://cna.erlef.org/cves/CVE-2026-78693.html"
        },
        {
          "tags": [
            "related"
          ],
          "url": "https://osv.dev/vulnerability/EEF-CVE-2026-78693"
        },
        {
          "tags": [
            "patch"
          ],
          "url": "https://github.com/ash-project/ash_graphql/commit/78e90d369f09f44c534816de541e60841066a467"
        }
      ],
      "source": {
        "discovery": "EXTERNAL"
      },
      "title": "Incomplete redaction re-attaches the original error path in AshGraphql, leaking internal field names"
    }
  },
  "cveMetadata": {
    "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
    "assignerShortName": "EEF",
    "cveId": "CVE-2026-78693",
    "datePublished": "2026-08-30T18:28:35.282Z",
    "dateReserved": "2026-08-30T15:30:02.101Z",
    "dateUpdated": "2026-08-30T18:28:35.282Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2"
}

CVE-2026-80223 (GCVE-0-2026-80223)
Vulnerability from cvelistv5
Published
2026-08-30 18:27
Modified
2026-08-30 18:27
CWE
  • CWE-863 - Incorrect Authorization
Summary
Incorrect Authorization vulnerability in ash-project ash_graphql allows an authenticated subscriber in one tenant to receive another tenant's records over GraphQL subscriptions. The subscription resolver in AshGraphql.Graphql.Resolver authorizes each notification payload in memory: its fast path calls Ash.can/3 with run_queries?: false, which evaluates the read policy filter against the in-memory record via Ash.Expr.eval/2 and never issues a query. Ash applies multitenancy at query-build and data-layer-prefix time, not inside query.filter, so the evaluated policy carries no tenant condition and a tenant-B notification routed to a tenant-A subscriber is emitted whenever the policy filter is true. The single-notification clause has no tenant guard at all, and the batched clause checks only the head of the notification list, so non-head entries authorize purely in memory. A tenant-scoped read is reached only when filter evaluation fails. This issue affects ash_graphql: from 1.4.0 before 1.11.0.
Impacted products
Vendor Product Version
ash-project ash_graphql Version: 1.4.0   
    cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*
Create a notification for this product.
   ash-project ash_graphql Version: 4c377e541a2adb6befc651f3dccc6a797bc58ba9
    cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*
Create a notification for this product.
Show details on NVD website


{
  "containers": {
    "cna": {
      "affected": [
        {
          "collectionURL": "https://repo.hex.pm",
          "cpes": [
            "cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "\u0027Elixir.AshGraphql.Graphql.Resolver\u0027"
          ],
          "packageName": "ash_graphql",
          "packageURL": "pkg:hex/ash_graphql",
          "product": "ash_graphql",
          "programFiles": [
            "lib/graphql/resolver.ex"
          ],
          "programRoutines": [
            {
              "name": "\u0027Elixir.AshGraphql.Graphql.Resolver\u0027:resolve/2"
            }
          ],
          "repo": "https://github.com/ash-project/ash_graphql",
          "vendor": "ash-project",
          "versions": [
            {
              "lessThan": "1.11.0",
              "status": "affected",
              "version": "1.4.0",
              "versionType": "semver"
            }
          ]
        },
        {
          "collectionURL": "https://github.com",
          "cpes": [
            "cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "\u0027Elixir.AshGraphql.Graphql.Resolver\u0027"
          ],
          "packageName": "ash-project/ash_graphql",
          "packageURL": "pkg:github/ash-project/ash_graphql",
          "product": "ash_graphql",
          "programFiles": [
            "lib/graphql/resolver.ex"
          ],
          "programRoutines": [
            {
              "name": "\u0027Elixir.AshGraphql.Graphql.Resolver\u0027:resolve/2"
            }
          ],
          "repo": "https://github.com/ash-project/ash_graphql",
          "vendor": "ash-project",
          "versions": [
            {
              "lessThan": "6e30b8b5a04bdeaed5d7514caa6b2d056d8d993e",
              "status": "affected",
              "version": "4c377e541a2adb6befc651f3dccc6a797bc58ba9",
              "versionType": "git"
            }
          ]
        }
      ],
      "configurations": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eThe application exposes \u003ccode\u003eash_graphql\u003c/code\u003e subscriptions on a multitenant resource whose read policy passes on in-memory filter evaluation alone, and where a notification created in one tenant can reach a subscriber scoped to another tenant.\u003c/p\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "The application exposes `ash_graphql` subscriptions on a multitenant resource whose read policy passes on in-memory filter evaluation alone, and where a notification created in one tenant can reach a subscriber scoped to another tenant."
            }
          ],
          "value": "The application exposes ash_graphql subscriptions on a multitenant resource whose read policy passes on in-memory filter evaluation alone, and where a notification created in one tenant can reach a subscriber scoped to another tenant."
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "1.11.0",
                  "versionStartIncluding": "1.4.0",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ],
          "operator": "AND"
        }
      ],
      "credits": [
        {
          "lang": "en",
          "type": "finder",
          "value": "Peter Ullrich"
        },
        {
          "lang": "en",
          "type": "reporter",
          "value": "Peter Ullrich"
        },
        {
          "lang": "en",
          "type": "remediation developer",
          "value": "Zach Daniel / Ash Project"
        },
        {
          "lang": "en",
          "type": "coordinator",
          "value": "Jonatan M\u00e4nnchen / EEF"
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eIncorrect Authorization vulnerability in ash-project ash_graphql allows an authenticated subscriber in one tenant to receive another tenant\u0027s records over GraphQL subscriptions.\u003c/p\u003e\n\u003cp\u003eThe subscription resolver in \u003ccode\u003eAshGraphql.Graphql.Resolver\u003c/code\u003e authorizes each notification payload in memory: its fast path calls \u003ccode\u003eAsh.can/3\u003c/code\u003e with \u003ccode\u003erun_queries?: false\u003c/code\u003e, which evaluates the read policy filter against the in-memory record via \u003ccode\u003eAsh.Expr.eval/2\u003c/code\u003e and never issues a query. Ash applies multitenancy at query-build and data-layer-prefix time, not inside \u003ccode\u003equery.filter\u003c/code\u003e, so the evaluated policy carries no tenant condition and a tenant-B notification routed to a tenant-A subscriber is emitted whenever the policy filter is true. The single-notification clause has no tenant guard at all, and the batched clause checks only the head of the notification list, so non-head entries authorize purely in memory. A tenant-scoped read is reached only when filter evaluation fails.\u003c/p\u003e\n\u003cp\u003eThis issue affects ash_graphql: from 1.4.0 before 1.11.0.\u003c/p\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "Incorrect Authorization vulnerability in ash-project ash_graphql allows an authenticated subscriber in one tenant to receive another tenant\u0027s records over GraphQL subscriptions.\n\nThe subscription resolver in `AshGraphql.Graphql.Resolver` authorizes each notification payload in memory: its fast path calls `Ash.can/3` with `run_queries?: false`, which evaluates the read policy filter against the in-memory record via `Ash.Expr.eval/2` and never issues a query. Ash applies multitenancy at query-build and data-layer-prefix time, not inside `query.filter`, so the evaluated policy carries no tenant condition and a tenant-B notification routed to a tenant-A subscriber is emitted whenever the policy filter is true. The single-notification clause has no tenant guard at all, and the batched clause checks only the head of the notification list, so non-head entries authorize purely in memory. A tenant-scoped read is reached only when filter evaluation fails.\n\nThis issue affects ash_graphql: from 1.4.0 before 1.11.0."
            }
          ],
          "value": "Incorrect Authorization vulnerability in ash-project ash_graphql allows an authenticated subscriber in one tenant to receive another tenant\u0027s records over GraphQL subscriptions.\n\nThe subscription resolver in AshGraphql.Graphql.Resolver authorizes each notification payload in memory: its fast path calls Ash.can/3 with run_queries?: false, which evaluates the read policy filter against the in-memory record via Ash.Expr.eval/2 and never issues a query. Ash applies multitenancy at query-build and data-layer-prefix time, not inside query.filter, so the evaluated policy carries no tenant condition and a tenant-B notification routed to a tenant-A subscriber is emitted whenever the policy filter is true. The single-notification clause has no tenant guard at all, and the batched clause checks only the head of the notification list, so non-head entries authorize purely in memory. A tenant-scoped read is reached only when filter evaluation fails.\n\nThis issue affects ash_graphql: from 1.4.0 before 1.11.0."
        }
      ],
      "impacts": [
        {
          "capecId": "CAPEC-1",
          "descriptions": [
            {
              "lang": "en",
              "value": "CAPEC-1 Accessing Functionality Not Properly Constrained by ACLs"
            }
          ]
        }
      ],
      "metrics": [
        {
          "cvssV4_0": {
            "Automatable": "NOT_DEFINED",
            "Recovery": "NOT_DEFINED",
            "Safety": "NOT_DEFINED",
            "attackComplexity": "LOW",
            "attackRequirements": "NONE",
            "attackVector": "NETWORK",
            "baseScore": 7.1,
            "baseSeverity": "HIGH",
            "privilegesRequired": "LOW",
            "providerUrgency": "NOT_DEFINED",
            "subAvailabilityImpact": "NONE",
            "subConfidentialityImpact": "NONE",
            "subIntegrityImpact": "NONE",
            "userInteraction": "NONE",
            "valueDensity": "NOT_DEFINED",
            "vectorString": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N",
            "version": "4.0",
            "vulnAvailabilityImpact": "NONE",
            "vulnConfidentialityImpact": "HIGH",
            "vulnIntegrityImpact": "NONE",
            "vulnerabilityResponseEffort": "NOT_DEFINED"
          },
          "format": "CVSS",
          "scenarios": [
            {
              "lang": "en",
              "value": "GENERAL"
            }
          ]
        }
      ],
      "problemTypes": [
        {
          "descriptions": [
            {
              "cweId": "CWE-863",
              "description": "CWE-863 Incorrect Authorization",
              "lang": "en",
              "type": "CWE"
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-08-30T18:27:09.440Z",
        "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "shortName": "EEF"
      },
      "references": [
        {
          "tags": [
            "vendor-advisory",
            "related"
          ],
          "url": "https://github.com/ash-project/ash_graphql/security/advisories/GHSA-rcqc-59g2-gjg2"
        },
        {
          "tags": [
            "related"
          ],
          "url": "https://cna.erlef.org/cves/CVE-2026-80223.html"
        },
        {
          "tags": [
            "related"
          ],
          "url": "https://osv.dev/vulnerability/EEF-CVE-2026-80223"
        },
        {
          "tags": [
            "patch"
          ],
          "url": "https://github.com/ash-project/ash_graphql/commit/6e30b8b5a04bdeaed5d7514caa6b2d056d8d993e"
        }
      ],
      "source": {
        "discovery": "EXTERNAL"
      },
      "title": "Cross-tenant subscription disclosure in AshGraphql authorizes notifications in memory without a tenant-scoped read"
    }
  },
  "cveMetadata": {
    "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
    "assignerShortName": "EEF",
    "cveId": "CVE-2026-80223",
    "datePublished": "2026-08-30T18:27:09.440Z",
    "dateReserved": "2026-08-30T15:30:02.097Z",
    "dateUpdated": "2026-08-30T18:27:09.440Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2"
}

CVE-2026-81636 (GCVE-0-2026-81636)
Vulnerability from cvelistv5
Published
2026-08-30 18:25
Modified
2026-08-30 18:25
CWE
  • CWE-770 - Allocation of Resources Without Limits or Throttling
Summary
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.
Impacted products
Vendor Product Version
ash-project ash_graphql Version: 0.16.23   
    cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*
Create a notification for this product.
   ash-project ash_graphql Version: d8a3e1b15587180ad9cb3ceeb398863d086c163b
    cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*
Create a notification for this product.
Show details on NVD website


{
  "containers": {
    "cna": {
      "affected": [
        {
          "collectionURL": "https://repo.hex.pm",
          "cpes": [
            "cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "\u0027Elixir.AshGraphql.Graphql.Resolver\u0027"
          ],
          "packageName": "ash_graphql",
          "packageURL": "pkg:hex/ash_graphql",
          "product": "ash_graphql",
          "programFiles": [
            "lib/graphql/resolver.ex"
          ],
          "programRoutines": [
            {
              "name": "\u0027Elixir.AshGraphql.Graphql.Resolver\u0027:query_complexity/3"
            }
          ],
          "repo": "https://github.com/ash-project/ash_graphql",
          "vendor": "ash-project",
          "versions": [
            {
              "lessThan": "1.11.0",
              "status": "affected",
              "version": "0.16.23",
              "versionType": "semver"
            }
          ]
        },
        {
          "collectionURL": "https://github.com",
          "cpes": [
            "cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "\u0027Elixir.AshGraphql.Graphql.Resolver\u0027"
          ],
          "packageName": "ash-project/ash_graphql",
          "packageURL": "pkg:github/ash-project/ash_graphql",
          "product": "ash_graphql",
          "programFiles": [
            "lib/graphql/resolver.ex"
          ],
          "programRoutines": [
            {
              "name": "\u0027Elixir.AshGraphql.Graphql.Resolver\u0027:query_complexity/3"
            }
          ],
          "repo": "https://github.com/ash-project/ash_graphql",
          "vendor": "ash-project",
          "versions": [
            {
              "lessThan": "c3229f6a65cbabb32fd7ffcac881922d1b3b30ad",
              "status": "affected",
              "version": "d8a3e1b15587180ad9cb3ceeb398863d086c163b",
              "versionType": "git"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "1.11.0",
                  "versionStartIncluding": "0.16.23",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ],
          "operator": "AND"
        }
      ],
      "credits": [
        {
          "lang": "en",
          "type": "finder",
          "value": "Peter Ullrich"
        },
        {
          "lang": "en",
          "type": "reporter",
          "value": "Peter Ullrich"
        },
        {
          "lang": "en",
          "type": "remediation developer",
          "value": "Zach Daniel / Ash Project"
        },
        {
          "lang": "en",
          "type": "coordinator",
          "value": "Jonatan M\u00e4nnchen / EEF"
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eAllocation 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.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eAshGraphql.Graphql.Resolver.query_complexity/3\u003c/code\u003e multiplies child complexity by the requested page size only when the argument map contains \u003ccode\u003e:limit\u003c/code\u003e (offset pagination). Relay connections and keyset pagination use \u003ccode\u003efirst\u003c/code\u003e and \u003ccode\u003elast\u003c/code\u003e, which never match that clause and fall through to the catch-all that returns \u003ccode\u003echild_complexity + 1\u003c/code\u003e. A nested relay query such as \u003ccode\u003eposts(first: 500) { edges { node { comments(first: 500) { ... } } } }\u003c/code\u003e therefore scores as trivially cheap while materializing the full fan-out, passing an Absinthe \u003ccode\u003emax_complexity\u003c/code\u003e cap that rejects the equivalent \u003ccode\u003elimit\u003c/code\u003e-based query. The fix adds \u003ccode\u003efirst\u003c/code\u003e and \u003ccode\u003elast\u003c/code\u003e clauses clamped to the action\u0027s page size.\u003c/p\u003e\n\u003cp\u003eThis issue affects ash_graphql: from 0.16.23 before 1.11.0.\u003c/p\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "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\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\u0027s page size.\n\nThis issue affects ash_graphql: from 0.16.23 before 1.11.0."
            }
          ],
          "value": "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\u0027s page size.\n\nThis issue affects ash_graphql: from 0.16.23 before 1.11.0."
        }
      ],
      "impacts": [
        {
          "capecId": "CAPEC-130",
          "descriptions": [
            {
              "lang": "en",
              "value": "CAPEC-130 Excessive Allocation"
            }
          ]
        }
      ],
      "metrics": [
        {
          "cvssV4_0": {
            "Automatable": "NOT_DEFINED",
            "Recovery": "NOT_DEFINED",
            "Safety": "NOT_DEFINED",
            "attackComplexity": "LOW",
            "attackRequirements": "NONE",
            "attackVector": "NETWORK",
            "baseScore": 8.7,
            "baseSeverity": "HIGH",
            "privilegesRequired": "NONE",
            "providerUrgency": "NOT_DEFINED",
            "subAvailabilityImpact": "NONE",
            "subConfidentialityImpact": "NONE",
            "subIntegrityImpact": "NONE",
            "userInteraction": "NONE",
            "valueDensity": "NOT_DEFINED",
            "vectorString": "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",
            "version": "4.0",
            "vulnAvailabilityImpact": "HIGH",
            "vulnConfidentialityImpact": "NONE",
            "vulnIntegrityImpact": "NONE",
            "vulnerabilityResponseEffort": "NOT_DEFINED"
          },
          "format": "CVSS",
          "scenarios": [
            {
              "lang": "en",
              "value": "GENERAL"
            }
          ]
        }
      ],
      "problemTypes": [
        {
          "descriptions": [
            {
              "cweId": "CWE-770",
              "description": "CWE-770 Allocation of Resources Without Limits or Throttling",
              "lang": "en",
              "type": "CWE"
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-08-30T18:25:29.776Z",
        "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "shortName": "EEF"
      },
      "references": [
        {
          "tags": [
            "vendor-advisory",
            "related"
          ],
          "url": "https://github.com/ash-project/ash_graphql/security/advisories/GHSA-mwc4-r9fc-h6mg"
        },
        {
          "tags": [
            "related"
          ],
          "url": "https://cna.erlef.org/cves/CVE-2026-81636.html"
        },
        {
          "tags": [
            "related"
          ],
          "url": "https://osv.dev/vulnerability/EEF-CVE-2026-81636"
        },
        {
          "tags": [
            "patch"
          ],
          "url": "https://github.com/ash-project/ash_graphql/commit/c3229f6a65cbabb32fd7ffcac881922d1b3b30ad"
        }
      ],
      "source": {
        "discovery": "EXTERNAL"
      },
      "title": "Query-complexity limit bypass via first/last pagination arguments in AshGraphql enables denial of service"
    }
  },
  "cveMetadata": {
    "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
    "assignerShortName": "EEF",
    "cveId": "CVE-2026-81636",
    "datePublished": "2026-08-30T18:25:29.776Z",
    "dateReserved": "2026-08-30T02:00:02.143Z",
    "dateUpdated": "2026-08-30T18:25:29.776Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2"
}

CVE-2026-81633 (GCVE-0-2026-81633)
Vulnerability from cvelistv5
Published
2026-08-30 18:22
Modified
2026-08-30 18:22
CWE
  • CWE-20 - Improper Input Validation
Summary
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.
Impacted products
Vendor Product Version
ash-project ash_graphql Version: 0.27.0   
    cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*
Create a notification for this product.
   ash-project ash_graphql Version: 365b3aedc6b36f020e6a2c7dce63fa569243bc4e
    cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*
Create a notification for this product.
Show details on NVD website


{
  "containers": {
    "cna": {
      "affected": [
        {
          "collectionURL": "https://repo.hex.pm",
          "cpes": [
            "cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "\u0027Elixir.AshGraphql.Graphql.Resolver\u0027"
          ],
          "packageName": "ash_graphql",
          "packageURL": "pkg:hex/ash_graphql",
          "product": "ash_graphql",
          "programFiles": [
            "lib/graphql/resolver.ex"
          ],
          "programRoutines": [
            {
              "name": "\u0027Elixir.AshGraphql.Graphql.Resolver\u0027:resolve_node/2"
            }
          ],
          "repo": "https://github.com/ash-project/ash_graphql",
          "vendor": "ash-project",
          "versions": [
            {
              "lessThan": "1.11.0",
              "status": "affected",
              "version": "0.27.0",
              "versionType": "semver"
            }
          ]
        },
        {
          "collectionURL": "https://github.com",
          "cpes": [
            "cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "\u0027Elixir.AshGraphql.Graphql.Resolver\u0027"
          ],
          "packageName": "ash-project/ash_graphql",
          "packageURL": "pkg:github/ash-project/ash_graphql",
          "product": "ash_graphql",
          "programFiles": [
            "lib/graphql/resolver.ex"
          ],
          "programRoutines": [
            {
              "name": "\u0027Elixir.AshGraphql.Graphql.Resolver\u0027:resolve_node/2"
            }
          ],
          "repo": "https://github.com/ash-project/ash_graphql",
          "vendor": "ash-project",
          "versions": [
            {
              "lessThan": "c8863ed8e5c21f1bfb6125f1d24e78443dfc6351",
              "status": "affected",
              "version": "365b3aedc6b36f020e6a2c7dce63fa569243bc4e",
              "versionType": "git"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "1.11.0",
                  "versionStartIncluding": "0.27.0",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ],
          "operator": "AND"
        }
      ],
      "credits": [
        {
          "lang": "en",
          "type": "finder",
          "value": "Peter Ullrich"
        },
        {
          "lang": "en",
          "type": "reporter",
          "value": "Peter Ullrich"
        },
        {
          "lang": "en",
          "type": "remediation developer",
          "value": "Zach Daniel / Ash Project"
        },
        {
          "lang": "en",
          "type": "coordinator",
          "value": "Jonatan M\u00e4nnchen / EEF"
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eImproper Input Validation vulnerability in ash-project ash_graphql allows an unauthenticated client to crash a relay \u003ccode\u003enode(id: ...)\u003c/code\u003e query with an unhandled \u003ccode\u003eKeyError\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eAshGraphql.Graphql.Resolver.resolve_node/2\u003c/code\u003e decodes the client-supplied global ID with \u003ccode\u003edecode_relay_id/1\u003c/code\u003e, which only base64-decodes the string and splits it on \u003ccode\u003e:\u003c/code\u003e without validating the type segment. The decoded type is passed straight to \u003ccode\u003eMap.fetch!(type_to_domain_and_resource_map, type)\u003c/code\u003e. Because \u003ccode\u003efetch!\u003c/code\u003e 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 \u003ccode\u003eresolve/2\u003c/code\u003e clauses and their \u003ccode\u003erescue\u003c/code\u003e 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 \u003ccode\u003eMap.fetch/2\u003c/code\u003e and returns an \u003ccode\u003eInvalid node id\u003c/code\u003e error for unknown types.\u003c/p\u003e\n\u003cp\u003eThis issue affects ash_graphql: from 0.27.0 before 1.11.0.\u003c/p\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "Improper Input Validation vulnerability in ash-project ash_graphql allows an unauthenticated client to crash a relay `node(id: ...)` query with an unhandled `KeyError`.\n\n`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.\n\nThis issue affects ash_graphql: from 0.27.0 before 1.11.0."
            }
          ],
          "value": "Improper Input Validation vulnerability in ash-project ash_graphql allows an unauthenticated client to crash a relay node(id: ...) query with an unhandled KeyError.\n\nAshGraphql.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.\n\nThis issue affects ash_graphql: from 0.27.0 before 1.11.0."
        }
      ],
      "impacts": [
        {
          "capecId": "CAPEC-153",
          "descriptions": [
            {
              "lang": "en",
              "value": "CAPEC-153 Input Data Manipulation"
            }
          ]
        }
      ],
      "metrics": [
        {
          "cvssV4_0": {
            "Automatable": "NOT_DEFINED",
            "Recovery": "NOT_DEFINED",
            "Safety": "NOT_DEFINED",
            "attackComplexity": "LOW",
            "attackRequirements": "NONE",
            "attackVector": "NETWORK",
            "baseScore": 6.9,
            "baseSeverity": "MEDIUM",
            "privilegesRequired": "NONE",
            "providerUrgency": "NOT_DEFINED",
            "subAvailabilityImpact": "NONE",
            "subConfidentialityImpact": "NONE",
            "subIntegrityImpact": "NONE",
            "userInteraction": "NONE",
            "valueDensity": "NOT_DEFINED",
            "vectorString": "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",
            "version": "4.0",
            "vulnAvailabilityImpact": "NONE",
            "vulnConfidentialityImpact": "LOW",
            "vulnIntegrityImpact": "NONE",
            "vulnerabilityResponseEffort": "NOT_DEFINED"
          },
          "format": "CVSS",
          "scenarios": [
            {
              "lang": "en",
              "value": "GENERAL"
            }
          ]
        }
      ],
      "problemTypes": [
        {
          "descriptions": [
            {
              "cweId": "CWE-20",
              "description": "CWE-20 Improper Input Validation",
              "lang": "en",
              "type": "CWE"
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-08-30T18:22:07.096Z",
        "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "shortName": "EEF"
      },
      "references": [
        {
          "tags": [
            "vendor-advisory",
            "related"
          ],
          "url": "https://github.com/ash-project/ash_graphql/security/advisories/GHSA-mrgv-g7gf-r96h"
        },
        {
          "tags": [
            "related"
          ],
          "url": "https://cna.erlef.org/cves/CVE-2026-81633.html"
        },
        {
          "tags": [
            "related"
          ],
          "url": "https://osv.dev/vulnerability/EEF-CVE-2026-81633"
        },
        {
          "tags": [
            "patch"
          ],
          "url": "https://github.com/ash-project/ash_graphql/commit/c8863ed8e5c21f1bfb6125f1d24e78443dfc6351"
        }
      ],
      "source": {
        "discovery": "EXTERNAL"
      },
      "title": "Unhandled KeyError in AshGraphql relay node resolution crashes queries via an unknown type segment"
    }
  },
  "cveMetadata": {
    "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
    "assignerShortName": "EEF",
    "cveId": "CVE-2026-81633",
    "datePublished": "2026-08-30T18:22:07.096Z",
    "dateReserved": "2026-08-30T17:15:01.281Z",
    "dateUpdated": "2026-08-30T18:22:07.096Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2"
}

CVE-2026-81643 (GCVE-0-2026-81643)
Vulnerability from cvelistv5
Published
2026-08-30 18:20
Modified
2026-08-30 18:20
CWE
  • CWE-863 - Incorrect Authorization
Summary
Incorrect Authorization vulnerability in ash-project ash_graphql delivers GraphQL subscription payloads for records a subscriber is not authorized to see. In AshGraphql.Subscription.Batcher, do_send/5 resolves the first notification of a batch and filters it with should_send?/1, which drops results whose errors are coded forbidden or not_found or carry no code, precisely so that unauthorized results are not disclosed. The remaining notifications in the batch are read from the process dictionary, re-run through the pipeline, and appended to the outgoing results without that filter. They reach pubsub.publish_subscription/2, and the not is_nil(record) guard drops only nil records, not error-carrying results. Any two qualifying notifications arriving within the default one-second batch interval suffice, and batching is the default path. The fix applies should_send?/1 to the whole batch. This issue affects ash_graphql: from 1.4.0 before 1.11.0.
Impacted products
Vendor Product Version
ash-project ash_graphql Version: 1.4.0   
    cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*
Create a notification for this product.
   ash-project ash_graphql Version: 3cb2c9870d050c7c4bba6c211aaed97d732f7e81
    cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*
Create a notification for this product.
Show details on NVD website


{
  "containers": {
    "cna": {
      "affected": [
        {
          "collectionURL": "https://repo.hex.pm",
          "cpes": [
            "cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "\u0027Elixir.AshGraphql.Subscription.Batcher\u0027"
          ],
          "packageName": "ash_graphql",
          "packageURL": "pkg:hex/ash_graphql",
          "product": "ash_graphql",
          "programFiles": [
            "lib/subscription/batcher.ex"
          ],
          "programRoutines": [
            {
              "name": "\u0027Elixir.AshGraphql.Subscription.Batcher\u0027:do_send/5"
            }
          ],
          "repo": "https://github.com/ash-project/ash_graphql",
          "vendor": "ash-project",
          "versions": [
            {
              "lessThan": "1.11.0",
              "status": "affected",
              "version": "1.4.0",
              "versionType": "semver"
            }
          ]
        },
        {
          "collectionURL": "https://github.com",
          "cpes": [
            "cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "\u0027Elixir.AshGraphql.Subscription.Batcher\u0027"
          ],
          "packageName": "ash-project/ash_graphql",
          "packageURL": "pkg:github/ash-project/ash_graphql",
          "product": "ash_graphql",
          "programFiles": [
            "lib/subscription/batcher.ex"
          ],
          "programRoutines": [
            {
              "name": "\u0027Elixir.AshGraphql.Subscription.Batcher\u0027:do_send/5"
            }
          ],
          "repo": "https://github.com/ash-project/ash_graphql",
          "vendor": "ash-project",
          "versions": [
            {
              "lessThan": "e8e67f39add2ce0771e6db5f086afe68ba212c57",
              "status": "affected",
              "version": "3cb2c9870d050c7c4bba6c211aaed97d732f7e81",
              "versionType": "git"
            }
          ]
        }
      ],
      "configurations": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eThe application exposes \u003ccode\u003eash_graphql\u003c/code\u003e subscriptions with Ash authorization enabled, and two or more notifications are batched together within the batch interval (the default path).\u003c/p\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "The application exposes `ash_graphql` subscriptions with Ash authorization enabled, and two or more notifications are batched together within the batch interval (the default path)."
            }
          ],
          "value": "The application exposes ash_graphql subscriptions with Ash authorization enabled, and two or more notifications are batched together within the batch interval (the default path)."
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "1.11.0",
                  "versionStartIncluding": "1.4.0",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ],
          "operator": "AND"
        }
      ],
      "credits": [
        {
          "lang": "en",
          "type": "finder",
          "value": "Peter Ullrich"
        },
        {
          "lang": "en",
          "type": "reporter",
          "value": "Peter Ullrich"
        },
        {
          "lang": "en",
          "type": "remediation developer",
          "value": "Zach Daniel / Ash Project"
        },
        {
          "lang": "en",
          "type": "coordinator",
          "value": "Jonatan M\u00e4nnchen / EEF"
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eIncorrect Authorization vulnerability in ash-project ash_graphql delivers GraphQL subscription payloads for records a subscriber is not authorized to see.\u003c/p\u003e\n\u003cp\u003eIn \u003ccode\u003eAshGraphql.Subscription.Batcher\u003c/code\u003e, \u003ccode\u003edo_send/5\u003c/code\u003e resolves the first notification of a batch and filters it with \u003ccode\u003eshould_send?/1\u003c/code\u003e, which drops results whose errors are coded \u003ccode\u003eforbidden\u003c/code\u003e or \u003ccode\u003enot_found\u003c/code\u003e or carry no code, precisely so that unauthorized results are not disclosed. The remaining notifications in the batch are read from the process dictionary, re-run through the pipeline, and appended to the outgoing results without that filter. They reach \u003ccode\u003epubsub.publish_subscription/2\u003c/code\u003e, and the \u003ccode\u003enot is_nil(record)\u003c/code\u003e guard drops only nil records, not error-carrying results. Any two qualifying notifications arriving within the default one-second batch interval suffice, and batching is the default path. The fix applies \u003ccode\u003eshould_send?/1\u003c/code\u003e to the whole batch.\u003c/p\u003e\n\u003cp\u003eThis issue affects ash_graphql: from 1.4.0 before 1.11.0.\u003c/p\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "Incorrect Authorization vulnerability in ash-project ash_graphql delivers GraphQL subscription payloads for records a subscriber is not authorized to see.\n\nIn `AshGraphql.Subscription.Batcher`, `do_send/5` resolves the first notification of a batch and filters it with `should_send?/1`, which drops results whose errors are coded `forbidden` or `not_found` or carry no code, precisely so that unauthorized results are not disclosed. The remaining notifications in the batch are read from the process dictionary, re-run through the pipeline, and appended to the outgoing results without that filter. They reach `pubsub.publish_subscription/2`, and the `not is_nil(record)` guard drops only nil records, not error-carrying results. Any two qualifying notifications arriving within the default one-second batch interval suffice, and batching is the default path. The fix applies `should_send?/1` to the whole batch.\n\nThis issue affects ash_graphql: from 1.4.0 before 1.11.0."
            }
          ],
          "value": "Incorrect Authorization vulnerability in ash-project ash_graphql delivers GraphQL subscription payloads for records a subscriber is not authorized to see.\n\nIn AshGraphql.Subscription.Batcher, do_send/5 resolves the first notification of a batch and filters it with should_send?/1, which drops results whose errors are coded forbidden or not_found or carry no code, precisely so that unauthorized results are not disclosed. The remaining notifications in the batch are read from the process dictionary, re-run through the pipeline, and appended to the outgoing results without that filter. They reach pubsub.publish_subscription/2, and the not is_nil(record) guard drops only nil records, not error-carrying results. Any two qualifying notifications arriving within the default one-second batch interval suffice, and batching is the default path. The fix applies should_send?/1 to the whole batch.\n\nThis issue affects ash_graphql: from 1.4.0 before 1.11.0."
        }
      ],
      "impacts": [
        {
          "capecId": "CAPEC-1",
          "descriptions": [
            {
              "lang": "en",
              "value": "CAPEC-1 Accessing Functionality Not Properly Constrained by ACLs"
            }
          ]
        }
      ],
      "metrics": [
        {
          "cvssV4_0": {
            "Automatable": "NOT_DEFINED",
            "Recovery": "NOT_DEFINED",
            "Safety": "NOT_DEFINED",
            "attackComplexity": "LOW",
            "attackRequirements": "PRESENT",
            "attackVector": "NETWORK",
            "baseScore": 2.3,
            "baseSeverity": "LOW",
            "privilegesRequired": "LOW",
            "providerUrgency": "NOT_DEFINED",
            "subAvailabilityImpact": "NONE",
            "subConfidentialityImpact": "NONE",
            "subIntegrityImpact": "NONE",
            "userInteraction": "NONE",
            "valueDensity": "NOT_DEFINED",
            "vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N",
            "version": "4.0",
            "vulnAvailabilityImpact": "NONE",
            "vulnConfidentialityImpact": "LOW",
            "vulnIntegrityImpact": "NONE",
            "vulnerabilityResponseEffort": "NOT_DEFINED"
          },
          "format": "CVSS",
          "scenarios": [
            {
              "lang": "en",
              "value": "GENERAL"
            }
          ]
        }
      ],
      "problemTypes": [
        {
          "descriptions": [
            {
              "cweId": "CWE-863",
              "description": "CWE-863 Incorrect Authorization",
              "lang": "en",
              "type": "CWE"
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-08-30T18:20:35.564Z",
        "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "shortName": "EEF"
      },
      "references": [
        {
          "tags": [
            "vendor-advisory",
            "related"
          ],
          "url": "https://github.com/ash-project/ash_graphql/security/advisories/GHSA-j684-hch4-q888"
        },
        {
          "tags": [
            "related"
          ],
          "url": "https://cna.erlef.org/cves/CVE-2026-81643.html"
        },
        {
          "tags": [
            "related"
          ],
          "url": "https://osv.dev/vulnerability/EEF-CVE-2026-81643"
        },
        {
          "tags": [
            "patch"
          ],
          "url": "https://github.com/ash-project/ash_graphql/commit/e8e67f39add2ce0771e6db5f086afe68ba212c57"
        }
      ],
      "source": {
        "discovery": "EXTERNAL"
      },
      "title": "Broken access control in AshGraphql subscription batcher applies authorization suppression to only the first notification"
    }
  },
  "cveMetadata": {
    "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
    "assignerShortName": "EEF",
    "cveId": "CVE-2026-81643",
    "datePublished": "2026-08-30T18:20:35.564Z",
    "dateReserved": "2026-08-30T04:45:01.564Z",
    "dateUpdated": "2026-08-30T18:20:35.564Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2"
}

CVE-2026-82367 (GCVE-0-2026-82367)
Vulnerability from cvelistv5
Published
2026-08-30 18:17
Modified
2026-08-30 18:17
CWE
  • CWE-488 - Exposure of Data Element to Wrong Session
Summary
Exposure of Data Element to Wrong Session vulnerability in ash-project ash_graphql can deliver one subscription's resolved records to a different subscriber's topic. AshGraphql.Subscription.Batcher.do_send/5 reads the resolved batch from the process dictionary via Process.get(:batch_resolved) and then unconditionally deletes it. That is sound only inside a task the library owns. On the :backpressure_sync and :noproc fallbacks do_send/5 runs inline in the publishing caller's process, so if a resolver inside an outer do_send/5 triggers another synchronous Ash notification, the inner call finds the outer run's value still under :batch_resolved, adopts it as its own result, and publishes it to the inner topic, a different subscription document with a different actor and tenant. It then deletes the key, so the outer run publishes nothing. The key is not namespaced by run, so records cannot be told apart. The fix saves, clears, and restores :batch_resolved around each run. This issue affects ash_graphql: from 1.4.0 before 1.11.0.
Impacted products
Vendor Product Version
ash-project ash_graphql Version: 1.4.0   
    cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*
Create a notification for this product.
   ash-project ash_graphql Version: 3cb2c9870d050c7c4bba6c211aaed97d732f7e81
    cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*
Create a notification for this product.
Show details on NVD website


{
  "containers": {
    "cna": {
      "affected": [
        {
          "collectionURL": "https://repo.hex.pm",
          "cpes": [
            "cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "\u0027Elixir.AshGraphql.Subscription.Batcher\u0027"
          ],
          "packageName": "ash_graphql",
          "packageURL": "pkg:hex/ash_graphql",
          "product": "ash_graphql",
          "programFiles": [
            "lib/subscription/batcher.ex"
          ],
          "programRoutines": [
            {
              "name": "\u0027Elixir.AshGraphql.Subscription.Batcher\u0027:do_send/5"
            }
          ],
          "repo": "https://github.com/ash-project/ash_graphql",
          "vendor": "ash-project",
          "versions": [
            {
              "lessThan": "1.11.0",
              "status": "affected",
              "version": "1.4.0",
              "versionType": "semver"
            }
          ]
        },
        {
          "collectionURL": "https://github.com",
          "cpes": [
            "cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*"
          ],
          "defaultStatus": "unaffected",
          "modules": [
            "\u0027Elixir.AshGraphql.Subscription.Batcher\u0027"
          ],
          "packageName": "ash-project/ash_graphql",
          "packageURL": "pkg:github/ash-project/ash_graphql",
          "product": "ash_graphql",
          "programFiles": [
            "lib/subscription/batcher.ex"
          ],
          "programRoutines": [
            {
              "name": "\u0027Elixir.AshGraphql.Subscription.Batcher\u0027:do_send/5"
            }
          ],
          "repo": "https://github.com/ash-project/ash_graphql",
          "vendor": "ash-project",
          "versions": [
            {
              "lessThan": "b798ef5288664a0261990b19765558f168b718fb",
              "status": "affected",
              "version": "3cb2c9870d050c7c4bba6c211aaed97d732f7e81",
              "versionType": "git"
            }
          ]
        }
      ],
      "configurations": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eThe application uses \u003ccode\u003eash_graphql\u003c/code\u003e subscriptions where a subscription resolver\u0027s execution can itself emit an Ash notification, and delivery takes the synchronous \u003ccode\u003e:backpressure_sync\u003c/code\u003e or \u003ccode\u003e:noproc\u003c/code\u003e (missing-batcher) path rather than a library-owned task.\u003c/p\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "The application uses `ash_graphql` subscriptions where a subscription resolver\u0027s execution can itself emit an Ash notification, and delivery takes the synchronous `:backpressure_sync` or `:noproc` (missing-batcher) path rather than a library-owned task."
            }
          ],
          "value": "The application uses ash_graphql subscriptions where a subscription resolver\u0027s execution can itself emit an Ash notification, and delivery takes the synchronous :backpressure_sync or :noproc (missing-batcher) path rather than a library-owned task."
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:a:ash-project:ash_graphql:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "1.11.0",
                  "versionStartIncluding": "1.4.0",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ],
          "operator": "AND"
        }
      ],
      "credits": [
        {
          "lang": "en",
          "type": "finder",
          "value": "Peter Ullrich"
        },
        {
          "lang": "en",
          "type": "reporter",
          "value": "Peter Ullrich"
        },
        {
          "lang": "en",
          "type": "remediation developer",
          "value": "Zach Daniel / Ash Project"
        },
        {
          "lang": "en",
          "type": "coordinator",
          "value": "Jonatan M\u00e4nnchen / EEF"
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eExposure of Data Element to Wrong Session vulnerability in ash-project ash_graphql can deliver one subscription\u0027s resolved records to a different subscriber\u0027s topic.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eAshGraphql.Subscription.Batcher.do_send/5\u003c/code\u003e reads the resolved batch from the process dictionary via \u003ccode\u003eProcess.get(:batch_resolved)\u003c/code\u003e and then unconditionally deletes it. That is sound only inside a task the library owns. On the \u003ccode\u003e:backpressure_sync\u003c/code\u003e and \u003ccode\u003e:noproc\u003c/code\u003e fallbacks \u003ccode\u003edo_send/5\u003c/code\u003e runs inline in the publishing caller\u0027s process, so if a resolver inside an outer \u003ccode\u003edo_send/5\u003c/code\u003e triggers another synchronous Ash notification, the inner call finds the outer run\u0027s value still under \u003ccode\u003e:batch_resolved\u003c/code\u003e, adopts it as its own result, and publishes it to the inner \u003ccode\u003etopic\u003c/code\u003e, a different subscription document with a different actor and tenant. It then deletes the key, so the outer run publishes nothing. The key is not namespaced by run, so records cannot be told apart. The fix saves, clears, and restores \u003ccode\u003e:batch_resolved\u003c/code\u003e around each run.\u003c/p\u003e\n\u003cp\u003eThis issue affects ash_graphql: from 1.4.0 before 1.11.0.\u003c/p\u003e"
            },
            {
              "base64": false,
              "type": "text/markdown",
              "value": "Exposure of Data Element to Wrong Session vulnerability in ash-project ash_graphql can deliver one subscription\u0027s resolved records to a different subscriber\u0027s topic.\n\n`AshGraphql.Subscription.Batcher.do_send/5` reads the resolved batch from the process dictionary via `Process.get(:batch_resolved)` and then unconditionally deletes it. That is sound only inside a task the library owns. On the `:backpressure_sync` and `:noproc` fallbacks `do_send/5` runs inline in the publishing caller\u0027s process, so if a resolver inside an outer `do_send/5` triggers another synchronous Ash notification, the inner call finds the outer run\u0027s value still under `:batch_resolved`, adopts it as its own result, and publishes it to the inner `topic`, a different subscription document with a different actor and tenant. It then deletes the key, so the outer run publishes nothing. The key is not namespaced by run, so records cannot be told apart. The fix saves, clears, and restores `:batch_resolved` around each run.\n\nThis issue affects ash_graphql: from 1.4.0 before 1.11.0."
            }
          ],
          "value": "Exposure of Data Element to Wrong Session vulnerability in ash-project ash_graphql can deliver one subscription\u0027s resolved records to a different subscriber\u0027s topic.\n\nAshGraphql.Subscription.Batcher.do_send/5 reads the resolved batch from the process dictionary via Process.get(:batch_resolved) and then unconditionally deletes it. That is sound only inside a task the library owns. On the :backpressure_sync and :noproc fallbacks do_send/5 runs inline in the publishing caller\u0027s process, so if a resolver inside an outer do_send/5 triggers another synchronous Ash notification, the inner call finds the outer run\u0027s value still under :batch_resolved, adopts it as its own result, and publishes it to the inner topic, a different subscription document with a different actor and tenant. It then deletes the key, so the outer run publishes nothing. The key is not namespaced by run, so records cannot be told apart. The fix saves, clears, and restores :batch_resolved around each run.\n\nThis issue affects ash_graphql: from 1.4.0 before 1.11.0."
        }
      ],
      "impacts": [
        {
          "capecId": "CAPEC-12",
          "descriptions": [
            {
              "lang": "en",
              "value": "CAPEC-12 Choosing Message Identifier"
            }
          ]
        }
      ],
      "metrics": [
        {
          "cvssV4_0": {
            "Automatable": "NOT_DEFINED",
            "Recovery": "NOT_DEFINED",
            "Safety": "NOT_DEFINED",
            "attackComplexity": "HIGH",
            "attackRequirements": "PRESENT",
            "attackVector": "NETWORK",
            "baseScore": 2.3,
            "baseSeverity": "LOW",
            "privilegesRequired": "LOW",
            "providerUrgency": "NOT_DEFINED",
            "subAvailabilityImpact": "NONE",
            "subConfidentialityImpact": "NONE",
            "subIntegrityImpact": "NONE",
            "userInteraction": "NONE",
            "valueDensity": "NOT_DEFINED",
            "vectorString": "CVSS:4.0/AV:N/AC:H/AT:P/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N",
            "version": "4.0",
            "vulnAvailabilityImpact": "NONE",
            "vulnConfidentialityImpact": "LOW",
            "vulnIntegrityImpact": "NONE",
            "vulnerabilityResponseEffort": "NOT_DEFINED"
          },
          "format": "CVSS",
          "scenarios": [
            {
              "lang": "en",
              "value": "GENERAL"
            }
          ]
        }
      ],
      "problemTypes": [
        {
          "descriptions": [
            {
              "cweId": "CWE-488",
              "description": "CWE-488 Exposure of Data Element to Wrong Session",
              "lang": "en",
              "type": "CWE"
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-08-30T18:17:13.538Z",
        "orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "shortName": "EEF"
      },
      "references": [
        {
          "tags": [
            "vendor-advisory",
            "related"
          ],
          "url": "https://github.com/ash-project/ash_graphql/security/advisories/GHSA-wm4m-cjmc-5v8c"
        },
        {
          "tags": [
            "related"
          ],
          "url": "https://cna.erlef.org/cves/CVE-2026-82367.html"
        },
        {
          "tags": [
            "related"
          ],
          "url": "https://osv.dev/vulnerability/EEF-CVE-2026-82367"
        },
        {
          "tags": [
            "patch"
          ],
          "url": "https://github.com/ash-project/ash_graphql/commit/b798ef5288664a0261990b19765558f168b718fb"
        }
      ],
      "source": {
        "discovery": "EXTERNAL"
      },
      "title": "Re-entrant synchronous publish in AshGraphql subscription batcher delivers one subscriber\u0027s records to another\u0027s topic"
    }
  },
  "cveMetadata": {
    "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
    "assignerShortName": "EEF",
    "cveId": "CVE-2026-82367",
    "datePublished": "2026-08-30T18:17:13.538Z",
    "dateReserved": "2026-08-30T17:15:01.277Z",
    "dateUpdated": "2026-08-30T18:17:13.538Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2"
}