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

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

Alon Barad
Alon Barad
Software Engineer

Sep 17, 2026·5 min read·16 visits

Executive Summary (TL;DR)

The djust framework omitted authorization checks on non-WebSocket rendering paths, allowing authenticated users to bypass object-level permissions and access sensitive records.

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.

Vulnerability Overview

The djust Django framework provides reactive server-side rendering using a Rust-powered backend. It aims to deliver Phoenix LiveView-style reactivity inside Python environments. Prior to version 1.0.7, the framework contained an Insecure Direct Object Reference (IDOR) vulnerability identified as CVE-2026-61596.

This vulnerability allowed authenticated users to bypass object-level access controls. While permission checks were correctly executed over active WebSocket channels, they were completely omitted on several alternative rendering pathways. This architectural oversight exposed sensitive data to unauthorized requests.

Root Cause Analysis

The djust framework implements object-level authorization using the get_object and has_object_permission methods on views. This approach relies on fetching a database record and verifying that the requesting user possesses authorization to interact with that specific record.

In affected versions, these checks were restricted to the active WebSocket consumer lifecycle, specifically within the mount and event dispatch handlers. This design assumed all interaction would occur over persistent WebSocket connections. However, the framework exposes other pathways that render views without initializing a WebSocket session.

Three key paths bypassed these checks: synchronous HTTP GET rendering via RequestMixin.get and aget, client-side Single Page Application (SPA) navigation using ViewRuntime.dispatch_url_change, and embedded sub-views rendered with {% live_render %} template tags. Because these entry points lacked authorization validation, they fetched and displayed target objects without verifying the user's permissions.

The structural breakdown of this bypass can be represented as follows:

Code Analysis and Resolution

To resolve this vulnerability, version 1.0.7 introduced a consolidated authorization pipeline. The core authorization logic is centralized in the djust.auth.core.enforce_object_permission function, creating a single chokepoint for all rendering paths.

The updated implementation performs checks dynamically and fails closed by default. Below is a comparison demonstrating how the framework enforces access control during rendering:

# Affected Version (Simplified Behavior)
def render_http(request, view):
    # Vulnerable: Directly retrieves the object and renders the template
    # without calling has_object_permission checks.
    obj = view.get_object()
    return render(request, view.template_name, {"object": obj})
 
# Patched Version (Simplified Behavior)
from djust.auth.core import enforce_object_permission
from django.core.exceptions import PermissionDenied
 
def render_http(request, view):
    try:
        # Secure: The unified authorization chokepoint is evaluated first
        enforce_object_permission(request, view)
        obj = view.get_object()
        return render(request, view.template_name, {"object": obj})
    except PermissionDenied:
        # Handles unauthorized access gracefully by returning a 403 Forbidden response
        return HttpResponseForbidden("Permission Denied")

By routing the initial HTTP render, the SPA route changes, and the embedded views through enforce_object_permission, the framework blocks unauthorized rendering at the earliest stage of execution.

Exploitation Methodology

An attacker can exploit this IDOR vulnerability by targeting any of the three un-gated rendering pathways. No sophisticated payloads are required to trigger the bug, as it relies on standard browser navigation or manipulated API calls.

In a direct HTTP GET attack, an attacker with low-privileged credentials can identify a target URL containing an object identifier, such as /reports/99812/. By requesting this URL directly through a browser or using a command-line tool, the attacker bypasses the WebSocket connection entirely:

curl -H "Cookie: sessionid=<attacker_session_cookie>" https://example.com/reports/99812/

Because the server does not enforce has_object_permission on the synchronous HTTP GET path, it processes the request, retrieves the record from the database, and returns the fully rendered HTML page containing the unauthorized object's data to the attacker's console.

Similar bypasses occur when executing client-side routing changes within the SPA context. Manipulating the URL state prompts the backend to dispatch a url_change event, which executes without access checks and returns the sensitive state data.

Impact Assessment

The vulnerability has a High severity rating, primarily affecting confidentiality. Because of the missing access controls, any authenticated user can read arbitrary database records managed by the affected views simply by enumerating or predicting object identifiers.

While the primary impact is unauthorized information disclosure, there is a minor risk to integrity depending on the exposed templates. If the rendered DOM contains actionable forms or input elements that execute without further authorization checks, unauthorized users might manipulate state variables.

The CVSS v3.1 vector string is CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N, leading to a base score of 7.1. This indicates low complexity, requiring low privilege levels, and posing no threat to system availability.

Remediation and Detection

The recommended remediation strategy is to upgrade djust to version 1.0.7 or later, which incorporates the centralized authorization architecture.

Administrators can update their installations using pip:

pip install --upgrade djust

If patching cannot be performed immediately, developers must implement manual authorization checks within custom dispatch or HTTP lifecycle hooks for all views utilizing get_object. Additionally, developers should write regression tests targeting the alternative rendering pathways to ensure permission coverage remains intact.

Technical Appendix

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

Affected Systems

djust framework
AttributeDetail
CWE IDCWE-639, CWE-862
Attack VectorNetwork
CVSS v3.1 Score7.1
EPSS ScoreN/A
ImpactHigh (Confidentiality)
Exploit StatusNone
CISA KEV StatusNot Listed
CWE-639
Authorization Bypass Through User-Controlled Key

Vulnerability Timeline

Version 1.0.7 fix released to address render-path permission bypass
2026-06-22
Official Security Advisory GHSA-c7c5-5j6r-q957 and CVE-2026-61596 published
2026-09-16

References & Sources

  • [1]GitHub Security Advisory GHSA-c7c5-5j6r-q957
  • [2]djust v1.0.7 Release Notes

More Reports

•about 18 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 19 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 20 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 21 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
8 views•10 min read
•about 22 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 23 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