PT-2026-123198
CVE-2026-96581
·
Published
2026-10-26
·
Updated
2026-10-26
Description by
CVSS 4.0
7.6
HighMetricsAV:N/AC:L/AT:P/PR:L/UI:N/VC:H/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
Name of the Vulnerable Software and Affected Versions
ash versions 1.22.0 through 3.37.1
Description
An authorization bypass exists in ash when using attribute multitenancy. The
Ash.Actions.Create (lib/ash/actions/create/create.ex) and Ash.Actions.Create.Bulk (lib/ash/actions/create/bulk.ex) functions fail to scope conflicting records to the request's tenant when upserting on the primary key or an all tenants? identity. An attacker can provide a record ID belonging to another tenant in a create action where upsert? is set to true. This allows the attacker to read the record's attributes, overwrite its fields, and potentially move the record into their own tenant by updating the tenant attribute. This occurs because read and update policies are not executed during upserts, and create policies pass as they only validate the caller's own tenant.Recommendations
Update ash to version 3.37.2 or later.
As a temporary workaround, add
upsert condition expr(<tenant attribute> == ^tenant()) to every create action that upserts on the primary key or on an all tenants? identity, ensuring it is not combined with return skipped upsert?. Found an issue in the description? Have something to add? Feel free to write us 👾