CVE-2026-61598
—Client mass-assignment of view attributes via update_model in djust LiveView
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.
| djust (PyPI: djust) djust Python LiveView framework (djust.mixins.model_binding.ModelBindingMixin / LiveView base MRO) | — |
Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.
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 news0 stories
No ingested article mentions this CVE yet.