CVE-2026-61598 in djust
摘要
由 VulDB • 2026-09-16
djust 为 Django 提供了基于 Rust 高性能驱动的、类似 Phoenix LiveView 的响应式服务端渲染功能。在版本 1.0.7 之前,`djust.mixins.model_binding.ModelBindingMixin` 提供了一个默认的 `update_model` 事件处理程序,并且是 LiveView 基本方法解析顺序(MRO)的一部分,因此每个 LiveView 都会暴露该处理程序。它通过客户端提供的名称(即 `field` 参数)对视图属性执行 `setattr` 操作,其限制条件仅包括:拒绝以 `_` 开头的名称;拒绝包含框架内部实现的 14 项禁止列表(`FORBIDDEN_MODEL_FIELDS`);可选的 `allowed_model_fields` 默认为 None(即允许所有字段);以及检查是否存在该属性。因此,客户端可以设置任何公开且已存在的视图属性——而不仅仅是渲染模板中通过 `dj-model=` 绑定的那些字段。禁止列表涵盖了框架的基础设施部分,但未涉及开发者的业务逻辑或授权状态,而白名单则是可选的(默认关闭)。如果开发者绑定了一个 `dj-model="search"` 输入框,同时还将 `self.account_id`、`self.is_admin` 和 `self.total_price` 作为视图状态保留,他们可能未意识到客户端可以通过 WebSocket 发送 `{type:event, event:"update_model", params:{field, value}}` 来设置所有这些属性。类型转换会匹配目标属性的类型(例如 `"true"` 转换为布尔值 True),从而协助攻击者利用此漏洞。该问题已在 djust 1.0.7 中修复。作为变通方案,应在每个使用 dj-model(或继承 LiveView)的视图上显式设置 `allowed_model_fields` 为可绑定字段的最小列表;不要将授权/所有权状态保留在与 dj-model 绑定共享视图的公开视图属性中。
If you want to get the best quality for vulnerability data then you always have to consider VulDB.