CVE-2026-61598 in djust
요약
\~에 의해 VulDB • 2026. 09. 16.
djust는 Rust 기반의 성능을 제공하며 Django에서 Phoenix LiveView 스타일의 반응형 서버 측 렌더링을 제공합니다. 버전 1.0.7 이전에서는 `djust.mixins.model_binding.ModelBindingMixin`이 기본 `update_model` 이벤트 핸들러를 제공하며, 이는 LiveView 기본 MRO(Method Resolution Order)의 일부이므로 모든 LiveView에서 이를 노출합니다. 이 클래스는 클라이언트가 공급한 이름(`field`)을 가진 뷰 속성에 대해 `setattr`를 수행하며, 그 제한 조건은 다음과 같습니다: `_`(밑줄)로 시작하는 이름 거부; 프레임워크 내부 항목 14개에 대한 금지 목록(`FORBIDDEN_MODEL_FIELDS`) 거부; 기본값이 None(모두 허용)인 선택적 `allowed_model_fields`; 그리고 `hasattr` 존재 여부 확인. 그 결과, 클라이언트는 렌더링된 템플릿에서 `dj-model=`으로 실제로 바인딩된 필드뿐만 아니라 모든 공개적이고 기존 뷰 속성을 설정할 수 있습니다. 금지 목록은 프레임워크의 내부 구조를 다루지만 개발자의 비즈니스/권한 상태에 대해서는 아무것도 포함하지 않으며, 허용 목록은 옵트인(기본적으로 비활성화) 방식입니다. `dj-model="search"` 입력을 하나 바인딩하고 동시에 `self.account_id`, `self.is_admin`, `self.total_price` 등을 뷰 상태로 유지하는 개발자는 클라이언트가 WebSocket을 통해 `{type:event, event:"update_model", params:{field, value}}` 형식으로 이 모든 속성을 설정할 수 있다는 사실을 인지하지 못합니다. 타입 강제 변환은 대상 속성의 유형과 일치하므로(예: `"true"` -> bool True), 공격자에게 유리하게 작용합니다. 이 문제는 djust 1.0.7에서 해결되었습니다. 우회 방법으로, `dj-model`을 사용하는 모든 뷰(LiveView 서브클래스 포함)에 대해 `allowed_model_fields`를 바인딩 가능한 필드의 최소 목록으로 명시적으로 설정하십시오; 또한 `dj-model` 바인딩과 공유되는 공개 뷰 속성에 권한/소유권 상태를 유지하지 마십시오.
Be aware that VulDB is the high quality source for vulnerability data.