CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-55736

CVE-2026-55736: Mass Assignment / Parameter Pollution in Ash Framework Changeset Path

Alon Barad
Alon Barad
Software Engineer

Sep 25, 2026·5 min read·4 visits

Executive Summary (TL;DR)

The Elixir Ash framework failed to check the 'public?' flag on action arguments when processing parameters with string keys or executing atomic updates, allowing unauthorized users to modify private parameters.

A parameter injection vulnerability exists in the Ash framework for Elixir, where untrusted string-keyed maps can bypass the 'public?: false' restriction on action arguments. An attacker can leverage this bypass to inject and overwrite private arguments, resulting in unauthorized data modification or privilege escalation depending on the target application's design.

Vulnerability Overview

The Ash framework is an Elixir resource-oriented application development library. Within Ash, developers can define action arguments and specify access constraints using the 'public?: false' attribute. This design ensures that certain parameters remain private, intended only for internal, trusted server-side operations (such as assigning authorization attributes or system metadata).

When constructing changeset objects from user inputs, the Ash framework is designed to sanitize external maps and discard parameters matching these private argument declarations. This establishes a security boundary separating untrusted HTTP parameter inputs from high-integrity internal variables.

However, a critical validation gap in the parameter-casting engine breaks this safety guarantee. By exploiting inconsistencies in the framework's internal argument lookup helpers, remote attackers can bypass these filtering boundaries. This results in an improperly controlled modification of dynamically-determined object attributes (CWE-915), also known as mass assignment or parameter pollution.

Root Cause Analysis

The core flaw stems from how Ash's internal parameter-processing engine resolves action arguments from incoming maps. The framework handles input maps containing either atom-keyed data (typically generated internally) or string-keyed data (typically parsed from JSON or URL-encoded web forms).

During regular changeset evaluation (such as executing 'for_create/3', 'for_update/3', or 'for_destroy/3' actions), parameter lookup is routed through the 'get_action_argument/2' helper function in 'lib/ash/changeset/changeset.ex'. While the atom-keyed lookup clause validated the 'public?' state of the target argument, the clause processing string-keyed inputs simply checked for string equivalence. It did not verify whether the matched argument was public.

In addition, the atomic and bulk update execution paths (such as 'fully_atomic_changeset/4') relied on the 'has_argument?/2' helper function. Prior to remediation, both the atom-keyed and string-keyed clauses in this function entirely omitted the 'public?' verification check. Consequently, any parameter matching a private argument would be accepted and applied during atomic execution, regardless of the key format.

Code-Level Vulnerability & Patch Analysis

The vulnerability was resolved by introducing strict public-visibility filters within all lookup paths inside 'lib/ash/changeset/changeset.ex'. The official patch ensures that 'public?' checks are consistently applied before returning any matched argument.

Below is the relevant portion of the codebase demonstrating the vulnerable structure and the corresponding structural changes implemented in the fix:

@@ -3520,15 +3520,15 @@ defmodule Ash.Changeset do
   end
 
   defp get_action_argument(action, name) when is_binary(name) do
-    Enum.find(action.arguments, &(to_string(&1.name) == name))
+    Enum.find(action.arguments, &(&1.public? && to_string(&1.name) == name))
   end
 
   defp has_argument?(action, name) when is_atom(name) do
-    Enum.any?(action.arguments, &(&1.name == name))
+    Enum.any?(action.arguments, &(&1.public? && &1.name == name))
   end
 
   defp has_argument?(action, name) when is_binary(name) do
-    Enum.any?(action.arguments, &(to_string(&1.name) == name))
+    Enum.any?(action.arguments, &(&1.public? && to_string(&1.name) == name))
   end
 
   defp validate_attributes_accepted(changeset, %{accept: nil}), do: changeset

By adding the '&1.public?' validation to 'get_action_argument/2' and 'has_argument?/2', the lookup function returns nil when processing untrusted inputs that target private properties. The framework then safely discards or rejects the parameter as non-existent.

Exploitation Mechanics & Attack Vectors

To exploit this vulnerability, an attacker must identify an Ash action that exposes public parameters alongside at least one private argument ('public?: false' or legacy 'private?: true') which controls security-critical behavior. Typical targets include fields that define tenant constraints, target ownership, or execution state.

Consider an application that uses a private argument to dictate the security context of a profile update. The developer sets up an update action where a private argument ':acting_user_id' is expected to be programmatically set by a router or controller plug. If policies rely on this private argument to authorize the modification, the logic becomes compromised.

An attacker sends an HTTP request with string-keyed fields containing the parameter they wish to overwrite. Because the web server parses incoming JSON payloads as string-keyed maps (e.g., %{"acting_user_id" => "victim_id"}), the vulnerable Ash engine maps the input to the private argument. The engine bypasses the public visibility check, binds the attacker's value, and runs the action with elevated or spoofed parameters.

Impact and Severity Assessment

This vulnerability has been assigned a CVSS v4.0 Base Score of 5.9 (Medium). The vector string indicates that while the local complexity and execution context limit direct remote code execution out-of-the-box, the impact on integrity is high (VI:H) when the vulnerability is successfully exploited.

In applications that use private arguments to enforce data isolation, tenant constraints, or authorization context, exploitation allows users to perform actions on behalf of other entities. This can lead to unauthorized data disclosure, unauthorized modification of sensitive configuration records, or a complete bypass of application-level access controls.

The overall impact depends heavily on the specific domain logic. If private arguments are not used to make security-critical decisions or enforce access control boundaries, the real-world impact may be limited to localized data corruption.

Remediation & Defensive Mitigations

The primary remediation for this vulnerability is upgrading the 'ash' dependency to version 3.29.3 or later. This release permanently patches the parameter resolution functions and enforces proper visibility checks across both atomic and standard execution flows.

If upgrading is not immediately possible, applications can implement input-filtering middleware. Developers should sanitize incoming maps inside their Phoenix controllers or custom Plugs before passing the parameters to the Ash changeset functions. This is achieved by explicitly deleting keys that match private arguments from the parameters map.

# Temporary Plug or Controller Sanitization
def sanitize_params(conn, _opts) do
  params = conn.params
  cleaned_params = Map.drop(params, ["acting_user_id", "private_config_flag"])
  %{conn | params: cleaned_params}
end

Security teams should conduct code searches across their repositories to identify instances of 'public?: false' on action definitions to ensure proper awareness of potential exposure vectors.

Official Patches

ash-projectOfficial patch for parameter injection vulnerability in 'lib/ash/changeset/changeset.ex'

Fix Analysis (2)

Technical Appendix

CVSS Score
5.9/ 10
CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N
EPSS Probability
0.37%
Top 72% most exploited

Affected Systems

Applications utilizing the Ash Framework (Elixir) with active resources defining private action arguments (public?: false).

Affected Versions Detail

Product
Affected Versions
Fixed Version
ash
ash-project
>= 3.0.0, < 3.29.33.29.3
AttributeDetail
CWE IDCWE-915
Attack VectorLocal
CVSS v4.05.9 (Medium)
EPSS Score0.00367
ImpactHigh Integrity Violation
Exploit Statuspoc
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1565.001Data Manipulation: Stored Data Manipulation
Impact
T1548Abuse Elevation Control Mechanism
Privilege Escalation
CWE-915
Improperly Controlled Modification of Dynamically-Determined Object Attributes

The product receives input and dynamically determines which attributes of an object should be modified, but it does not properly control which attributes can be modified, allowing unauthorized attackers to modify sensitive attributes.

Known Exploits & Detection

GitHub Security Advisory Integration TestingThe advisory contains reproduction unit tests showing the failure of string-keyed parameters to block private argument allocation.

Vulnerability Timeline

Vulnerability Disclosed and CVE Record created
2026-06-23
Patch released in version 3.29.3
2026-06-23
CNA Record details updated
2026-07-10

References & Sources

  • [1]GHSA-f4hc-ppw9-4hhw: Ash Framework Security Advisory
  • [2]NVD - CVE-2026-55736
  • [3]Erlang Ecosystem Foundation CNA Record
  • [4]OSV Entry: EEF-CVE-2026-55736

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 2 hours ago•CVE-2026-57175
6.4

CVE-2026-57175: Improper Authentication in social-auth-core SAML Backend

An improper authentication vulnerability (CWE-287) exists in the SAML backend of the social-auth-core package before version 5.0.0. The Assertion Consumer Service (ACS) endpoint does not verify whether incoming SAML assertions match a previously initiated AuthnRequest in the user's session. This permits an attacker with credentials on a shared Identity Provider to perform a 'Session Donor' attack, permanently linking their SAML identity to an authenticated victim's account and achieving full, persistent account takeover.

Amit Schendel
Amit Schendel
5 views•6 min read
•about 3 hours ago•CVE-2026-57176
6.8

CVE-2026-57176: Multi-Tenant Account Takeover via Identity Binding Collision in python-social-auth Vend Backend

An identity binding collision vulnerability in the Vend OAuth2 backend of python-social-auth (social-core) before version 5.0.0 allows unauthenticated remote attackers to take over local accounts in multi-tenant configurations. The flaw stems from relying on shop-local numeric user IDs as global social-auth identifiers, leading to collisions when identical IDs exist across distinct tenants.

Alon Barad
Alon Barad
5 views•6 min read
•about 4 hours ago•CVE-2026-57177
4.3

CVE-2026-57177: Login Cross-Site Request Forgery in python-social-auth (social-auth-core)

A Login Cross-Site Request Forgery (Login CSRF) vulnerability was discovered in the social-auth-core library prior to version 5.0.0 when utilizing the LoginRadius authentication backend. The backend explicitly disabled state token validation during the authentication callback, allowing attackers to link their identities to victim sessions.

Amit Schendel
Amit Schendel
4 views•7 min read
•about 5 hours ago•CVE-2026-57178
7.4

CVE-2026-57178: Authentication Bypass via Missing Signature Verification in social-auth-core

An authentication bypass vulnerability exists in the VKontakte App backend of social-auth-core prior to version 5.0.0. The vulnerability allows remote attackers to bypass cryptographic signature verification and gain unauthorized access to arbitrary accounts by omitting the signature parameter.

Amit Schendel
Amit Schendel
5 views•7 min read
•about 6 hours ago•CVE-2026-57179
4.2

CVE-2026-57179: Session Fixation and Login CSRF in social-auth-core Partial Pipeline

CVE-2026-57179 is a critical Session Fixation and Login Cross-Site Request Forgery (CSRF) vulnerability in python-social-auth's core library (social-auth-core) prior to version 5.0.0. The vulnerability allows remote attackers to force arbitrary state transitions and bind third-party social credentials to a victim's session, leading to complete account takeover.

Alon Barad
Alon Barad
7 views•7 min read
•about 7 hours ago•CVE-2026-57232
3.1

CVE-2026-57232: Server-Side Request Forgery in Contao CMS Feed Reader Module

A Server-Side Request Forgery (SSRF) vulnerability exists in the Contao Open Source Content Management System (CMS) within the Feed Reader front-end module. When processing RSS feed configurations, the module initiates outbound HTTP connections using a default HTTP client that lacks loopback and private network controls. Authenticated backend users with permissions to configure frontend modules can exploit this flaw to coerce the server into sending requests to internal endpoints, loopback addresses, and cloud instance metadata services.

Amit Schendel
Amit Schendel
7 views•7 min read