---
id: "CVE-2026-115635"
kind: "vulnerability"
aliases: ["CVE-2026-115635"]
title: "Elixir ash_postgres: skipped upserts can expose another tenant's row"
severity: "medium"
cvss: 6.0
epss: null
exploited: false
status: "open"
category: "package"
products: []
ecosystems: []
tags: ["ash", "ash_postgres", "elixir", "multitenancy", "package", "postgres"]
not_affected_if: ["default-config", "no-attribute-multitenancy"]
published_at: "2026-10-25T20:16:32+00:00"
first_seen_at: "2026-10-25T20:35:47+00:00"
updated_at: "2026-10-25T20:37:44+00:00"
sources: [{"source": "nvd", "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-115635", "first_seen_at": "2026-10-25T20:35:47+00:00"}]
---

# Elixir ash_postgres: skipped upserts can expose another tenant's row

When an upsert is skipped with return_skipped_upsert enabled, ash_postgres reads back the existing row without applying attribute multitenancy. A caller can receive another tenant's record with the same identity values and see its fields.

_Summary, check and fix written by a model from the sources; labelled as such._

## How to check

- Check the ash_postgres version in `mix.lock` or `mix deps` output; affected range is `2.6.22` up to but not including `2.15.2`.
- Look for resources using multitenancy `strategy :attribute` that call `Ash.bulk_create/4` or create with `upsert?: true` and `return_skipped_upsert?: true`.

## Fix

- Upgrade `ash_postgres` to `2.15.2` or later.

## Timeline

- 2026-10-25T20:35:47+00:00 nvd https://nvd.nist.gov/vuln/detail/CVE-2026-115635

## From the sources

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.

---

_Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai_
