{"id":"CVE-2026-115627","kind":"vulnerability","aliases":["CVE-2026-115627"],"related":[],"title":"Ash Postgres: multitenant lateral joins leak records across tenants","description":"Incorrect Authorization vulnerability in ash-project ash_postgres allows a user to load destination records linked to a source record only through another tenant's join rows.\n\nWhen a many_to_many relationship, or a through relationship, is loaded with a lateral join (for example with a per-record limit or sort), AshPostgres.DataLayer builds the query for the join resource, and for each resource along a through path, in lateral_join_query/3 and through_step_queries/4 without running that resource's read action, which is where attribute multitenancy is applied. When those resources use strategy :attribute multitenancy, rows belonging to other tenants were joined, so the load returned destination records that the caller's tenant is not related to.\n\nThis issue affects ash_postgres: from 0.38.0 before 2.15.2.","summary":"When a many-to-many or through relationship is loaded with a lateral join, ash_postgres skips the attribute multitenancy filter on the join resources. A caller can therefore load destination records linked only through another tenant's join rows.","severity":"medium","cvss":6.0,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["ash","elixir","multitenancy","package","postgres"],"not_affected_if":["no-attribute-multitenancy","single-tenant"],"how_to_check":"- Check the `ash_postgres` version in `mix.lock` or `mix deps` and see whether it is from `0.38.0` up to but not including `2.15.2`.\n- Look for `attribute` multitenancy on resources used in many_to_many or through relationships that are loaded with a limit or sort.","fix":"- Upgrade `ash_postgres` to `2.15.2` or later.","status":"open","published_at":"2026-10-25T20:16:32+00:00","first_seen_at":"2026-10-25T20:35:47+00:00","triaged_at":"2026-10-25T20:37:44+00:00","updated_at":"2026-10-25T20:37:44+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-10-25T20:37:44Z","model":"claude-haiku-5-5","output":{"fix":"- Upgrade `ash_postgres` to `2.15.2` or later.","reach":"internet","title":"Ash Postgres: multitenant lateral joins leak records across tenants","impact":"medium","summary":"When a many-to-many or through relationship is loaded with a lateral join, ash_postgres skips the attribute multitenancy filter on the join resources. A caller can therefore load destination records linked only through another tenant's join rows.","category":"package","nicknames":[],"who_cares":["elixir","ash","postgres","multitenancy"],"confidence":0.7,"needs_auth":"yes","worst_case":"Authenticated user reads records of other tenants via relationship loads.","analyst_note":"","how_to_check":"- Check the `ash_postgres` version in `mix.lock` or `mix deps` and see whether it is from `0.38.0` up to but not including `2.15.2`.\n- Look for `attribute` multitenancy on resources used in many_to_many or through relationships that are loaded with a limit or sort.","needs_analyst":false,"not_affected_if":["single-tenant","no-attribute-multitenancy"],"who_is_affected":"Applications using the ash_postgres data layer with attribute-strategy multitenancy on resources that have many_to_many or through relationships loaded with lateral joins (per-record limits or sorts). Single-tenant apps and apps without attribute multitenancy are not exposed by this flaw, since there is no tenant boundary to cross.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"medium"},"cost_usd":0.000617,"input_tokens":3470,"output_tokens":541,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-115627':12A,15A '-2026':11A,14A '0.38.0':189C '2.15.2':191C 'across':8A 'action':146C 'affect':185C 'allow':71C 'along':128C 'anoth':57B,85C 'appli':153C 'ash':1A,16B,36B,67C,69C,186C 'ash-project':66C 'ashpostgres.datalayer':116C 'attribut':40B,150C,159C 'author':63C 'belong':162C 'build':117C 'caller':48B,176C 'cve':10A,13A 'destin':52B,76C,172C 'elixir':17B 'exampl':107C 'filter':42B 'incorrect':62C 'issu':184C 'join':5A,35B,45B,60B,88C,105C,122C,134C,167C 'later':4A,34B,104C,133C 'leak':6A 'limit':113C 'link':54B,78C 'load':31B,51B,75C,101C,170C 'mani':24B,26B,92C,94C 'many-to-mani':23B 'multiten':3A,18B,41B,151C,160C 'packag':19B 'path':131C 'per':111C 'per-record':110C 'postgr':2A,20B,37B,70C,187C 'project':68C 'queri':119C 'queries/4':139C 'query/3':135C 'read':145C 'record':7A,53B,77C,82C,112C,173C 'relat':181C 'relationship':29B,95C,99C 'resourc':46B,123C,127C,143C,156C 'return':171C 'row':61B,89C,161C 'run':141C 'skip':38B 'sort':115C 'sourc':81C 'step':138C 'strategi':158C 'tenant':9A,58B,86C,165C,178C 'therefor':50B 'use':157C 'user':73C 'vulner':64C 'without':140C","nicknames":[],"mitigations":[],"who_affected":"Applications using the ash_postgres data layer with attribute-strategy multitenancy on resources that have many_to_many or through relationships loaded with lateral joins (per-record limits or sorts). Single-tenant apps and apps without attribute multitenancy are not exposed by this flaw, since there is no tenant boundary to cross.","tier":"C","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-25T20:16:32+00:00","kev":null,"cvss_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/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","cvss_by":"6b3ad84c-e1a6-4bf7-a703-f496b71e49db","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-115627","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-115627","severity":null,"published_at":"2026-10-25T20:16:32+00:00","modified_at":"2026-10-25T20:16:32+00:00","first_seen_at":"2026-10-25T20:35:47+00:00","fetched_at":"2026-10-25T20:35:47+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}