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-61590

CVE-2026-61590: Network-Exposed Observability Endpoints and Remote Method-Invocation in djust

Alon Barad
Alon Barad
Software Engineer

Sep 16, 2026·7 min read·2 visits

Executive Summary (TL;DR)

djust before 1.0.7 lacks robust view-level validation, allowing remote attackers to execute arbitrary methods via eval_handler when Django DEBUG mode is active and the optional localhost middleware is missing.

A critical access control vulnerability in djust prior to 1.0.7 exposes diagnostic endpoints and remote method-invocation capabilities to unauthorized network actors. The vulnerability arises due to decoupling IP boundary validation into an opt-in middleware that was omitted from official configuration documentation, leaving views to rely solely on the status of Django's DEBUG flag.

Vulnerability Overview

The Django library djust is designed to provide reactive, Phoenix LiveView-style server-side rendering for Django applications, utilizing a Rust-powered performance layer. To facilitate real-time monitoring and diagnostic feedback during local development, the library exposes telemetry and observability endpoints. These endpoints provide structural views of active user sessions, active state maps, and direct execution entry points for development diagnostics.

A security vulnerability in these observability endpoints allows unauthorized remote users to bypass origin checks and access sensitive state data. The primary attack vector is a remote invocation capability exposed via the eval_handler controller. This specific interface enables direct method-invocation against the backend context of an active session.

In standard production configurations, the vulnerability is latent unless the developer operates the application with Django's DEBUG setting enabled. However, due to a configuration gap and documentation error, standard deployments that follow the official installation guide are vulnerable. The absence of strict, hardcoded loopback enforcement in the endpoint controller code makes remote exploitation possible over any network-accessible TCP port routing to the Django application.

Root Cause Analysis

The root cause of this vulnerability lies in the decoupling of access control logic from the actual view controllers of the observability endpoints. To prevent external hosts from accessing sensitive debugging endpoints, the developers created an access control filter restricted to localhost loopback addresses (127.0.0.1 and ::1). However, this logic was implemented exclusively as an opt-in Django middleware component.

Because the access control was implemented in middleware rather than being encapsulated within the view definitions or URL routings, the views themselves had no internal verification of the requester's IP address. Instead, the endpoint controllers relied entirely on the state of Django's global configuration, checking only whether settings.DEBUG was set to True. This fallback logic assumed that any environment running with DEBUG = True would be hosted locally, or that the middleware would intercept and filter out external traffic.

Furthermore, the official installation documentation for the djust library omitted the middleware configuration steps entirely. Developers who configured their applications by copying the default configuration layouts did not include the localhost loopback middleware in their settings.MIDDLEWARE tuple. This created a scenario where any environment running with DEBUG = True (such as local staging, shared development environments, or QA servers) exposed the endpoint to external network interfaces without authentication.

Technical Control Flow

To map the execution path of the request, we can observe the path from the client connection to the backend execution context. When the middleware is not configured, the application routes the request directly to the unauthenticated view. This allows an attacker to interact with the system endpoints directly from the public internet.

The diagram outlines how the safety validation relies on the assumption that settings.DEBUG is equivalent to loopback-only access. When this assumption fails, the underlying core execution routine is exposed to external traffic.

Code-Level Analysis of Vulnerable and Patched States

To understand the architectural defect, it is necessary to examine the conceptual execution path of a request in an unpatched environment. The incoming request is processed by the Django routing engine and sent directly to the djust observability view.

# Vulnerable View Implementation (Pre-1.0.7)
from django.conf import settings
from django.http import JsonResponse, HttpResponseForbidden
 
def eval_handler(request):
    # The view relies entirely on Django's global DEBUG setting.
    # It assumes the LocalhostOnlyMiddleware has already executed,
    # or that DEBUG is only enabled on local developer systems.
    if not settings.DEBUG:
        return HttpResponseForbidden("Access Denied: Debug mode is disabled.")
    
    # Process remote method invocation
    payload = request.POST.get("expression")
    result = execute_internal_expression(payload)
    return JsonResponse({"status": "success", "result": result})

Because the LocalhostOnlyMiddleware is an opt-in component that was omitted from the documentation, the request lifecycle bypasses loopback checks entirely. The patch in version 1.0.7 resolves this by bringing the IP check directly into the view logic, ensuring that loopback restriction is mandatory and cannot be bypassed or omitted by setting configuration errors.

# Patched View Implementation (Post-1.0.7)
from django.conf import settings
from django.http import JsonResponse, HttpResponseForbidden
 
def is_loopback(ip):
    # Explicit loopback validation helper
    return ip in ("127.0.0.1", "::1")
 
def eval_handler(request):
    # Retrieve client IP address
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[0].strip()
    else:
        ip = request.META.get('REMOTE_ADDR')
 
    # Hardcoded enforcement: Reject non-localhost origins immediately
    # regardless of the state of settings.DEBUG
    if not is_loopback(ip):
        return HttpResponseForbidden("Access Denied: Endpoint restricted to localhost.")
 
    # Secondary check for DEBUG configuration
    if not settings.DEBUG:
        return HttpResponseForbidden("Access Denied: Debug mode is disabled.")
    
    # Process only whitelisted method invocations
    payload = request.POST.get("expression")
    if not is_valid_expression(payload):
         return HttpResponseForbidden("Access Denied: Invalid method execution.")
         
    result = execute_internal_expression(payload)
    return JsonResponse({"status": "success", "result": result})

Exploitation Methodology

Exploitation of CVE-2026-61590 requires two main prerequisites. First, the target Django application must be running with settings.DEBUG = True. Second, the optional LocalhostOnlyMiddleware must be absent from the application's configuration, which is the default state for deployments following the original documentation.

An attacker begins by scanning for exposed application paths associated with djust observability. Once identified, the attacker sends an unauthenticated HTTP POST request to the eval_handler endpoint. This request contains a parameter designated for dynamic execution or callback invocation, such as the expression or handler target parameters.

Because the remote method invocation interface runs within the context of the Django runtime, the attacker can leverage this execution path to retrieve internal configuration states, access database connection strings, or call sensitive backend objects. If the application environment possesses write access to critical models or runtime modules, these variables can be manipulated directly.

Impact Assessment

The security impact of CVE-2026-61590 is high, as reflected by its CVSS score of 7.4. The exposure of the observability endpoints allows unauthenticated remote actors to read live application states and session values. This compromises the confidentiality of active user sessions, potentially exposing session tokens, user profiles, and operational secrets stored in memory.

The integrity impact is also high due to the exposure of the eval_handler interface. By invoking arbitrary methods within the scope of the Django runtime, an attacker can modify application variables, manipulate session states, and invoke administrative functions. While direct shell command execution is constrained by the design of the parser, the capability to execute arbitrary internal Python methods is functionally equivalent to localized code execution within the application container.

The availability impact is theoretically present, as improper method invocation can cause exceptions that crash the ASGI/WSGI worker processes or degrade database connections. However, the primary consequence remains unauthorized access to critical data and administrative endpoints. The vulnerability is especially dangerous for development or staging systems exposed to the internet, as these environments routinely process realistic test data while maintaining relaxed security parameters.

Remediation and Defense-in-Depth

Remediation of CVE-2026-61590 requires updating the djust package or applying local configuration changes. The most effective resolution is to upgrade to djust version 1.0.7 or later, which integrates loopback verification directly into the view controllers.

For environments where immediate package upgrades are not possible, several mitigation steps must be applied. First, ensure that DEBUG is set to False in all settings files exposed to non-development environments. This disables the fallback code path within the observability views entirely.

Second, if the observability tools are required in a remote environment, developers must manually add the localhost-gating middleware to their Django settings. This is done by appending the proper middleware class to the MIDDLEWARE setting:

# settings.py
MIDDLEWARE = [
    # ... other middlewares ...
    'djust.middleware.LocalhostOnlyMiddleware',
]

Finally, configure network-level access control lists (ACLs) or reverse proxy rules (e.g., in Nginx or AWS Security Groups) to block external HTTP traffic targeting the _djust URI prefix. Access to these paths should be restricted strictly to internal maintenance networks or explicitly defined administrative hosts.

Technical Appendix

CVSS Score
7.4/ 10
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N

Affected Systems

djust

Affected Versions Detail

Product
Affected Versions
Fixed Version
djust
djust-org
< 1.0.71.0.7
AttributeDetail
CWE IDCWE-306, CWE-668
Attack VectorNetwork
CVSS v3.17.4
EPSS ScorePending
ImpactRemote Method Execution
Exploit StatusProof of Concept / Technical Advisory
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1005Data from Local System
Collection
CWE-306
Missing Authentication for Critical Function

The application does not perform any authentication check for a critical function, allowing unauthorized users to execute code or access data.

Vulnerability Timeline

GHSA-8g2f-g3gq-5rjv Published
2026-09-16
CVE-2026-61590 Released
2026-09-16
djust v1.0.7 Released with Hotfix
2026-09-16

References & Sources

  • [1]GHSA-8g2f-g3gq-5rjv: djust Security Advisory
  • [2]djust v1.0.7 Release Notes
  • [3]CVE-2026-61590 on CVE.org
  • [4]djust Repository

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-61560
9.8

CVE-2026-61560: Unauthenticated Remote Path Traversal and Access Token Exfiltration in @zereight/mcp-gitlab

CVE-2026-61560 is a critical security vulnerability in the @zereight/mcp-gitlab Server-Sent Events (SSE) server. By utilizing default, unauthenticated route setups and exposing vulnerable administrative tools, remote attackers can execute path traversal attacks to read internal process variables and hijack GitLab operations.

Amit Schendel
Amit Schendel
0 views•8 min read
•about 2 hours ago•CVE-2026-61595
7.7

CVE-2026-61595: Multi-Tenancy Isolation Bypass on WebSocket and SSE Paths in djust

The multi-tenant isolation mechanism in djust prior to version 1.0.7 fails open on active WebSocket and Server-Sent Events (SSE) connections. Because the tenant context is stored in thread-local variables and initialized exclusively via HTTP middleware, asynchronous event loops executing ASGI/WebSocket code paths do not carry the resolved tenant identifier. When queries are executed without this context, the default database manager fails open, allowing authenticated users of any tenant to query and read sensitive rows across all other tenant accounts.

Amit Schendel
Amit Schendel
2 views•5 min read
•about 3 hours ago•CVE-2025-59953
9.8

CVE-2025-59953: Unauthenticated Remote Code Execution in LMDeploy AsyncRPCServer via Insecure Pickle Deserialization

LMDeploy prior to version 0.10.2 is vulnerable to remote code execution because its AsyncRPCServer component implements unauthenticated, remote-accessible communication sockets and uses the insecure pickle.loads() deserializer to process incoming requests.

Alon Barad
Alon Barad
2 views•6 min read
•about 4 hours ago•CVE-2026-68904
7.0

CVE-2026-68904: Uncontrolled Resource Consumption (Socket Leak and Reconnection Storm) in node-opcua

CVE-2026-68904 is a high-severity Denial of Service (DoS) vulnerability in the node-opcua library. It arises from a logical flaw in the keepalive session manager combined with incorrect socket termination at the TCP transport layer. When server-side anomalies occur, affected clients fall into an infinite, high-frequency reconnection loop. Due to the use of graceful teardown (socket.end) instead of immediate termination (socket.destroy) during negotiation failures, sockets remain open in the FIN-WAIT-2 state. This accumulates system file descriptors and memory, eventually crashing the client process.

Amit Schendel
Amit Schendel
8 views•8 min read
•about 5 hours ago•CVE-2026-61593
8.1

CVE-2026-61593: Cross-Site Request Forgery in djust Server-Sent Events Transport Layer

CVE-2026-61593 is a high-severity Cross-Site Request Forgery (CSRF) vulnerability discovered in the Server-Sent Events (SSE) transport layer of djust, an open-source framework that implements Phoenix LiveView-style reactive server-side rendering for Django applications. Before version 1.0.7, a lack of origin verification on the SSE stream endpoint, combined with @csrf_exempt decorators on message POST endpoints, allowed an attacker to hijack active client sessions through cross-origin interactions.

Alon Barad
Alon Barad
5 views•5 min read
•about 6 hours ago•CVE-2026-81192
7.0

CVE-2026-81192: Local Code Execution via Untrusted Search Path in OpenTelemetry.Resources.Host

An untrusted search path vulnerability (CWE-426) in the OpenTelemetry.Resources.Host NuGet package on macOS allows a local attacker to execute arbitrary code with elevated privileges by hijacking standard system commands such as sh and ioreg.

Alon Barad
Alon Barad
4 views•6 min read