Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessIdentify exposed Ash action with private argument
-
DeliverySubmit HTTP request with string-keyed private argument
-
ExploitFramework filter bypass accepts injected value into changeset
-
ExecutionApplication applies injected argument to authorization or ownership logic
-
ImpactPrivilege escalation or integrity violation achieved
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 | The target application must run ash versions 3.0.0 through 3.29.2 and must define at least one action (create, update, destroy, or atomic/bulk update) that declares a private argument with public?: false. Exploitation via the regular changeset path requires submitting parameters with string (binary) keys matching the private argument name, which is standard behavior when consuming JSON or form data - no special encoding or crafting is needed. Exploitation via the atomic path (fully_atomic_changeset/4) works with both string and atom keys, requiring no knowledge of key format at all. Exploitation is limited by the following factors: if no action in the application defines a private argument, there is nothing to inject; if private arguments exist but are not used for security-relevant decisions (authorization, ownership, tenant isolation), there is no meaningful integrity violation; and the attacker must know or guess the exact name of the private argument to target it. Authentication requirements are not determinable from the CVSS vector alone as AV:L/PR:N is an unusual combination for a web framework - in practice, whether the targeted action requires authentication depends on the application's own access controls. |
| Impact | The CVSS 4.0 score of 5.9 (Medium) with VI:H reflects meaningful but conditional integrity impact. The provided vector's AV:L (local attack vector) warrants scrutiny: Ash actions in typical deployments are exposed over HTTP APIs where parameters arrive from remote, unauthenticated users, making the practical attack surface network-accessible rather than local. AT:P (attack requirements present) correctly captures the dependency on the application defining a security-sensitive private argument. EPSS data is not provided in the input, so probabilistic exploitation likelihood cannot be assessed. This vulnerability is not listed in CISA KEV and no public exploit code has been identified. Real-world severity is highly application-dependent: applications that use private arguments only for internal routing or logging face negligible risk, while those that rely on private arguments for authorization (e.g., acting_user_id driving access control) are exposed to meaningful privilege escalation. The atomic path's complete absence of filtering is the higher-severity variant, as it accepts both atom and string keys. |
| Exploit ScenarioDerived | An attacker sends an HTTP POST request to an application endpoint that invokes an Ash for_create or fully_atomic_changeset action defining a private argument named acting_user_id. By including the key-value pair "acting_user_id": "<victim_user_id>" as a string-keyed JSON parameter, the attacker bypasses the incomplete filter and the framework accepts the injected value into the changeset. The application then uses that acting_user_id to determine record ownership or perform authorization checks, effectively granting the attacker the permissions and data access of the targeted user. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Jun 23, 2026
Private argument injection in the Ash Elixir framework (versions 3.0.0 through 3.29.2) allows end users to set action arguments explicitly marked public?: false, which are designed to be controlled exclusively by trusted server-side code. The filtering logic in both the regular changeset path and the atomic changeset path fails to enforce the public? flag when input parameters arrive as string (binary) keys - the default format for user-supplied JSON or form data. An attacker who submits a string-keyed parameter matching a private argument name can inject an arbitrary value, potentially enabling privilege escalation or integrity violations if that argument drives authorization decisions such as acting_user_id or record ownership. No public exploit code has been identified and this vulnerability is not listed in CISA KEV.
RemediationAI
Upgrade ash to version 3.29.3 or later, which contains the authoritative fix from commit d9b3100219b3ea86d73202bf7368c03a7688efea that adds &1.public? guards to all argument lookup predicates in lib/ash/changeset/changeset.ex. The vendor advisory is at https://github.com/ash-project/ash/security/advisories/GHSA-f4hc-ppw9-4hhw and the OSV record is at https://osv.dev/vulnerability/EEF-CVE-2026-55736. If immediate patching is not feasible, audit every action that defines private arguments (public?: false) and assess whether those arguments influence security-sensitive behavior such as authorization, ownership assignment, or tenant resolution. As a compensating control, add explicit server-side assertions in action code to verify that security-critical private arguments equal the server-computed value before proceeding - this adds overhead and is not a substitute for patching. Disabling atomic and bulk update paths for actions with sensitive private arguments eliminates the fully unguarded code path but may break intended application functionality.
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 framework for building resource-driven APIs using a declarative data layer. Actions in Ash accept arguments; the public?: false flag on an argument (CWE-915) is supposed to make it invisible to external callers, settable only via Ash.Changeset.set_private_argument/3 from server-side code. The root cause is an incomplete guard in lib/ash/changeset/changeset.ex: the Enum.find/Enum.any? predicates that look up arguments by name were missing the &1.public? check when matching on binary (string) keys. Because user-supplied parameters from JSON or form submissions naturally arrive as string keys, the atom-keyed path appeared safe while the string-keyed path silently accepted private arguments. The atomic changeset path (Ash.Changeset.fully_atomic_changeset/4, reached through atomic and bulk updates) had no public? check at all - neither atom nor string keys were filtered. The confirmed fix adds &1.public? && guards to all three predicates (commit d9b3100219b3ea86d73202bf7368c03a7688efea), ensuring private arguments are rejected as Ash.Error.Invalid.NoSuchInput in all code paths. Affected CPE: cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*.
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
Parameters arrive over the network in typical Ash web deployments (AV:N); no privileges required to submit input; integrity impact is high when private arguments gate authorization decisions.
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 that is intended to be controlled only by trusted server-side code.
Action arguments declared with public?: false are meant to be set internally (for example via Ash.Changeset.set_private_argument/3) and must not be settable from end-user input. When a changeset is built from a parameter map, Ash filters out private arguments, but the filtering is incomplete.
In the regular changeset path (for_create, for_update, for_destroy), private arguments are stripped only when the parameter key is an atom. When the key is a binary (string), as is the case for user-supplied parameters, the private argument is kept and the user controls its value. In the atomic path (Ash.Changeset.fully_atomic_changeset/4, also reached through atomic and bulk updates), private arguments are not stripped at all, regardless of whether the key is an atom or a binary.
An attacker who can submit parameters to an action that defines a private argument can therefore inject a value for that argument. Depending on how the application uses the argument (for example an acting_user_id driving authorization or record ownership), this can lead to an integrity violation or privilege escalation.
This issue affects ash: from 3.0.0 before 3.29.3.
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.
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_
Memory exhaustion in Ash Framework's runtime filter engine allows an attacker controlling filter inputs to crash an Elix
EUVD-2026-38570
GHSA-f4hc-ppw9-4hhw
NVD
CVE.org
EPSS
Exploit-DB