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·19 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

•about 2 hours ago•CVE-2026-118777
4.8

CVE-2026-118777: Prototype Pollution in Forge HTTP Client Cookie Management

CVE-2026-118777 is a prototype pollution vulnerability (CWE-1321) in the Forge JavaScript cryptography and networking library (distributed on npm as node-forge) prior to version 1.4.1. The flaw resides in the forge.http client subsystem, where incoming HTTP cookie names and paths parsed from Set-Cookie response headers are stored directly into standard JavaScript objects without key validation or property isolation. By returning crafted Set-Cookie headers containing keys such as __proto__ or constructor, a malicious HTTP server can inject arbitrary properties into Object.prototype, attach attributes to the global Object constructor, or delete built-in prototype methods to cause an application-wide denial of service.

Amit Schendel
Amit Schendel
3 views•10 min read
•about 3 hours ago•CVE-2026-118775
3.7

CVE-2026-118775: ASN.1 OID First Arc Truncation and Ambiguity in node-forge

CVE-2026-118775 (GHSA-4642-5mcj-2rqw) is an integer overflow and validation flaw in the ASN.1 serialization module of Forge (node-forge) prior to version 1.4.1. The asn1.oidToDer() function fails to validate the range of the first two arcs of an Object Identifier (OID) and truncates the packed initial subidentifier to a single 8-bit integer. Applications that perform policy checks on untrusted OID strings before encoding them into Distinguished Encoding Rules (DER) format can be tricked into emitting DER bytes that correspond to a completely different, restricted OID.

Amit Schendel
Amit Schendel
6 views•10 min read
•about 4 hours ago•CVE-2026-119194
7.5

CVE-2026-119194: Algorithmic Complexity Denial of Service in pyasn1 Schemaless ASN.1 Decoder

CVE-2026-119194 is an algorithmic complexity vulnerability (CWE-407) in the pyasn1 library for Python, affecting versions 0.3.3 through 0.6.4. The flaw resides in the schemaless decoding routine ConstructedPayloadDecoderBase._decodeComponentsSchemaless used across BER, CER, and DER codecs. By sending an ASN.1 container populated with child components whose tag identifiers are separated by multiples of CPython's integer hash modulus (sys.hash_info.modulus), an unauthenticated attacker can force worst-case hash collisions in an unbounded Python set, degrading decoding performance from O(N) to O(N^2) and causing a Denial of Service (DoS).

Alon Barad
Alon Barad
5 views•9 min read
•about 5 hours ago•CVE-2026-119195
7.5

CVE-2026-119195: Quadratic-Time Denial of Service in pyasn1 BER/CER/DER Decoders

CVE-2026-119195 is an algorithmic complexity vulnerability (CWE-407) in the pyasn1 library for Python, affecting all versions prior to 0.6.5. When decoding constructed strings or indefinite-length ANY types across BER, CER, and certain DER code paths, the payload decoders repeatedly concatenate incoming fragments onto an immutable bytes object using the += operator. Because Python bytes objects cannot be resized in-place, each fragment iteration allocates a new buffer and copies all previously accumulated bytes, resulting in quadratic O(N^2) time and memory copy complexity. An unauthenticated remote attacker can supply a highly fragmented ASN.1 stream to exhaust CPU cycles and stall application worker threads.

Amit Schendel
Amit Schendel
6 views•10 min read
•about 6 hours ago•CVE-2026-119197
7.5

CVE-2026-119197: Quadratic Algorithmic Complexity Denial of Service in pyasn1 REAL Mantissa Decoder

An algorithmic complexity vulnerability (CWE-407) in pyasn1 versions prior to 0.6.5 allows unauthenticated attackers to cause a Denial of Service (DoS) via crafted ASN.1 payloads. The flaw resides in the binary-encoded ASN.1 REAL mantissa deserialization routine within RealPayloadDecoder.valueDecoder. By performing iterative byte-string slicing and repeated bitwise shifts on a growing arbitrary-precision integer, the decoder exhibits quadratic time and memory allocation complexity relative to the mantissa length. Supplying a BER-, CER-, or DER-encoded payload with a large REAL mantissa causes excessive CPU consumption and blocks application worker processes.

Amit Schendel
Amit Schendel
6 views•10 min read
•about 7 hours ago•CVE-2026-119196
7.5

CVE-2026-119196: Quadratic CPU Consumption in pyasn1 Constructed BIT STRING Decoding

A vulnerability classified under CWE-407 (Inefficient Algorithmic Complexity) exists in the pyasn1 library prior to version 0.6.5. When parsing constructed ASN.1 BIT STRING payloads under BER, CER, or schema-driven DER encoding rules, the BitStringPayloadDecoder repeatedly shifts and copies the entire accumulated bit value for each incoming fragment. Processing inputs with a large number of small constructed fragments induces quadratic CPU consumption, allowing unauthenticated remote attackers to cause a denial of service via resource exhaustion during the initial decoding phase.

Alon Barad
Alon Barad
6 views•10 min read