CVE-2026-82564
nicheAuthorization Bypass in ash-project ash_ai AI Tool Execution
ash-project ash_ai, the Elixir package that exposes Ash Framework resources as tools for AI agents, is vulnerable to an authorization bypass through user-controlled key (CWE-639) in versions 0.6.0 through before 1.0.0. The identity_filter/3 function in AshAi.Tool.Execution built the scoping filter for tool-driven updates and deletes directly from raw tool arguments without type-casting, so a map-shaped argument such as {"public_ref": {"not_eq": " "}} is parsed as a predicate expression rather than a literal, and an omitted key yields an IS NULL filter. Combined with Ash.Query.limit(1) and bulk update/destroy operations, a caller can retarget the write at a record it never identified — potentially any row, and with bulk operations every row in the affected table. An attacker who is legitimately able to invoke such a tool gains unauthorized modification or deletion of arbitrary records (high integrity impact, CVSS 4.0 score 7.1). No public proof-of-concept, CISA KEV listing, or in-the-wild exploitation is known; EPSS puts the 30-day exploitation probability at about 0.3%.
What to do: Upgrade ash_ai to 1.0.0 or later, where identity values are cast to the field's type and non-scalar inputs are rejected. In the meantime, audit any AI tools that perform identity-scoped updates or destroys on sensitive tables and restrict which callers can invoke them. Applications on affected versions should treat tool callers as potentially able to modify or delete any row in targeted tables.
| ash-project ash_ai | >= 0.6.0, < 1.0.0 |
Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.
Authorization Bypass Through User-Controlled Key vulnerability in ash-project ash_ai allows a caller of an identity-configured tool to update or destroy records it never identified, including every row in the table. In AshAi.Tool.Execution, identity_filter/3 built the update/destroy filter directly from the raw tool arguments as [{key, Map.get(arguments, to_string(key))}] and passed it to Ash.Query.do_filter/2. A map value is parsed as a predicate expression rather than a literal, so a caller can send {"public_ref": {"not_eq": " "}} and, combined with Ash.Query.limit(1) and Ash.bulk_update!/Ash.bulk_destroy!, retarget the write at a record it never identified; an omitted key yields an IS NULL filter that matches an arbitrary row. The fix casts each identity value to the field type, rejecting non-scalar inputs. This issue affects ash_ai: from 0.6.0 before 1.0.0.
- Weakness
- CWE-639
- Vector
- CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:H/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
In the news0 stories
No ingested article mentions this CVE yet.