PT-2026-123198

CVE-2026-96581

·

Published

2026-10-26

·

Updated

2026-10-26

Description by

CVSS 4.0
7.6
High
MetricsAV: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?.
Exploitability
Fix
Impacts
Researchers
Vendors
Affected products
Related identifiers
GHSA-VW7C-67PF-GH96
Found an issue in the description? Have something to add? Feel free to write us 👾