Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSubmit parameters to exposed bulk update/destroy action
-
DeliveryInclude private argument key (e.g. acting_user_id) in map
-
Exploitbase_changeset matches argument without public? check
-
ExecutionAttacker value overrides server-set argument
-
ImpactPrivilege escalation / integrity violation
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A08:2025 - Software or Data Integrity Failures
ASVS 5.0
V4 - API and Web Service Object attribute protection
|
| Exploitation Conditions | Two concrete conditions must both hold: (1) the application exposes a bulk update or bulk destroy action to user-controlled parameters - for example via AshJsonApi, AshGraphql, or a controller that forwards request params to Ash.bulk_update/4 or Ash.bulk_destroy/4; and (2) that action declares a private argument (public?: false) that is security-relevant - referenced by an arg(...) template in the action's changes or validations for authorization (e.g. acting_user_id), record ownership, or audit metadata. Limiting factors: only ash versions 2.17.15 through 3.33.10 are affected (fixed in 3.33.11); the non-bulk changeset path is already protected by CVE-2026-55736; and if no private argument is used in a security-relevant way, the practical impact is negligible. Server-side code can still legitimately set these via the :private_arguments option after the fix. |
| Impact | This is a real but conditional integrity/authorization flaw rather than a mass-exploitation threat. The vendor CVSS 4.0 vector (5.9, AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:N) rates it MEDIUM with pure integrity impact and no confidentiality/availability effect - consistent with a mass-assignment-class bug (CWE-915) that lets a caller set private action arguments. Note a signal conflict: the vendor chose AV:L, but the description explicitly states the flaw is reachable through AshJsonApi, AshGraphql, or a controller forwarding request parameters to Ash.bulk_destroy/4 or Ash.bulk_update/4 - i.e. remotely over the network in typical deployments - so AV:N is arguably more accurate; verify intended vector with the CNA (EEF). The AT:P (attack requirement present) correctly captures that impact is gated on the application actually using a security-relevant private argument, so this is not a universal one-shot. No EPSS score, no CISA KEV listing, and no public exploit code are present in the input, so there is no evidence of active exploitation; this is a fix-during-maintenance-window item, prioritized higher only where bulk actions expose private arguments driving authorization/ownership. A vendor patch (ash 3.33.11) is available, which raises remediation priority since defenders can act immediately. |
| Exploit ScenarioDerived | An Elixir application exposes a bulk update or bulk destroy action through AshJsonApi or AshGraphql, and that action uses a private argument (e.g. acting_user_id) referenced by an arg(...) template to drive authorization or record ownership. An attacker submits a parameter map that includes that private argument key; because the bulk base_changeset matches all argument names without a public? check, the attacker-supplied value is applied, overriding the trusted server-side value and enabling privilege escalation or integrity violation. No public proof-of-concept is identified in the provided data. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 25, 2026
Improperly controlled modification of dynamically-determined object attributes in the Ash framework for Elixir (ash 2.17.15 through 3.33.10) lets a caller set private action arguments, declared with public?: false, on the bulk update and bulk destroy code paths. The affected matching logic in Ash.Actions.Destroy.Bulk.base_changeset/5 and Ash.Actions.Update.Bulk.base_changeset/5 compares every key of a caller-supplied parameter map against all of the action's arguments without checking public?, so any application that forwards end-user parameters into Ash.bulk_update/4 or Ash.bulk_destroy/4 (for example via AshJsonApi, AshGraphql, or a controller) can have a private argument injected; when that argument is referenced by an arg(...) template driving authorization, record ownership, or audit metadata, the result is an integrity violation or privilege escalation. The vendor has released a patch in 3.33.11 that requires public? in the bulk argument matching; no public exploit code has been identified at time of analysis, and the impact is conditional on the application both exposing a bulk action to untrusted input and using a security-relevant private argument.
RemediationAI
Upgrade the ash dependency to 3.33.11 or later, which is the vendor-released fix requiring public? in the argument matching on both bulk paths; the upstream changes are in commits https://github.com/ash-project/ash/commit/8c17434803b2e91de522bdfbd0ca918e5d5898df and https://github.com/ash-project/ash/commit/6b7ac53a0a2532291eb940d7beaf0fbb2da6fc4f, and the advisory is https://github.com/ash-project/ash/security/advisories/GHSA-c2p4-p7q6-hr2j. After upgrading, server-side code must still set these values explicitly through the :private_arguments option rather than relying on parameter maps. Until you can upgrade, audit every bulk update and bulk destroy action reachable from untrusted input and stop forwarding raw request parameters into Ash.bulk_update/4 and Ash.bulk_destroy/4 - allowlist only the public fields the endpoint actually accepts, accepting the trade-off that any new legitimate field must be added to the allowlist. Additionally, remove security-relevant private arguments from arg(...) templates in bulk actions or set their values only in server-side code paths; this closes the injection vector but requires refactoring validations and changes that currently depend on those templates. Because exploitation requires both an exposed bulk action and a security-relevant private argument, prioritizing the audit on AshJsonApi and AshGraphql endpoints that serve bulk actions reduces risk most quickly; note that no vendor patch bypass is documented and that the non-bulk path was already remediated by CVE-2026-55736.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Ash is an Elixir application framework built on Ecto/data layers that models resources, actions, and arguments; arguments can be declared public?: false so they are settable only by trusted server-side code (for example through Ash.Changeset.set_private_argument/3) and must never be taken from user input. This is a CWE-915 (Improperly Controlled Modification of Dynamically-Determined Object Attributes) mass-assignment flaw. An earlier issue, CVE-2026-55736, hardened the standard (non-bulk) changeset path so private arguments are stripped from user-supplied parameter maps, but the bulk paths were left uncovered: Ash.Actions.Destroy.Bulk.base_changeset/5 and Ash.Actions.Update.Bulk.base_changeset/5 match every key in the caller-supplied parameter map against all of the action's arguments with no public? check and then apply the matches to the base changeset. Because the injected argument can be referenced by an arg(...) template in the action's changes or validations, an attacker-supplied value such as an acting_user_id used for authorization or ownership, or audit metadata, is honored as if it had been set server-side. The affected package is the ash-project:ash library (CPE cpe:2.3:a:ash-project:ash), and exposure is realized through downstream interfaces such as AshJsonApi, AshGraphql, or custom controllers that pass request parameters into bulk actions. The fix adds public? to the argument matching on both bulk paths while preserving legitimate server-side setting through the :private_arguments option.
Know when Ash gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N
Reachable remotely via AshJsonApi/AshGraphql/controllers (AV:N); depends on the app using a security-relevant private argument, outside attacker control (AC:H); integrity/privesc only, no confidentiality or availability impact.
Primary rating from Vendor (EEF).
CVSS VectorVendor: EEF
DescriptionCVE.org
Improperly Controlled Modification of Dynamically-Determined Object Attributes vulnerability in ash-project ash allows a user to set the value of a private action argument on the bulk destroy and bulk update paths.
Action arguments declared with public?: false are meant to be set only by trusted server-side code (for example via Ash.Changeset.set_private_argument/3) and must not be settable from end-user input. CVE-2026-55736 fixed the non-bulk changeset path to strip private arguments from user-supplied parameter maps, but the bulk destroy and bulk update paths were not covered.
Ash.Actions.Destroy.Bulk.base_changeset/5 and Ash.Actions.Update.Bulk.base_changeset/5 match every key in the caller-supplied parameter map against all of the action's arguments with no public? check, then apply the matches to the base changeset. A caller who can submit parameters to a bulk destroy or bulk update action (for example through AshJsonApi, AshGraphql, or a controller that forwards request parameters to Ash.bulk_destroy/4 or Ash.bulk_update/4) can therefore set any private argument of that action, including one referenced by an arg(...) template in the action's changes or validations. Depending on how the application uses the argument (for example an acting_user_id driving authorization or record ownership, or audit metadata), this can lead to an integrity violation or privilege escalation.
The fix requires public? in the argument matching on both bulk paths; private arguments remain settable server-side via the :private_arguments option.
This issue affects ash: from 2.17.15 before 3.33.11.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Privilege escalation occurs when an attacker leverages flaws in access control mechanisms to gain permissions beyond what they were originally granted.
Private argument injection in the Ash Elixir framework (versions 3.0.0 through 3.29.2) allows end users to set action ar
An issue was discovered in the ash crate before 0.33.1 for Rust. Rated critical severity (CVSS 9.8), this vulnerability
Atom table exhaustion in the Ash framework (Elixir) allows an unauthenticated remote attacker to crash a BEAM node by su
Cross-tenant record takeover in the Ash framework (Elixir) for versions 1.22.0 up to 3.37.2: when a resource uses attrib
An authorization bypass in the Ash framework (Elixir) lets authenticated, lower-privileged actors recover values they ar
Information disclosure in the Ash framework for Elixir (versions 2.6.0 up to but not including 3.34.6) lets an authentic
An incorrect authorization flaw in the Elixir Ash framework (versions 3.24.0 up to but not including 3.37.1) lets an aut
Persistent record-level denial of service in the ash Elixir resource framework (versions 3.6.3-3.32.1) lets any actor wh
Integer overflow in Ash Framework's vector encoding corrupts stored vectors in any Elixir application using Ash versions
CPU exhaustion in Ash Framework's string type constraint handler allows denial of service against Elixir applications th
Memory exhaustion via decompression bomb in Ash Framework's keyset pagination can terminate Erlang nodes running version
Unbounded string storage in Ash Framework versions 0.10.0 through 3.32.x allows unauthenticated attackers to bypass max_
EUVD-2026-86550
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB