Description
djust provides Phoenix LiveView-style reactive server-side rendering for Django with Rust-powered performance. Prior to version 1.0.7, `djust.mixins.model_binding.ModelBindingMixin` provides a default `update_model` event handler and is part of the LiveView base MRO, so every LiveView exposes it. It `setattr`s a view attribute whose name is client-supplied (`field`), gated only by: reject `_`-prefixed names; reject a 14-entry denylist of framework internals (`FORBIDDEN_MODEL_FIELDS`); optional `allowed_model_fields` which defaults to None = allow all; and `hasattr` existence. As a result, a client can set any public, existing view attribute — not just the fields actually bound with `dj-model=` in the rendered template. The denylist covers framework plumbing but nothing about developer business/authz state, and the allowlist is opt-in (off by default). A developer who binds one `dj-model="search"` input and also keeps `self.account_id` / `self.is_admin` / `self.total_price` as view state does not realize a client can set ALL of them via `{type:event, event:"update_model", params:{field, value}}` over the WebSocket. Type coercion matches the target attribute's type (so `"true"` -> bool True), aiding the attacker. This issue is fixed in djust 1.0.7. As a workaround, set `allowed_model_fields` explicitly on every view using dj-model (or subclassing LiveView) to the minimal list of bindable fields; do not keep authorization/ownership state in public view attributes that share the view with dj-model bindings.
Published: 2026-09-16
Score: 7.1 High
EPSS: < 1% Very Low
KEV: No
Impact: Privilege escalation via arbitrary attribute assignment
Action: Patch Immediately
AI Analysis

Impact

The djust framework includes a default event handler that assigns any client‑supplied attribute name to a view instance. Because the only checks are a leading underscore restriction, a 14‑entry denylist of framework internals, an optional allowlist that defaults to allowing everything, and a simple existence test, the handler accepts arbitrary public attributes. An attacker who can send update_model events over the WebSocket can therefore set values such as self.is_admin, self.account_id, or other state used for authorization, resulting in a potential privilege escalation or data tampering. The handler also coerces the supplied string into the target attribute type, making it easier to inject boolean or numeric values.

Affected Systems

The flaw exists in the djust framework published by djust-org, affecting all versions prior to 1.0.7. A user who integrates djust into a Django project and employs the built‑in ModelBindingMixin in any LiveView will be vulnerable. The vulnerability is present in every LiveView that inherits from the base MRO because the default update_model handler is attached globally. Only djust 1.0.7 and newer contain the fix that restricts the set of assignable fields.

Risk and Exploitability

The CVSS score of 7.1 indicates a high impact vulnerability, while the EPSS score of less than 1% shows that the likelihood of exploitation is very low at the moment. The issue is not listed in CISA's KEV catalog. Attackers can exploit the flaw by sending crafted update_model WebSocket messages that specify a field name corresponding to a sensitive attribute. No authentication is required beyond the WebSocket session, which is commonly authenticated; once the message is processed the view attribute changes, potentially bypassing authentication checks or altering application state.

Generated by OpenCVE AI on September 18, 2026 at 03:16 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Set allowed_model_fields explicitly on each LiveView to the minimal list of bindable fields.
  • Avoid storing authorization or ownership state in public view attributes that are exposed through dj-model bindings.
  • Consider subclassing LiveView to override the default update_model handler and enforce stricter validation of incoming field names.

Generated by OpenCVE AI on September 18, 2026 at 03:16 UTC.

Tracking

Sign in to view the affected projects.

Advisories
Source ID Title
Github GHSA Github GHSA GHSA-cc7c-9jff-58wj djust: Client mass-assignment of arbitrary view attributes via the default dj-model update_model handler
History

Thu, 17 Sep 2026 02:00:00 +0000

Type Values Removed Values Added
First Time appeared Djust-org
Djust-org djust
Vendors & Products Djust-org
Djust-org djust

Wed, 16 Sep 2026 16:30:00 +0000

Type Values Removed Values Added
Metrics ssvc

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


Wed, 16 Sep 2026 14:15:00 +0000

Type Values Removed Values Added
Description djust provides Phoenix LiveView-style reactive server-side rendering for Django with Rust-powered performance. Prior to version 1.0.7, `djust.mixins.model_binding.ModelBindingMixin` provides a default `update_model` event handler and is part of the LiveView base MRO, so every LiveView exposes it. It `setattr`s a view attribute whose name is client-supplied (`field`), gated only by: reject `_`-prefixed names; reject a 14-entry denylist of framework internals (`FORBIDDEN_MODEL_FIELDS`); optional `allowed_model_fields` which defaults to None = allow all; and `hasattr` existence. As a result, a client can set any public, existing view attribute — not just the fields actually bound with `dj-model=` in the rendered template. The denylist covers framework plumbing but nothing about developer business/authz state, and the allowlist is opt-in (off by default). A developer who binds one `dj-model="search"` input and also keeps `self.account_id` / `self.is_admin` / `self.total_price` as view state does not realize a client can set ALL of them via `{type:event, event:"update_model", params:{field, value}}` over the WebSocket. Type coercion matches the target attribute's type (so `"true"` -> bool True), aiding the attacker. This issue is fixed in djust 1.0.7. As a workaround, set `allowed_model_fields` explicitly on every view using dj-model (or subclassing LiveView) to the minimal list of bindable fields; do not keep authorization/ownership state in public view attributes that share the view with dj-model bindings.
Title Client mass-assignment of arbitrary view attributes via the default dj-model update_model handler
Weaknesses CWE-915
References
Metrics cvssV4_0

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


cve-icon MITRE

Status: PUBLISHED

Assigner: GitHub_M

Published:

Updated: 2026-09-16T15:27:34.282Z

Reserved: 2026-07-10T17:12:17.238Z

Link: CVE-2026-61598

cve-icon Vulnrichment

Updated: 2026-09-16T15:27:30.830Z

cve-icon NVD

Status : Deferred

Published: 2026-09-16T14:17:06.827

Modified: 2026-09-30T17:51:56.193

Link: CVE-2026-61598

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-09-18T03:30:02Z

Weaknesses
  • CWE-915

    Improperly Controlled Modification of Dynamically-Determined Object Attributes