Description
Incorrect Authorization vulnerability in ash-project ash_sql allows a caller to bypass a scoping or authorization filter expressed as exists/2 over a relationship that declares both a limit (or from_many?) and a parent(...)-referencing filter or sort.

AshSql.Join.related_query/3 skips the caller-supplied exists predicate for such relationships and delegates it to limit_from_many/5. When the relationship's own filter or sort references parent(...), limit_from_many/5 takes a branch that drops both the limit and the predicate, emitting a bare correlated EXISTS with no predicate. The check then matches any record that has any related row. Most severely, when the expression backs a policy (for example authorize_if expr(exists(memberships, user_id == ^actor(:id)))), the actor-scoping condition disappears and the policy passes for any actor with any related row.

This issue affects ash_sql: from 0.4.1 before 0.7.1.
Published: 2026-08-30
Score: 5.9 Medium
EPSS: < 1% Very Low
KEV: No
Impact: Authorization Bypass
Action: Apply Patch
AI Analysis

Impact

The vulnerability arises from a flaw in the AshSql query builder where the exists/2 predicate is silently omitted for relationships that combine a limit (or from_many?) with a parent(...) filter or sort. When such a relationship backs a policy, the authorization condition is removed, causing the policy to evaluate as true for any actor that has any related row. This results in a direct authorization bypass that can give unauthorized users access to protected resources.

Affected Systems

Affected versions are ash_sql from 0.4.1 up to, but not including, 0.7.1. All installations of the library in this range are potentially vulnerable if they rely on exists/2 predicates over limited relationships with parent filters within their authorization logic.

Risk and Exploitability

The CVSS score of 5.9 indicates moderate severity. EPSS data is not available and the vulnerability is not listed in the CISA KEV catalog. Exploitation requires construction of a query that relies on the omitted exists predicate, typically through policy definitions or application code that uses the affected pattern. Based on the description, it is inferred that the flaw operates at the query generation level, so an attacker must be able to influence query construction or have access to the policy system. The likely attack vector is therefore through development or privileged user access, though the impact is significant once the bypass is achieved.

Generated by OpenCVE AI on August 30, 2026 at 13:51 UTC.

Remediation

No vendor fix or workaround currently provided.

OpenCVE Recommended Actions

  • Upgrade ash_sql to version 0.7.1 or newer, which implements the correct handling of the exists predicate.
  • If an upgrade cannot be performed immediately, review all policy expressions that use exists/2 with limited relationships and parent filters, and modify them to enforce the intended actor constraints manually or redesign the query to avoid the problematic pattern.
  • After applying the patch or code changes, run targeted functional tests to confirm that policies enforce the correct actor constraints and audit access logs for signs of unauthorized access until the fix is fully deployed.

Generated by OpenCVE AI on August 30, 2026 at 13:51 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Mon, 31 Aug 2026 15:30:00 +0000

Type Values Removed Values Added
Metrics ssvc

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


Sun, 30 Aug 2026 12:15:00 +0000

Type Values Removed Values Added
Description Incorrect Authorization vulnerability in ash-project ash_sql allows a caller to bypass a scoping or authorization filter expressed as exists/2 over a relationship that declares both a limit (or from_many?) and a parent(...)-referencing filter or sort. AshSql.Join.related_query/3 skips the caller-supplied exists predicate for such relationships and delegates it to limit_from_many/5. When the relationship's own filter or sort references parent(...), limit_from_many/5 takes a branch that drops both the limit and the predicate, emitting a bare correlated EXISTS with no predicate. The check then matches any record that has any related row. Most severely, when the expression backs a policy (for example authorize_if expr(exists(memberships, user_id == ^actor(:id)))), the actor-scoping condition disappears and the policy passes for any actor with any related row. This issue affects ash_sql: from 0.4.1 before 0.7.1.
Title exists/2 predicate silently dropped on limited relationships with a parent() filter in AshSql
First Time appeared Ash-project
Ash-project ash Sql
Weaknesses CWE-863
CPEs cpe:2.3:a:ash-project:ash_sql:*:*:*:*:*:*:*:*
Vendors & Products Ash-project
Ash-project ash Sql
References
Metrics cvssV4_0

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


Subscriptions

Ash-project Ash Sql
cve-icon MITRE

Status: PUBLISHED

Assigner: EEF

Published:

Updated: 2026-08-31T15:00:02.165Z

Reserved: 2026-08-30T04:45:01.559Z

Link: CVE-2026-77454

cve-icon Vulnrichment

Updated: 2026-08-31T14:59:56.964Z

cve-icon NVD

Status : Deferred

Published: 2026-08-30T12:17:17.273

Modified: 2026-09-01T21:15:00.147

Link: CVE-2026-77454

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-08-31T21:22:46Z

Weaknesses