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

CVE-2026-61592: Session Hijacking and Authorization Bypass in djust SSE Transport

Alon Barad
Alon Barad
Software Engineer

Sep 17, 2026·6 min read·12 visits

Executive Summary (TL;DR)

The djust framework prior to 1.0.7 accepted client-supplied session IDs in the Server-Sent Events (SSE) transport without verifying user ownership, enabling session hijacking and unauthorized state execution.

A high-severity session hijacking and authorization bypass vulnerability has been identified in the djust framework prior to version 1.0.7. The flaw resides in the Server-Sent Events (SSE) transport implementation, which keyed sessions solely by client-provided session identifiers without verifying session ownership or binding. This allows an attacker who possesses or guesses a victim's session identifier to send malicious post messages to execute arbitrary state machine event handlers under the identity and permissions of the victim.

Vulnerability Overview

The djust framework provides high-performance, reactive server-side rendering for Django applications, utilizing a Rust-optimized state machine to mirror UI and session states. The application supports two main underlying transports: WebSockets and Server-Sent Events (SSE). While the WebSocket implementation enforces strict, stateful authentication mapping, the SSE transport failed to implement equivalent authorization boundaries.\n\nBecause Server-Sent Events operate over stateless unidirectional streams paired with standard HTTP POST requests, the framework tracks session states on the server using an arbitrary key. Prior to version 1.0.7, this key was chosen and supplied directly by the client client-side without cryptographic verification. This structural gap exposes an unauthenticated attack surface to remote attackers, registered under the Common Weakness Enumeration as CWE-384 and CWE-862.\n\nIf an attacker can acquire, guess, or intercept an active client-chosen session identifier, they can issue arbitrary state manipulation calls. The server will process the event handlers inside the memory context of the victim's session. The execution context operates with the target victim's privileges, bypassing the identity check completely.

Root Cause Analysis

The root cause of this vulnerability lies in the stateless nature of SSE connections and how the framework manages its virtual DOM (VDOM) state machine index. When a user navigates to a reactive page, the server allocates a session state mapped to a unique session_id. However, in versions prior to 1.0.7, the framework relied entirely on a client-declared string value rather than an immutable, cryptographically generated token issued exclusively by the server.\n\nFurthermore, the message dispatcher endpoint /djust/api/message/ processed state mutations without validating the requesting principal's identity. The endpoint merely matched the incoming session_id payload to the corresponding backend state machine in memory. If a match was found, the endpoint executed the requested event handler within that state context.\n\nConsequently, there was no server-side validation to check whether the authenticated Django user (request.user) initiating the POST request matched the authenticated user who initially established the SSE channel. This lack of binding enables an attacker to perform cross-principal state hijacking by submitting POST commands with a stolen or predicted identifier.

Code Architecture & Analysis

An examination of the vulnerable code path reveals that the dispatcher accepted client-supplied arguments directly. Below is a conceptual illustration of the vulnerable dispatcher logic compared with the remediated framework implementation.\n\npython\n# Vulnerable SSE message dispatcher (Pre-1.0.7)\ndef handle_sse_message(request):\n payload = json.loads(request.body)\n session_id = payload.get(\"session_id\")\n \n # Retrieving state context purely by user-controlled key\n session_state = state_manager.get_session(session_id)\n if not session_state:\n return JsonResponse({\"error\": \"Session not found\"}, status=404)\n \n # CRITICAL: No validation of request.user against session creator\n event = payload.get(\"event\")\n handler = payload.get(\"handler\")\n result = session_state.dispatch_event(event, handler, payload.get(\"payload\"))\n return JsonResponse({\"status\": \"success\", \"result\": result})\n\n\nThe patch implemented in version 1.0.7 introduces explicit user principal binding. The framework now stores the owner's identity upon session initialization and enforces an explicit validation check on each incoming message.\n\npython\n# Remediation and principal binding (v1.0.7)\ndef handle_sse_message(request):\n payload = json.loads(request.body)\n session_id = payload.get(\"session_id\")\n \n session_state = state_manager.get_session(session_id)\n if not session_state:\n return JsonResponse({\"error\": \"Session not found\"}, status=404)\n \n # PATCH RESOLUTION: Validate principal identity of incoming request\n if session_state.owner_id != request.user.id:\n logger.warning(f\"Unauthorized session access: User {request.user.id} tried accessing {session_id}\")\n return JsonResponse({\"error\": \"Unauthorized session access\"}, status=403)\n \n event = payload.get(\"event\")\n handler = payload.get(\"handler\")\n result = session_state.dispatch_event(event, handler, payload.get(\"payload\"))\n return JsonResponse({\"status\": \"success\", \"result\": result})\n\n\nThis verification check successfully closes the vulnerability window. By validating owner_id against request.user.id, the server prevents any unauthenticated or unauthorized users from executing events on active reactive sessions.

Exploitation Methodology

Exploitation of this vulnerability requires that the target application has the Server-Sent Events (SSE) transport enabled and that the attacker has acquired a valid session_id. Attackers can potentially acquire the target ID via diagnostic log files, local cache directories, local storage access (via cross-site scripting), or predictive guessing if the identifier generation lacks sufficient entropy.\n\nOnce the attacker obtains the valid identifier, they can construct a direct HTTP POST request targeting the message execution endpoint. The attacker does not need to bypass the standard Django authentication cookies of the target user, since the dispatcher executes the logic based on the matched state memory of the active SSE session.\n\nhttp\nPOST /djust/api/message/ HTTP/1.1\nHost: vulnerable-application.com\nContent-Type: application/json\n\n{\n \"session_id\": \"victim_session_id_xyz\",\n \"event\": \"click\",\n \"handler\": \"execute_payment\",\n \"payload\": {\n \"recipient\": \"attacker_account\",\n \"amount\": 5000\n }\n}\n\n\nUpon receipt of the payload, the vulnerable backend state machine executes the execute_payment handler in the context of the user session associated with victim_session_id_xyz. The server then processes the transaction, allowing the attacker to conduct actions under the victim's identity.

Impact Assessment

The technical impact of CVE-2026-61592 is severe, compromising both confidentiality and integrity of active sessions within the application. An attacker can hijack the state machine of any user on the platform, allowing complete read access to state structures and write access to trigger form actions, administrative endpoints, or transactional logic.\n\nThe Common Vulnerability Scoring System (CVSS) base score is 7.4 (High). The attack vector is Network (AV:N), and user interaction is not required (UI:N). The attack complexity is assessed as High (AC:H) because the attacker must first discover an active, valid session identifier through separate channels before executing commands.\n\nAt the time of this analysis, there are no documented instances of active exploitation in the wild, nor has any weaponized exploit payload been observed. However, due to the direct route to authorization bypass, systems employing the SSE transport of djust remain highly exposed until patched.

Remediation & Mitigation Guidance

The definitive remediation is upgrading the djust package to version 1.0.7 or later, which implements secure session-to-principal bindings. The upgrade can be performed using standard Python package management tools.\n\nbash\npip install --upgrade djust>=1.0.7\n\n\nIf an immediate upgrade is not feasible, operators must apply a temporary workaround by disabling the SSE transport layer in the application configuration. This forces the application to fallback entirely to the secure WebSocket transport. Ensure that WebSockets are properly supported by your load balancers and proxy servers before applying this configuration change.\n\npython\n# Django settings.py mitigation example\nDJUST_SSE_ENABLED = False\n\n\nSecurity teams should also review application logs for requests directed to /djust/api/message/ containing identical session_id values but originating from distinct IP addresses or bearing different Django session cookies.

Fix Analysis (1)

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-org djust framework, versions prior to 1.0.7

Affected Versions Detail

Product
Affected Versions
Fixed Version
djust
djust-org
< 1.0.71.0.7
AttributeDetail
CWE IDCWE-384 / CWE-862
Attack VectorNetwork
CVSS Score7.4
EPSS Score0.00
ImpactSession Hijacking / Privilege Escalation
Exploit Statusnone
KEV Statusnot listed

MITRE ATT&CK Mapping

T1068Exploitation for Privilege Escalation
Privilege Escalation
CWE-862
Missing Authorization

The application lacks proper authorization checks on SSE event-handling requests, allowing attackers to access stateful sessions using user-controlled session identifiers.

References & Sources

  • [1]GitHub Security Advisory GHSA-f795-p5jw-j6g2
  • [2]djust Release v1.0.7
  • [3]NVD - CVE-2026-61592
  • [4]CVE Record - CVE-2026-61592
  • [5]Wiz Vulnerability Database

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