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

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

Alon Barad
Alon Barad
Software Engineer

Sep 17, 2026·6 min read·16 visits

Executive Summary (TL;DR)

A security-bypass and cross-tenant data disclosure vulnerability in djust (< 1.0.7) caused by the failure to propagate HTTP Host headers over WebSocket connections, falling back to 'testserver' and bypassing multi-tenancy controls.

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.

Vulnerability Overview

The djust library is a high-performance framework designed to bring Phoenix LiveView-style reactive, server-side rendering to Django applications through a Rust-powered backend. During standard operations, clients maintain a persistent WebSocket connection known as the live path to receive and render real-time UI updates. To process views and template logic within this persistent lifecycle, the library must dynamically reconstruct standard Django HttpRequest objects from the underlying ASGI WebSocket scope.

Prior to version 1.0.7, a critical design flaw existed in how djust executed this reconstruction mechanism. When handling a WebSocket connection, the library did not preserve the client's handshake HTTP Host header. This architectural omission meant that downstream routing, middleware, and database managers received a simulated HTTP request with incomplete state.

The omission directly exposed multi-tenant environments utilizing host-based resolution to severe authentication and isolation failures. If an application relied on custom resolvers mapping hostnames to database schemas or tenants, the unresolved host resulted in default values. Depending on the global application configuration, this behavior either exposed sensitive data belonging to arbitrary tenants or broke application functionality completely.

Root Cause Analysis

The root cause of the vulnerability lies in the implementation of the request builder mechanism inside djust. When instantiating simulated Django HttpRequest objects, djust relied on Django's testing utility, specifically RequestFactory().get(...). This utility is designed for unit testing environments and defaults the HTTP Host configuration parameter to "testserver" if no explicit HTTP_HOST is supplied.

When a client initiated a WebSocket handshake, the library parsed the path and query parameters from the ASGI scope but completely omitted the extraction of connection headers. Consequently, the invocation of RequestFactory().get(scope['path']) was executed without a defined host. Any subsequent call to request.get_host() inside Django views or tenant-resolver middleware resolved statically to "testserver".

The failure to propagate authentic headers bypassed the application's verification boundaries. Multi-tenant Django architectures typically resolve tenants by inspecting request.get_host() to extract the subdomain or domain name mapping. Because the live path request returned "testserver", the tenant resolver failed to map the incoming request to any active tenant, returning None instead of a valid database isolation key.

Code-Level Analysis and Patch Verification

To understand the precise technical breakdown, we must analyze the dynamic request reconstruction phase before and after the release of version 1.0.7. The vulnerable path relied on direct RequestFactory calls without inspecting the headers key inside the ASGI connection dictionary. This allowed default settings to override critical client-provided parameters.

# Vulnerable Implementation in djust (< 1.0.7)
# The library dynamically instantiates RequestFactory without reading ASGI headers.
 
from django.test import RequestFactory
 
class ViewRuntime:
    def _build_request(self, scope):
        factory = RequestFactory()
        # The HTTP_HOST parameter is missing from the constructor argument list
        request = factory.get(scope['path'])
        # request.get_host() resolves to the hardcoded test framework default: "testserver"
        return request
# Patched Implementation in djust (>= 1.0.7)
# The library securely parses the ASGI headers, extracts Host, and validates it.
 
from django.test import RequestFactory
from django.utils.http import split_domain_port
from django.core.exceptions import DisallowedHost
 
class ViewRuntime:
    def _build_request(self, scope):
        # Extract raw headers list from ASGI scope
        headers = dict(scope.get('headers', []))
        
        # Safely retrieve the host header, defaulting to empty bytes
        host_bytes = headers.get(b'host', b'')
        host = host_bytes.decode('utf-8', errors='ignore') if host_bytes else "testserver"
        
        # Validate host against ALLOWED_HOSTS configuration
        try:
            domain, port = split_domain_port(host)
            # Perform standard Django ALLOWED_HOSTS validation here
        except ValueError:
            raise DisallowedHost("Malformed Host header received")
        
        factory = RequestFactory()
        # Explicitly propagate HTTP_HOST and server scheme parameters
        request = factory.get(
            scope['path'],
            HTTP_HOST=host,
            SECURE_PROXY_SSL_HEADER=scope.get('scheme', 'http')
        )
        return request

The implementation in version 1.0.7 successfully resolves the underlying flaw by extracting the host parameter from the ASGI scope's binary header list. The patch parses the host domain and port safely to prevent injection vectors, verifying the parameter against Django's allowed domain lists before constructing the request object. This guarantees that host-based resolution logic behaves identically under WebSocket contexts and standard synchronous HTTP cycles.

Exploitation and Attack Scenarios

Exploitation of this vulnerability requires a specific set of target environment configurations and user privileges. An attacker must first authenticate as a legitimate user under a specific sub-tenant domain (e.g., tenant-a.example.com). The application must utilize the djust rendering engine on a WebSocket connection to fetch tenant-scoped records.

Once authenticated, the attacker establishes a WebSocket session on the live path to load or refresh a reactive page. The server processes the websocket payload and invokes ViewRuntime._build_request to build the template context. Because the Host header is omitted during this assembly, the internal system state sets the host identity to "testserver".

The tenant resolver is unable to map "testserver" to any tenant profile, which sets the tenant variable to None. In environments configured with STRICT_MODE=False, the application fallback logic assumes a global querying state. The database router then executes standard SQL queries without appending the isolation constraints, returning rows belonging to all active tenants back to the attacker's browser interface.

Impact Assessment

The security impact of CVE-2026-61589 varies directly with the isolation configuration of the host application. In multi-tenant environments where STRICT_MODE=False is enabled, the flaw allows low-privileged attackers to query cross-tenant datasets. This unauthorized data exposure violates core confidentiality requirements by exposing financial, personal, or administrative data across tenant boundaries.

Alternatively, in environments that enforce STRICT_MODE=True as a defensive default, the database manager restricts the query results to empty datasets when tenant resolution fails. While this prevents data leaks, it results in complete application functional denial-of-service on the live path. The WebSocket connection fails to populate the user interface with any valid records, leading to a broken tenant session.

The vulnerability has received a CVSS v3.1 score of 6.3 with a base vector string of CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:N/A:N. The network attack vector is combined with high attack complexity due to the requirement for specific host-based database isolation implementations. The scope parameter is marked as changed because the compromise of host resolution within the rendering component directly impacts isolation guarantees at the underlying database access layer.

Remediation and Mitigation

The primary remediation path is to upgrade the djust package to version 1.0.7 or later, which contains the complete patch for Host header parsing. If upgrading cannot be accomplished immediately, operators must configure strict database isolation modes. This converts potential information disclosure vectors into deterministic application failures, mitigating confidentiality risks.

Organizations utilizing custom tenant resolvers must verify that fallback configurations reject unresolvable hosts rather than returning global records. Under no circumstances should database queries on multi-tenant backends execute without explicit schema or client filters when the resolver yields a None result.

Security engineers can monitor logs for anomalies indicative of this bypass. Specifically, tracing database logs for queries executing on the production database using the default hostname "testserver" provides high-fidelity detection of vulnerable pathways or active exploitation attempts.

Technical Appendix

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

Affected Systems

djust library prior to version 1.0.7

Affected Versions Detail

Product
Affected Versions
Fixed Version
djust
djust-org
< 1.0.71.0.7
AttributeDetail
Vulnerability ClassSecurity Bypass / Improper Scoping
CWE IDCWE-348 / CWE-639
CVSS v3.1 Score6.3
EPSS ScoreN/A
ImpactInformation Disclosure / Broken Tenancy
Exploit StatusNone
CISA KEV StatusNot Listed

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
CWE-348
Use of Less Trusted Source

References & Sources

  • [1]GitHub Advisory GHSA-v9rj-xjfv-xj9r
  • [2]djust v1.0.7 Release Patch
  • [3]CVE-2026-61589 on CVE.org

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 15 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
6 views•10 min read
•about 16 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
7 views•10 min read
•about 17 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
7 views•9 min read
•about 18 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
7 views•10 min read
•about 19 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
7 views•10 min read
•about 20 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
8 views•10 min read