← Back to CVE Explorer

CVE-2026-69659

Full vulnerability record from the local CVENow database.

Description

Uncontrolled Resource Consumption vulnerability in ash-project ash allows an attacker to exhaust the memory of the node via a crafted keyset pagination cursor. Read actions with keyset pagination deserialize the client-supplied page[:after] or page[:before] cursor in decode_values/2 in lib/ash/page/keyset.ex, which base64-decodes the value and passes it to :erlang.binary_to_term/2 without bounding its size. The Erlang external term format supports zlib-compressed payloads, which the decoder inflates transparently, so a cursor of a few kilobytes can allocate tens of megabytes of heap in a single call. Ash itself only ever encodes cursors uncompressed, so the decoder accepts a term shape its encoder never produces. Concurrent requests aggregate these allocations and can terminate the node. This issue affects ash: from 1.17.0 before 3.31.1.

Severity
MEDIUM
CVSS score
5.9 (v4.0)
Vulnerability status
Analyzed
Source identifier
6b3ad84c-e1a6-4bf7-a703-f496b71e49db
Published
2026-08-09 18:16:43.627000
Last modified
2026-10-24 16:10:00.153000
View original CVE JSON
{
  "id": "CVE-2026-69659",
  "sourceIdentifier": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
  "published": "2026-08-09T18:16:43.627",
  "lastModified": "2026-10-24T16:10:00.153",
  "vulnStatus": "Analyzed",
  "cveTags": [],
  "descriptions": [
    {
      "lang": "en",
      "value": "Uncontrolled Resource Consumption vulnerability in ash-project ash allows an attacker to exhaust the memory of the node via a crafted keyset pagination cursor.\n\nRead actions with keyset pagination deserialize the client-supplied page[:after] or page[:before] cursor in decode_values/2 in lib/ash/page/keyset.ex, which base64-decodes the value and passes it to :erlang.binary_to_term/2 without bounding its size. The Erlang external term format supports zlib-compressed payloads, which the decoder inflates transparently, so a cursor of a few kilobytes can allocate tens of megabytes of heap in a single call. Ash itself only ever encodes cursors uncompressed, so the decoder accepts a term shape its encoder never produces. Concurrent requests aggregate these allocations and can terminate the node.\n\nThis issue affects ash: from 1.17.0 before 3.31.1."
    },
    {
      "lang": "es",
      "value": "Una vulnerabilidad de consumo de recursos no controlado en ash-project ash permite a un atacante agotar la memoria del nodo a través de un cursor de paginación de conjunto de claves manipulado.\n\nLas acciones de lectura con paginación de conjunto de claves deserializan el cursor page[:after] o page[:before] proporcionado por el cliente en decode_values/2 en lib/ash/page/keyset.ex, que decodifica el valor en base64 y lo pasa a :erlang.binary_to_term/2 sin limitar su tamaño. El formato de término externo de Erlang soporta cargas útiles comprimidas con zlib, que el decodificador infla de forma transparente, por lo que un cursor de unos pocos kilobytes puede asignar decenas de megabytes de memoria heap en una sola llamada. Ash mismo solo codifica cursores sin comprimir, por lo que el decodificador acepta una forma de término que su codificador nunca produce. Las solicitudes concurrentes agregan estas asignaciones y pueden terminar el nodo.\n\nEste problema afecta a ash: desde 1.17.0 antes de 3.31.1."
    }
  ],
  "affected": [
    {
      "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
      "affectedData": [
        {
          "vendor": "ash-project",
          "product": "ash",
          "defaultStatus": "unaffected",
          "collectionURL": "https://repo.hex.pm",
          "packageName": "ash",
          "cpes": [
            "cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*"
          ],
          "modules": [
            "'Elixir.Ash.Page.Keyset'"
          ],
          "programFiles": [
            "lib/ash/page/keyset.ex"
          ],
          "programRoutines": [
            {
              "name": "'Elixir.Ash.Page.Keyset':decode_values/2"
            }
          ],
          "repo": "https://github.com/ash-project/ash",
          "packageURL": "pkg:hex/ash",
          "versions": [
            {
              "version": "1.17.0",
              "lessThan": "3.31.1",
              "versionType": "semver",
              "status": "affected"
            }
          ]
        },
        {
          "vendor": "ash-project",
          "product": "ash",
          "defaultStatus": "unaffected",
          "collectionURL": "https://github.com",
          "packageName": "ash-project/ash",
          "cpes": [
            "cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*"
          ],
          "modules": [
            "'Elixir.Ash.Page.Keyset'"
          ],
          "programFiles": [
            "lib/ash/page/keyset.ex"
          ],
          "programRoutines": [
            {
              "name": "'Elixir.Ash.Page.Keyset':decode_values/2"
            }
          ],
          "repo": "https://github.com/ash-project/ash",
          "packageURL": "pkg:github/ash-project/ash",
          "versions": [
            {
              "version": "f8fadc67e67c955bb68b3a8d642be13e2b7e8ca9",
              "lessThan": "1816b103af975221210478d61db20adcea700319",
              "versionType": "git",
              "status": "affected"
            }
          ]
        }
      ]
    }
  ],
  "metrics": {
    "cvssMetricV40": [
      {
        "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
        "type": "Secondary",
        "cvssData": {
          "version": "4.0",
          "vectorString": "CVSS:4.0/AV:L/AC:L/AT:P/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",
          "baseScore": 5.9,
          "baseSeverity": "MEDIUM",
          "attackVector": "LOCAL",
          "attackComplexity": "LOW",
          "attackRequirements": "PRESENT",
          "privilegesRequired": "NONE",
          "userInteraction": "NONE",
          "vulnConfidentialityImpact": "NONE",
          "vulnIntegrityImpact": "NONE",
          "vulnAvailabilityImpact": "HIGH",
          "subConfidentialityImpact": "NONE",
          "subIntegrityImpact": "NONE",
          "subAvailabilityImpact": "NONE",
          "exploitMaturity": "NOT_DEFINED",
          "confidentialityRequirement": "NOT_DEFINED",
          "integrityRequirement": "NOT_DEFINED",
          "availabilityRequirement": "NOT_DEFINED",
          "modifiedAttackVector": "NOT_DEFINED",
          "modifiedAttackComplexity": "NOT_DEFINED",
          "modifiedAttackRequirements": "NOT_DEFINED",
          "modifiedPrivilegesRequired": "NOT_DEFINED",
          "modifiedUserInteraction": "NOT_DEFINED",
          "modifiedVulnConfidentialityImpact": "NOT_DEFINED",
          "modifiedVulnIntegrityImpact": "NOT_DEFINED",
          "modifiedVulnAvailabilityImpact": "NOT_DEFINED",
          "modifiedSubConfidentialityImpact": "NOT_DEFINED",
          "modifiedSubIntegrityImpact": "NOT_DEFINED",
          "modifiedSubAvailabilityImpact": "NOT_DEFINED",
          "Safety": "NOT_DEFINED",
          "Automatable": "NOT_DEFINED",
          "Recovery": "NOT_DEFINED",
          "valueDensity": "NOT_DEFINED",
          "vulnerabilityResponseEffort": "NOT_DEFINED",
          "providerUrgency": "NOT_DEFINED"
        }
      }
    ],
    "cvssMetricV31": [
      {
        "source": "[email protected]",
        "type": "Primary",
        "cvssData": {
          "version": "3.1",
          "vectorString": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H",
          "baseScore": 5.5,
          "baseSeverity": "MEDIUM",
          "attackVector": "LOCAL",
          "attackComplexity": "LOW",
          "privilegesRequired": "LOW",
          "userInteraction": "NONE",
          "scope": "UNCHANGED",
          "confidentialityImpact": "NONE",
          "integrityImpact": "NONE",
          "availabilityImpact": "HIGH"
        },
        "exploitabilityScore": 1.8,
        "impactScore": 3.6
      }
    ],
    "ssvcV203": [
      {
        "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
        "ssvcData": {
          "timestamp": "2026-08-10T17:23:22.371179Z",
          "id": "CVE-2026-69659",
          "options": [
            {
              "exploitation": "poc"
            },
            {
              "automatable": "no"
            },
            {
              "technicalImpact": "partial"
            }
          ],
          "role": "CISA Coordinator",
          "version": "2.0.3"
        }
      }
    ]
  },
  "weaknesses": [
    {
      "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
      "type": "Secondary",
      "description": [
        {
          "lang": "en",
          "value": "CWE-502"
        }
      ]
    }
  ],
  "configurations": [
    {
      "nodes": [
        {
          "operator": "OR",
          "negate": false,
          "cpeMatch": [
            {
              "vulnerable": true,
              "criteria": "cpe:2.3:a:ash-hq:ash_framework:*:*:*:*:*:*:*:*",
              "versionStartIncluding": "1.17.0",
              "versionEndExcluding": "3.31.1",
              "matchCriteriaId": "E6BD669B-1C5C-410A-89F3-4921277EBEEB"
            }
          ]
        }
      ]
    }
  ],
  "references": [
    {
      "url": "https://cna.erlef.org/cves/CVE-2026-69659.html",
      "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
      "tags": [
        "Third Party Advisory"
      ]
    },
    {
      "url": "https://github.com/ash-project/ash/commit/1816b103af975221210478d61db20adcea700319",
      "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
      "tags": [
        "Patch"
      ]
    },
    {
      "url": "https://github.com/ash-project/ash/security/advisories/GHSA-j35q-v8h8-7mwq",
      "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
      "tags": [
        "Vendor Advisory",
        "Patch"
      ]
    },
    {
      "url": "https://osv.dev/vulnerability/EEF-CVE-2026-69659",
      "source": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
      "tags": [
        "Third Party Advisory",
        "Patch"
      ]
    },
    {
      "url": "https://github.com/ash-project/ash/security/advisories/GHSA-j35q-v8h8-7mwq",
      "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
      "tags": [
        "Vendor Advisory",
        "Patch"
      ]
    }
  ]
}