Description
Authorization Bypass Through User-Controlled Key vulnerability in ash-project ash allows a user of one tenant to read, overwrite and take over another tenant's records via an upserting create action.

Under attribute multitenancy, Ash.Actions.Create (lib/ash/actions/create/create.ex) and Ash.Actions.Create.Bulk (lib/ash/actions/create/bulk.ex) upserted on the primary key, or on an all_tenants? identity, without scoping the conflicting record to the request's tenant. A caller of a create action with upsert? true that accepts the primary key, supplying a record id from another tenant, updated that record's upsert fields and received all of its attributes in the result. With the default upsert fields the tenant attribute was written too, moving the record into the caller's tenant. Read and update policies do not run for upserts, and tenant-scoped create policies pass because the tenant is the caller's own.

This issue affects ash: from 1.22.0 before 3.37.2.
Published: 2026-10-26
Score: 7.6 High
EPSS: n/a
KEV: No
Impact: Authorization Bypass
Action: Immediate Patch
AI Analysis

Impact

An upsert operation targeting a record’s primary key can ignore the tenant attribute, allowing a user from one tenant to read, overwrite, and take ownership of another tenant’s data. The vulnerability exists because the upsert logic does not enforce tenant scoping, and the resulting attributes—including the tenant identifier—are written to the target record. This gives the attacker full access to the victim’s data and the ability to permanently replace it with their own records. The weakness is classified as CWE‑639, highlighting an authorization bypass that results in data tampering and loss of integrity.

Affected Systems

The issue affects the Ash framework version range from 1.22.0 up to but not including 3.37.2. Users running any of those releases on multi‑tenant deployments are vulnerable if they employ create actions with the upsert option enabled.

Risk and Exploitability

The CVSS score of 7.6 indicates a high severity level, and the lack of an EPSS score does not diminish the risk, especially since the defect is not yet listed in the CISA KEV catalog. The flaw can be exploited remotely by calling the exposed create API endpoint with an upsert payload that includes another tenant’s record ID, thereby violating isolation boundaries. An attacker does not need elevated privileges beyond legitimate tenant access, making the vulnerability highly practical for malicious tenants.

Generated by OpenCVE AI on October 26, 2026 at 08:21 UTC.

Remediation

Vendor Workaround

Add upsert_condition expr(<tenant attribute> == ^tenant()) to every create action that upserts on the primary key or on an all_tenants? identity, and do not combine it with return_skipped_upsert?. An upsert into another tenant's record then fails with Ash.Error.Changes.StaleRecord (or is skipped in a bulk create) and leaves that record unchanged. This does not help on the Mnesia data layer, which ignores upsert conditions in affected versions.


OpenCVE Recommended Actions

  • Upgrade Ash to version 3.37.2 or newer, which removes the tenant‑scoping bug in upsert operations.
  • If an upgrade is not immediately possible, modify every create action that supports upsert on the primary key or an all_tenants identity by adding the clause upsert_condition expr(tenant attribute == ^tenant()). Avoid combining this with return_skipped_upsert? to ensure the operation fails rather than silently continuing.
  • Disable or carefully control the use of upsert? true across tenant boundaries to prevent tenant isolation bypass, and apply the same tenant‑scoping check to bulk create actions.

Generated by OpenCVE AI on October 26, 2026 at 08:21 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Mon, 26 Oct 2026 07:45:00 +0000

Type Values Removed Values Added
Description Authorization Bypass Through User-Controlled Key vulnerability in ash-project ash allows a user of one tenant to read, overwrite and take over another tenant's records via an upserting create action. Under attribute multitenancy, Ash.Actions.Create (lib/ash/actions/create/create.ex) and Ash.Actions.Create.Bulk (lib/ash/actions/create/bulk.ex) upserted on the primary key, or on an all_tenants? identity, without scoping the conflicting record to the request's tenant. A caller of a create action with upsert? true that accepts the primary key, supplying a record id from another tenant, updated that record's upsert fields and received all of its attributes in the result. With the default upsert fields the tenant attribute was written too, moving the record into the caller's tenant. Read and update policies do not run for upserts, and tenant-scoped create policies pass because the tenant is the caller's own. This issue affects ash: from 1.22.0 before 3.37.2.
Title An upsert on the primary key in Ash ignores attribute multitenancy, so one tenant can read, overwrite and take over another tenant's records
First Time appeared Ash-project
Ash-project ash
Weaknesses CWE-639
CPEs cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*
Vendors & Products Ash-project
Ash-project ash
References
Metrics cvssV4_0

{'score': 7.6, 'vector': 'CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N'}


cve-icon MITRE

Status: PUBLISHED

Assigner: EEF

Published:

Updated: 2026-10-26T07:20:07.186Z

Reserved: 2026-10-25T17:30:02.206Z

Link: CVE-2026-96581

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Received

Published: 2026-10-26T08:17:20.423

Modified: 2026-10-26T08:17:20.423

Link: CVE-2026-96581

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-10-26T08:30:08Z

Weaknesses
  • CWE-639

    Authorization Bypass Through User-Controlled Key