CVE-2026-67579
CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
Summary
Deserialization of Untrusted Data vulnerability in ash-project ash allows an unauthenticated attacker to inject a filter expression through a forged keyset pagination cursor, resulting in SQL injection or code execution depending on the data layer.
Read actions with keyset pagination decode the client-supplied page[:after] or page[:before] cursor in decode_values/2 in lib/ash/page/keyset.ex using non_executable_binary_to_term/2 with [:safe]. That guard blocks new atoms, funs, and ports, but not a struct built from atoms already interned in a running Ash application, so a decoded %Ash.Query.Call{} expression survives and is spliced into the keyset filter as a comparison value in do_filters/4 and evaluated. Because the cursor bypasses the Ash.Expr macro, the runtime never applies the private?/public? gate that would otherwise reject it. On AshPostgres the injected fragment is inlined into the SQL query; on the ETS and Simple data layers it is evaluated in-process as an arbitrary function call.
This issue affects ash: from 1.17.0 before 3.31.3.
Affected Software
| Vendor | Product | Version Range | Status |
|---|---|---|---|
| ash-project | ash | 1.17.0 < 3.31.3 | affected |
| ash-project | ash | f8fadc67e67c955bb68b3a8d642be13e2b7e8ca9 < 91874dd5435bc0ffebd8a254acfa573b39b74520 | affected |
Weaknesses
- CWE-502: CWE-502 Deserialization of Untrusted Data
- CWE-89: CWE-89 Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')
References
- https://github.com/ash-project/ash/security/advisories/GHSA-3gq3-9xm3-c8v3
- https://cna.erlef.org/cves/CVE-2026-67579.html
- https://osv.dev/vulnerability/EEF-CVE-2026-67579
- https://github.com/ash-project/ash/commit/91874dd5435bc0ffebd8a254acfa573b39b74520
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.