ZeroHour

CVE-2026-61598

Client mass-assignment of view attributes via update_model in djust LiveView

CVSS 4.0
7.1 high
EPSS
Published
()
Modified
AI analysis

The djust Python LiveView framework ships a default update_model WebSocket event handler (from ModelBindingMixin, part of the LiveView base MRO) that sets a client-supplied attribute name to a client-supplied value, gated only by a rejection of underscore-prefixed names, a 14-entry denylist of framework internals, a hasattr check, and an optional allowed_model_fields allowlist that defaults to None (allow all). Any connected client can send an update_model event over the WebSocket to set any public, existing view attribute — including attributes never bound with dj-model= in the template — with automatic type coercion matching the target attribute, and every LiveView exposes this handler by default. An attacker reaching a LiveView (anonymously on public views, or as a logged-in user on authenticated views) can tamper with view state such as is_admin, account_id, or business values, enabling authorization-flag manipulation, IDOR, and state tampering wherever downstream handlers act on those attributes without re-checking authorization. All djust applications using LiveViews are affected, with high impact for apps that hold authorization, ownership, or business state in public view attributes (the normal djust pattern) and low impact otherwise. No public proof-of-concept or in-the-wild exploitation is known; the flaw was reproduced by the maintainer and a fix approach is documented, but no fixed version number is stated in the disclosure.

What to do: Until a patched release is published (no fixed version number is given in the disclosure), set allowed_model_fields explicitly to the minimal list of bindable fields on every view using dj-model= or subclassing LiveView, and stop storing authorization, ownership, or business state (e.g., is_admin, account_id, total_price) in public view attributes that share the view with dj-model bindings. Audit LiveViews for such state and for downstream handlers that trust view attributes without re-authorization; upgrade to the patched djust release once available and verify that a non-dj-model public attribute such as is_admin is rejected while bound fields still update.

Affected
djust (PyPI: djust) djust Python LiveView framework (djust.mixins.model_binding.ModelBindingMixin / LiveView base MRO)
Estimated exposure
No basis for an estimate.

Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.

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.

Ecosystems
pip
Weakness
CWE-915
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/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
GHSA
GHSA-cc7c-9jff-58wj (high)

In the news

No ingested article mentions this CVE yet.