CVE-2026-115635

AshPostgres returns another tenant's record for a skipped upsert when return_skipped_upsert? is set

Published Oct 25, 2026 CVSS 4.0 · 6 Medium EPSS < 1% KEV · Not listed
Description
Incorrect Authorization vulnerability in ash-project ash_postgres allows a user to read another tenant's record through a skipped upsert.

When Ash.bulk_create/4 or a single create runs as an upsert with return_skipped_upsert?: true and the upsert is skipped (for example because its upsert_condition does not hold), AshPostgres.DataLayer reads the existing row back by the upsert identity in do_bulk_create/3 and upsert/4. That lookup did not apply the resource's attribute multitenancy, so on a resource using strategy :attribute it could match and return the row of another tenant with the same identity values, exposing its fields to the caller.

This issue affects ash_postgres: from 2.6.22 before 2.15.2.

Analysis

AI-generated

Technical impact

AshPostgres exposes an incorrect authorization flaw that allows a legitimate user to read records belonging to another tenant when using the upsert feature with the return_skipped_upsert? option enabled. Because the lookup that retrieves the existing row for a skipped upsert does not apply the resource's attribute-based multitenancy setting, an upsert that is skipped on the calling tenant can cause the database to return data owned by a different tenant. This leads to unauthorized disclosure of sensitive information and is identified as CWE‑863.

Affected Systems

The issue affects the ash-project's AshPostgres library. All versions starting with 2.6.22 up through (but excluding) 2.15.2 are vulnerable. Deployments of ash_postgres that rely on the upsert functionality with return_skipped_upsert? set to true are at risk.

Risk and Exploitability

The vulnerability has a CVSS score of 6, indicating medium severity. No EPSS score is currently available, and it is not listed in CISA's KEV catalog. The likely attack vector would be via the application’s API or service layer that accepts upsert requests; an attacker with a valid user context can manipulate the request to trigger the vulnerable path. Although the exploitation does not require elevated privileges beyond a typical application user, the ability to read another tenant’s data could be valuable, especially in multi‑tenant environments.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Upgrade the AshPostgres library to a fixed version, 2.15.2 or later, which corrects the missing multitenancy enforcement for skipped upserts.
  • Review and remove usage of the return_skipped_upsert? option unless absolutely required, and verify that attribute-based multitenancy is enforced before any data is returned.
  • If an immediate upgrade is not possible, restrict the ability to perform upserts with skip logic to trusted users or roles and monitor for anomalous skipped upsert activity.

Generated by OpenCVE AI on October 25, 2026 at 21:30 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories available
History
Type Values Removed Values Added
Metrics ssvc

{'options': {'Automatable': 'no', 'Exploitation': 'none', 'Technical Impact': 'partial'}, 'version': '2.0.3'}

Type Values Removed Values Added
Description Incorrect Authorization vulnerability in ash-project ash_postgres allows a user to read another tenant's record through a skipped upsert. When Ash.bulk_create/4 or a single create runs as an upsert with return_skipped_upsert?: true and the upsert is skipped (for example because its upsert_condition does not hold), AshPostgres.DataLayer reads the existing row back by the upsert identity in do_bulk_create/3 and upsert/4. That lookup did not apply the resource's attribute multitenancy, so on a resource using strategy :attribute it could match and return the row of another tenant with the same identity values, exposing its fields to the caller. This issue affects ash_postgres: from 2.6.22 before 2.15.2.
Title AshPostgres returns another tenant's record for a skipped upsert when return_skipped_upsert? is set
First Time appeared Ash-project
Ash-project ash Postgres
Weaknesses CWE-863
CPEs cpe:2.3:a:ash-project:ash_postgres:*:*:*:*:*:*:*:*
Vendors & Products Ash-project
Ash-project ash Postgres
References
Metrics cvssV4_0

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

Weaknesses

Sources

Status
PUBLISHED
Assigner
EEF
Published
Updated
Oct 26, 2026, 2:35 PM
Reserved
Oct 23, 2026, 1:00 PM
Status
Deferred
Published
Oct 25, 2026, 8:16 PM
Modified
Oct 26, 2026, 3:16 PM