Sep 17, 2026·5 min read·2 visits
The djust framework omitted authorization checks on non-WebSocket rendering paths, allowing authenticated users to bypass object-level permissions and access sensitive records.
A broken object-level access control (IDOR) vulnerability exists in the djust Django framework prior to version 1.0.7. The framework's per-object authorization hooks were enforced correctly over WebSockets but entirely bypassed on synchronous HTTP GET rendering, SPA client-side navigation, and embedded sub-views, allowing authenticated attackers to view arbitrary unauthorized database records.
The djust Django framework provides reactive server-side rendering using a Rust-powered backend. It aims to deliver Phoenix LiveView-style reactivity inside Python environments. Prior to version 1.0.7, the framework contained an Insecure Direct Object Reference (IDOR) vulnerability identified as CVE-2026-61596.
This vulnerability allowed authenticated users to bypass object-level access controls. While permission checks were correctly executed over active WebSocket channels, they were completely omitted on several alternative rendering pathways. This architectural oversight exposed sensitive data to unauthorized requests.
The djust framework implements object-level authorization using the get_object and has_object_permission methods on views. This approach relies on fetching a database record and verifying that the requesting user possesses authorization to interact with that specific record.
In affected versions, these checks were restricted to the active WebSocket consumer lifecycle, specifically within the mount and event dispatch handlers. This design assumed all interaction would occur over persistent WebSocket connections. However, the framework exposes other pathways that render views without initializing a WebSocket session.
Three key paths bypassed these checks: synchronous HTTP GET rendering via RequestMixin.get and aget, client-side Single Page Application (SPA) navigation using ViewRuntime.dispatch_url_change, and embedded sub-views rendered with {% live_render %} template tags. Because these entry points lacked authorization validation, they fetched and displayed target objects without verifying the user's permissions.
The structural breakdown of this bypass can be represented as follows:
To resolve this vulnerability, version 1.0.7 introduced a consolidated authorization pipeline. The core authorization logic is centralized in the djust.auth.core.enforce_object_permission function, creating a single chokepoint for all rendering paths.
The updated implementation performs checks dynamically and fails closed by default. Below is a comparison demonstrating how the framework enforces access control during rendering:
# Affected Version (Simplified Behavior)
def render_http(request, view):
# Vulnerable: Directly retrieves the object and renders the template
# without calling has_object_permission checks.
obj = view.get_object()
return render(request, view.template_name, {"object": obj})
# Patched Version (Simplified Behavior)
from djust.auth.core import enforce_object_permission
from django.core.exceptions import PermissionDenied
def render_http(request, view):
try:
# Secure: The unified authorization chokepoint is evaluated first
enforce_object_permission(request, view)
obj = view.get_object()
return render(request, view.template_name, {"object": obj})
except PermissionDenied:
# Handles unauthorized access gracefully by returning a 403 Forbidden response
return HttpResponseForbidden("Permission Denied")By routing the initial HTTP render, the SPA route changes, and the embedded views through enforce_object_permission, the framework blocks unauthorized rendering at the earliest stage of execution.
An attacker can exploit this IDOR vulnerability by targeting any of the three un-gated rendering pathways. No sophisticated payloads are required to trigger the bug, as it relies on standard browser navigation or manipulated API calls.
In a direct HTTP GET attack, an attacker with low-privileged credentials can identify a target URL containing an object identifier, such as /reports/99812/. By requesting this URL directly through a browser or using a command-line tool, the attacker bypasses the WebSocket connection entirely:
curl -H "Cookie: sessionid=<attacker_session_cookie>" https://example.com/reports/99812/Because the server does not enforce has_object_permission on the synchronous HTTP GET path, it processes the request, retrieves the record from the database, and returns the fully rendered HTML page containing the unauthorized object's data to the attacker's console.
Similar bypasses occur when executing client-side routing changes within the SPA context. Manipulating the URL state prompts the backend to dispatch a url_change event, which executes without access checks and returns the sensitive state data.
The vulnerability has a High severity rating, primarily affecting confidentiality. Because of the missing access controls, any authenticated user can read arbitrary database records managed by the affected views simply by enumerating or predicting object identifiers.
While the primary impact is unauthorized information disclosure, there is a minor risk to integrity depending on the exposed templates. If the rendered DOM contains actionable forms or input elements that execute without further authorization checks, unauthorized users might manipulate state variables.
The CVSS v3.1 vector string is CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N, leading to a base score of 7.1. This indicates low complexity, requiring low privilege levels, and posing no threat to system availability.
The recommended remediation strategy is to upgrade djust to version 1.0.7 or later, which incorporates the centralized authorization architecture.
Administrators can update their installations using pip:
pip install --upgrade djustIf patching cannot be performed immediately, developers must implement manual authorization checks within custom dispatch or HTTP lifecycle hooks for all views utilizing get_object. Additionally, developers should write regression tests targeting the alternative rendering pathways to ensure permission coverage remains intact.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N| Attribute | Detail |
|---|---|
| CWE ID | CWE-639, CWE-862 |
| Attack Vector | Network |
| CVSS v3.1 Score | 7.1 |
| EPSS Score | N/A |
| Impact | High (Confidentiality) |
| Exploit Status | None |
| CISA KEV Status | Not Listed |
CVE-2026-61589 is a security-bypass and information-disclosure vulnerability in the djust library prior to version 1.0.7. The library's WebSocket live path component fails to propagate the client HTTP Host header when dynamically reconstructing Django HttpRequest objects. Consequently, multi-tenant Django applications that rely on Host-based resolution may fail to isolate data correctly under certain configurations, leading to unauthorized cross-tenant data access.
A critical unauthenticated arbitrary module import vulnerability in the djust framework before version 1.0.7 allows remote attackers to execute arbitrary code by exploiting unsafe Python reflection during LiveView connection mounting.
A denial-of-service (DoS) and resource exhaustion vulnerability exists in Grav CMS prior to version 2.0.0. The package installer decompressor fails to validate ZIP archive limits before extraction, allowing authenticated administrators to cause disk exhaustion, inode exhaustion, or process termination.
CVE-2026-57173 (GHSA-hcwq-8wjf-3gcr) represents a critical resource allocation validation vulnerability in the vLLM inference engine. Prior to version 0.24.0, vLLM's multimodal chat completions pipeline failed to enforce maximum audio decode duration limits. Unauthenticated remote attackers can exploit this to perform an audio decompression bomb attack, causing massive memory allocations that trigger immediate system Out-Of-Memory (OOM) crashes and service termination.
Grav CMS before v2.0.1 contains a security bypass vulnerability in its blueprint validation logic. The XSS detection routine, Security::detectXss(), was executed on raw page contents prior to Twig engine processing. When Twig processing is enabled for editor-authored page content, an attacker can dynamically reconstruct harmful HTML elements, attributes, or protocols using string concatenation (e.g. `{{ 'on' ~ 'error' }}`). When compiled, the benign source converts into active XSS payloads, which are rendered to the client browser via raw filters. This vulnerability was resolved in version 2.0.1 by adding a post-render validation backstop.
An OAuth resource spoofing vulnerability in the rmcp crate prior to 2.0.0 allows a malicious Model Context Protocol (MCP) server to spoof protected resource metadata. By presenting metadata pointing to a legitimate resource and authorization server, the attacker can trick the client into completing the authentication flow and subsequently sending the authorized token back to the malicious server.