CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-61599

CVE-2026-61599: Unauthenticated Arbitrary Module Import in djust Framework

Alon Barad
Alon Barad
Software Engineer

Sep 17, 2026·7 min read·1 visit

Executive Summary (TL;DR)

Unauthenticated remote attackers can execute arbitrary code on djust-enabled Django applications via crafted WebSocket payloads exploiting unsafe dynamic Python imports.

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.

Vulnerability Overview

The djust framework is designed to provide Phoenix LiveView-style reactive server-side rendering for Django applications, utilizing Rust-powered performance optimizations. To maintain interactive state and resolve user interactions, the architecture depends on persistent bidirectional channels established via WebSockets or Server-Sent Events (SSE). This setup exposes a critical interface where the client can request the mounting of specific dynamic views by sending their dot-separated Python module paths.\n\nCVE-2026-61599 describes a critical vulnerability classified under CWE-470 (Use of Externally-Controlled Input to Select Classes or Code, commonly known as Unsafe Reflection) within the view resolution mechanism of djust. Prior to version 1.0.7, an unauthenticated remote attacker could leverage this pathway to force the host Python process to import any arbitrary module accessible within its sys.path. Because Python's module initialization executes top-level code upon import, this design flaw enables unauthorized code execution and state alteration.\n\nThis analysis details the underlying technical mechanics of the dynamic loading vulnerability, demonstrates the structural weaknesses in the initial validation implementation, and outlines the precise steps required to remediate the flaw. Security engineers must understand that the vulnerability exists at the communication boundary, rendering standard application-level authentication checks ineffective because the exploitation occurs during the initial module-loading phase prior to view-level authorization checks.

Root Cause Analysis

The core security failure in the djust framework lies in its post-facto verification architecture. When a client initiates a view change or mount event over an open WebSocket connection, the backend framework receives a payload containing a target view path string, such as myapp.views.MyLiveView. The system splits this string to separate the module path from the class name, then immediately invokes Python's built-in __import__() function to locate and load the corresponding code.\n\nIn Python, importing a module is not a passive lookup; it actively evaluates all global-scope code within the target module to build its execution namespace. This execution pathway executes top-level function calls, variable definitions, database connections, and any inline system calls. The djust framework only performed subclass and privilege verification after completing the import operation, creating a classic "time-of-check to time-of-use" (TOCTOU) logical error where unsafe side-effects occur before access controls are validated.\n\nFurthermore, the authorization structures implemented in the framework configured a default "fail-open" posture. If the administrator did not explicitly define the LIVEVIEW_ALLOWED_MODULES setting in the Django configuration, the framework bypassed the path verification routine entirely. Even when configured, the validation routine employed a simple prefix-matching algorithm using Python's startswith() method, which could be bypassed by crafting module names that shared a common prefix but loaded distinct, unauthorized modules.

Code Analysis

To understand the difference in implementation, we compare the vulnerable implementation in pre-1.0.7 releases against the hardened architecture introduced in version 1.0.7. In the vulnerable version, the resolution routine immediately processed the client-supplied path, allowing any module to be executed if LIVEVIEW_ALLOWED_MODULES was undefined or if the name matched the prefix loosely. The check failed to restrict imports to explicit boundaries, such as appending a period separator to enforce package boundaries.\n\nThe following code block highlights the structural deficiencies in the vulnerable code path versus the patched logic:\n\npython\n# === VULNERABLE APPROACH (Pre-v1.0.7) ===\n# No validation before __import__ executes\nmodule_path, class_name = view_path.rsplit('.', 1)\nallowed_modules = getattr(settings, 'LIVEVIEW_ALLOWED_MODULES', None)\nif allowed_modules:\n # Defective matching: 'myapp.views_malicious' starts with 'myapp.views'\n if not any(module_path.startswith(allowed) for allowed in allowed_modules):\n raise PermissionError()\nmodule = __import__(module_path, fromlist=[class_name]) # Unsafe Import Executed Here\n\n# === SECURE APPROACH (v1.0.7) ===\n# Implementation of strict, fail-closed boundaries\ndef is_view_import_allowed(module_path: str) -> bool:\n if module_path in sys.modules:\n return True # Safe because module is already initialized\n allowed_modules = getattr(settings, 'LIVEVIEW_ALLOWED_MODULES', None)\n if not allowed_modules:\n return False # Fail-closed by default\n for allowed in allowed_modules:\n # Strict equality or package-level boundary match\n if module_path == allowed or module_path.startswith(allowed + "."):\n return True\n return False\n\n\nIn the patched implementation, the introduction of the is_view_import_allowed helper function forces a strict, fail-closed validation model. The framework checks if the module is already registered within sys.modules, which ensures that pre-loaded routes can resolve without additional overhead or side-effects. For lazy-loaded modules, the code enforces explicit package boundaries by verifying that the module path either equals the allowed string or is positioned as a direct submodule using the allowed + "." matching structure.

Exploitation and Attack Vectors

Exploitation of CVE-2026-61599 requires no active credentials because the websocket connection establishes a stateful channel prior to any view-level authorization checks. An attacker initiates a persistent connection to the live transport endpoint, typically hosted at /live/ or /ws/live/. Once the connection is open, the attacker transmits a standard JSON frame containing a mount or live_redirect_mount command targeting the malicious module pathway.\n\nThe exploitation payload takes advantage of the fact that the underlying Django server will attempt to resolve the module path instantly. If an attacker can upload arbitrary python files onto the target host (such as through standard unauthenticated file-upload mechanisms, media libraries, or temporary directories), they can reference these uploaded files using relative dot-notation. When the framework executes the import, the initialization routine of the uploaded python script executes commands directly inside the web server's environment.\n\nEven in environments where file uploads are strictly sandboxed or disabled, attackers can perform targeted denial of service or configuration extraction. By specifying heavy standard libraries, diagnostic tools, or platform-specific modules that execute network requests, resource allocations, or logging routines on initialization, the attacker can disrupt system stability or force the server to reveal system states via timing side-channels and error responses.\n\nmermaid\ngraph LR\n Attacker["Attacker Client"] -->|1. Establish WebSocket Connection| Endpoint["WebSocket Endpoint (/live/)"]\n Endpoint -->|2. Send Unsafe Mount Frame| Resolver["_view_resolution.py"]\n Resolver -->|3. Trigger __import__ immediately| SysPath["Python sys.path / Filesystem"]\n SysPath -->|4. Execute Top-Level Side-Effects| RCE["Arbitrary Code Execution"]\n Resolver -->|5. Perform Class/Auth Checks (Too Late)| Auth["Security Verification"]\n

Impact Assessment

The overall severity of CVE-2026-61599 is evaluated as high, receiving a CVSS v4.0 base score of 8.8. The critical impact vectors are Integrity and Confidentiality, resulting from the system executing unvalidated code under the security context of the Django application runner. If the application server process runs with elevated privileges, the execution scope matches those same high privileges, posing a threat to the host system.\n\nBecause this vulnerability utilizes standard network channels and bypasses traditional web application firewalls that do not inspect WebSocket frame contents, it represents a significant risk to exposed infrastructure. A successful exploit can lead to total system compromise, data extraction from connected databases, or deployment of persistent access mechanisms within the application container network.\n\nThe vulnerability has been documented with the primary identifier CVE-2026-61599 and the GitHub Security Advisory GHSA-7prp-2623-8g45. While there are currently no active weaponized public exploits reported in CISA's Known Exploited Vulnerabilities catalog, conceptual proofs of concept are available, meaning detection and immediate patching of vulnerable setups must be prioritized.

Remediation and Mitigation

The primary remediation strategy is to upgrade the djust package to version 1.0.7 or later immediately. The updated package eliminates the fail-open configuration default and establishes strict string matching at the module boundaries to prevent prefix-based bypasses. This mitigation intercepts all remote resolution actions prior to executing Python's runtime import mechanism, preventing arbitrary module load sequences.\n\nIf an immediate upgrade is not possible due to deployment constraints, administrators must configure a strict allowlist manually. Defining the LIVEVIEW_ALLOWED_MODULES array in the Django settings.py file restricts the module paths that the application is allowed to load dynamically. However, in pre-1.0.7 setups, this must be paired with extreme caution as prefix-based bypasses are still mathematically possible; developers must ensure no sensitive or executable paths share starting strings with the allowed modules.\n\nAdditionally, organizations should implement Web Application Firewall (WAF) rules designed to monitor WebSocket upgrade requests and look for patterns targeting the dynamic live routes. Monitoring Python error logs for unexpected ModuleNotFoundError or PermissionError tracebacks emanating from the _view_resolution.py codebase can serve as an early indicator of active probing or exploitation attempts on the network.

Technical Appendix

CVSS Score
8.8/ 10
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:H/VA:L/SC:N/SI:N/SA:N

Affected Systems

djust

Affected Versions Detail

Product
Affected Versions
Fixed Version
djust
djust-org
< 1.0.71.0.7
AttributeDetail
CWE IDCWE-470
Attack VectorNetwork
CVSS v4.0 Score8.8 (High)
EPSS ScoreNot Assigned
Exploit StatusPoC / Conceptual
CISA KEV StatusNot Listed

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1106Execution via Native API
Execution
T1210Exploitation of Remote Services
Lateral Movement
CWE-470
Use of Externally-Controlled Input to Select Classes or Code ('Unsafe Reflection')

The product uses input from an upstream source to select which class or code to use, without sufficiently verifying that the class or code is authorized.

Known Exploits & Detection

GitHub Security AdvisoryExploit mechanism analysis and mitigation guide detailing the websocket message payload pattern.

Vulnerability Timeline

Vulnerability Disclosed and CVE-2026-61599 Published
2026-09-16
GitHub Advisory GHSA-7prp-2623-8g45 Released
2026-09-16
djust Version 1.0.7 Released with Security Patches
2026-09-16

References & Sources

  • [1]GitHub Security Advisory GHSA-7prp-2623-8g45
  • [2]djust v1.0.7 Release Notes
  • [3]CVE-2026-61599 Record

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•1 minute ago•CVE-2026-61596
7.1

CVE-2026-61596: Broken Object-Level Access Control (IDOR) in djust Framework

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.

Alon Barad
Alon Barad
0 views•5 min read
•about 1 hour ago•CVE-2026-61589
6.3

CVE-2026-61589: Host Header Propagation Failure in djust WebSocket Live Path Reconstructor

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.

Alon Barad
Alon Barad
0 views•6 min read
•about 3 hours ago•CVE-2026-59193
4.9

CVE-2026-59193: Remote Denial of Service via Resource Exhaustion in Grav CMS

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.

Amit Schendel
Amit Schendel
2 views•6 min read
•about 4 hours ago•CVE-2026-57173
6.5

CVE-2026-57173: Unauthenticated Audio Decompression-Bomb Denial of Service in vLLM

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.

Amit Schendel
Amit Schendel
6 views•6 min read
•about 5 hours ago•CVE-2026-61453
6.1

CVE-2026-61453: Stored Cross-Site Scripting via Twig String Concatenation Bypass in Grav CMS

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.

Alon Barad
Alon Barad
5 views•7 min read
•about 6 hours ago•CVE-2026-63127
8.2

CVE-2026-63127: OAuth Resource Spoofing and Token Leakage in rmcp SDK

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.

Alon Barad
Alon Barad
5 views•7 min read