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

CVE-2026-61588: Sensitive Data Exposure via Over-Serialization in djust Framework

Amit Schendel
Amit Schendel
Senior Security Researcher

Sep 17, 2026·7 min read·17 visits

Executive Summary (TL;DR)

djust prior to 1.0.7 leaks sensitive database fields (such as user password hashes and administrator flags) to the browser when Django models are bound directly to public LiveView attributes.

A sensitive data exposure vulnerability exists in the djust framework before version 1.0.7. When serializing Django models to public view attributes, the framework fails to filter out sensitive fields such as passwords, privilege flags, and private tokens, leading to over-serialization and exposure of sensitive records to the client browser.

Vulnerability Overview

The djust framework is a high-performance web development library that enables Phoenix LiveView-style reactive server-side rendering for Django applications. By utilizing bidirectional connections over WebSockets or Server-Sent Events, the framework maintains state synchronization between the server and client-side Virtual DOM. Developers declare state attributes on a LiveView instance, and any public attribute is automatically serialized and sent to the client to render updates.

Prior to version 1.0.7, a critical flaw existed in the default serialization engine of djust. When a developer assigned a standard Django database Model instance to a public view attribute, the entire model object was serialized without any filtering of sensitive fields. This resulted in the inadvertent transmission of highly sensitive data, such as hashed user credentials, authentication tokens, and administrative privilege indicators directly to the browser.

This behavior created a broad, implicit attack surface because binding database models to view attributes is a standard pattern in modern reactive web architectures. The vulnerability is classified under CWE-200 (Exposure of Sensitive Information to an Unauthorized Actor) and CWE-359 (Exposure of Private Personal Information). It presents a significant risk to applications built on older djust versions that expose user profiles or core domain models to interactive templates.

Root Cause Analysis

The root cause of CVE-2026-61588 lies within the _serialize_model_safely helper function, which was invoked by the custom DjangoJSONEncoder inside djust's state-synchronization engine. When a public attribute on a LiveView was identified as a Django Model instance, the encoder recursively extracted values for all concrete database columns. The implementation lacked any form of field-filtering or authorization-aware validation before assembling the JSON payload.

This flaw was exacerbated by the multi-channel synchronization design of djust. Specifically, there are three primary paths through which over-serialization occurred. The first is active state synchronization (get_state()), where state updates are periodically computed and transmitted as delta packages. The second is state-snapshotting (enable_state_snapshot = True), which serializes the current view state directly into hidden elements within the static HTML structure to facilitate state recovery. The third path is the JIT compiler's fallback mode, which executes a complete object-level serialization if a model is referenced as a whole within the template or when an attribute is declared public but not parsed on a granular property level.

Because the framework prioritized seamless data accessibility over strict boundary controls, it operated on an implicit 'allow-all' model. Consequently, properties like password (holding PBKDF2 or bcrypt hashes), is_superuser, is_staff, and custom business tokens (such as API keys or personal identifiers) were converted into plaintext JSON properties and placed directly onto the websocket stream.

Code Analysis & Patch Mechanics

The security update in version 1.0.7 completely refactored the serialization process to introduce structured, multi-tier protection. Below is a conceptual demonstration of the vulnerable implementation versus the secure implementation in _serialize_model_safely:

# VULNERABLE: djust < 1.0.7
def _serialize_model_safely(model_instance):
    # Iterates and serializes every concrete database field without restriction
    data = {}
    for field in model_instance._meta.concrete_fields:
        data[field.name] = field.value_from_object(model_instance)
    return data
# PATCHED: djust >= 1.0.7
def _serialize_model_safely(model_instance):
    # 1. Check if model provides custom serialization representation
    if hasattr(model_instance, 'to_dict'):
        return model_instance.to_dict()
        
    # 2. Establish hardcoded security floor
    built_in_denylist = {'password', 'is_superuser', 'is_staff'}
    global_denylist = getattr(settings, 'DJUST_SENSITIVE_FIELDS', set())
    merged_denylist = built_in_denylist.union(global_denylist)
    
    # 3. Handle model-level allowlists or exclusion lists
    model_excludes = getattr(model_instance, 'djust_exclude_fields', [])
    model_allowlist = getattr(model_instance, 'djust_serializable_fields', None)
    
    data = {}
    for field in model_instance._meta.concrete_fields:
        name = field.name
        
        # Skip any blacklisted or excluded fields
        if name in merged_denylist or name in model_excludes:
            continue
            
        # Enforce strict allowlist if defined
        if model_allowlist is not None and name not in model_allowlist:
            # Always allow crucial identity fields
            if name not in ['id', 'pk']:
                continue
                
        data[name] = field.value_from_object(model_instance)
    return data

In addition to the database serialization enhancements, the JIT compiler's fallback behavior was modified. When a model instance is evaluated without explicit field selection (e.g., passing a model object to a generic helper or referencing user directly), the engine no longer attempts to serialize the complete object. Instead, it emits a minimal representation containing only id, pk, __model__, and the string representation of the object (__str__). This architectural design prevents inadvertent exposure even when custom rules are omitted.

Exploitation Methodology

Exploitation of CVE-2026-61588 requires no specialized exploit code or exploit toolkits. Because the vulnerability is an over-serialization flaw, the server itself pushes the sensitive fields directly to the user's browser. An attacker merely needs to inspect the incoming websocket frames or static HTML state-snapshots to extract the data.

An administrative session is not required to extract the logged-in user's own credentials. A low-privileged attacker can register a normal user account and navigate to any interactive view that binds their own model instance. By opening the developer tools, filtering for active websocket traffic, and selecting the initialization frame, the attacker will find their own PBKDF2 password hash within the JSON structure. This hash can then be extracted for offline cracking attacks.

In scenarios where a view displays a list of objects—such as workspace members or directories—and binds those models to a public attribute, the attacker can harvest information for other users. This includes obtaining the is_staff or is_superuser status of accounts across the platform. This information is highly valuable for mapping out high-privilege targets, facilitating lateral movement and privilege escalation inside the target network.

Security Impact Assessment

The CVSS v3.1 score of 6.5 (Medium) reflects the read-only nature of the leak, but the downstream risk to confidentiality is significant. Password hashes retrieved from serialized states allow attackers to initiate high-speed offline cracking campaigns. If weak passwords are used by personnel, those accounts can be completely compromised, bypassing authentication mechanisms on other systems that share credentials.

Additionally, exposing privilege flags like is_superuser and is_staff removes the opacity of the application's access control architecture. Attackers can pinpoint administrative users with perfect accuracy. Private personal information (PII) and authentication tokens used for external APIs might also be exposed if they are stored in fields belonging to the serialized model.

While the vulnerability lacks an active exploit signature in the wild, its structural nature makes it highly predictable. Any deployment using djust version prior to 1.0.7 is implicitly affected if models are assigned to public view fields. This makes remediation urgent for enterprise instances handling personal or financial data.

Remediation & Strategic Mitigations

The primary remediation path is upgrading the djust library to version 1.0.7 or later. This upgrade instantiates secure-by-default serialization behaviors, establishing a built-in denylist that strips passwords and staff/superuser flags automatically during recursive serialization. It also enables project-wide configuration via the DJUST_SENSITIVE_FIELDS setting in Django's configuration.

For instances where an immediate framework upgrade is impossible, developers should implement immediate tactical workarounds. The most robust immediate patch is to convert public view attributes to private view attributes. In djust, prefixing an attribute with a leading underscore (such as self._user instead of self.user) marks it as private, completely excluding it from client-side synchronization and snapshots.

Alternatively, developers can manually structure data representation by extracting only the specific primitive fields required by the user interface. Rather than assigning the complete user model, assign simple primitive strings like self.username = request.user.username and self.email = request.user.email. This prevents any automatic or fallback serialization from touching the model instance directly, maintaining a strict boundary between database objects and the network layer.

Official Patches

djust-orgdjust v1.0.7 Release

Technical Appendix

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

Affected Systems

djust framework (Python package)

Affected Versions Detail

Product
Affected Versions
Fixed Version
djust
djust-org
< 1.0.71.0.7
AttributeDetail
CWE IDCWE-200, CWE-359
Attack VectorNetwork
CVSS v3.16.5 (Medium)
EPSS ScoreNot indexed
ImpactHigh Confidentiality Exposure
Exploit StatusNone (Theoretical)
KEV StatusNot listed

MITRE ATT&CK Mapping

T1552Unsecured Credentials
Credential Access
T1005Data from Local System
Collection
CWE-200
Exposure of Sensitive Information to an Unauthorized Actor

The product exposes sensitive information to an actor who is not authorized to have access to that information.

Vulnerability Timeline

Vulnerability patched and GitHub Security Advisory GHSA-pvg3-6q9j-mj3x published
2026-06-22
CVE Record officially published to the MITRE and NVD catalogs
2026-09-16

References & Sources

  • [1]GitHub Security Advisory GHSA-pvg3-6q9j-mj3x
  • [2]djust v1.0.7 Release Notes
  • [3]Official CVE Record

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 day 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
7 views•10 min read
•1 day 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
8 views•10 min read
•1 day 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
•1 day 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
•1 day 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
•1 day 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