Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as any tenant user
-
DeliveryOpen WebSocket/SSE live connection
-
ExploitTenant context is None on live path
-
ExecutionTenant manager fails open, returns unfiltered queryset
-
ImpactRead and exfiltrate all tenants' rows
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A10:2025 - Mishandling of Exceptional Conditions
ASVS 5.0
V16 - Security Logging and Error Handling Fail-secure design
|
| Exploitation Conditions | Exploitation requires a djust application older than 1.0.7 that uses the djust.tenants multi-tenancy feature AND serves data over the live path (WebSocket or SSE / LiveView-style dispatch). The attacker must be able to establish a live socket to the app (PR:L - a valid session/authenticated tenant user), after which every mount and event handler runs with get_current_tenant()==None and the manager returns unfiltered, cross-tenant data. Limiting factors: the flaw only manifests on the WS/SSE path (pure HTTP requests remained correctly tenant-scoped), the app must actually rely on djust's tenant-aware QuerySet managers for isolation, and the shared threading.local on the sync_to_async executor thread can also leak one connection's tenant into another. The vendor states there is NO workaround on the live path short of upgrading to 1.0.7; disabling STRICT_MODE does not help since the live path ignored STRICT_MODE and failed open regardless. |
| Impact | This is a genuine, high-priority tenant-isolation flaw rather than an inflated high-CVSS finding, though the raw score should be read carefully. The CVSS vector (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N = 7.7) is internally consistent with the description: network-reachable, low complexity, requires low privileges (a valid socket/session), no user interaction, and a scope change (S:C) because one tenant's socket reads OTHER tenants' data. The C:H / I:N / A:N split correctly reflects a pure confidentiality (data-disclosure) issue with no integrity or availability impact - matching the 'Information Disclosure' tag and CWE-636 (Not Failing Securely / fail-open). No EPSS score, no CISA KEV entry, and no public exploit code are present in the provided intelligence, so exploitation status is 'no public exploit identified at time of analysis'; the absence of these signals is expected for a freshly disclosed flaw in a small package and does not lower the underlying severity. The one signal that tempers real-world urgency is deployment footprint: djust is an obscure niche framework, so this is a serious bug in a low-prevalence product, meaning aggregate internet-wide risk is modest even though per-deployment impact (full cross-tenant data disclosure) is severe. No data conflicts were detected between the CVSS vector and the narrative - both agree the flaw is remote, low-privilege, confidentiality-only, and scope-changing. |
| Exploit ScenarioDerived | A legitimate low-privilege user of one tenant on a multi-tenant djust application opens a WebSocket or SSE 'live' connection. Because the current tenant is never bound on the live path, get_current_tenant() returns None and the tenant-aware manager fails open, returning the unfiltered queryset, so the attacker's event handlers read and receive rows belonging to every other tenant. No public exploit code is identified at time of analysis, but exploitation requires no special tooling - only interacting with the live views over an authenticated socket. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 16, 2026
Cross-tenant data disclosure in djust before 1.0.7 allows an authenticated low-privileged user who holds a WebSocket or SSE connection to read every tenant's rows, because the tenant-isolation manager failed open on the live path rather than rejecting the unscoped query. Only applications using the djust.tenants multi-tenancy feature and serving data over WebSocket/SSE mount or event dispatch are affected; pure HTTP requests remained correctly tenant-scoped. There is no public exploit code identified at time of analysis and the issue is not listed in CISA KEV - the vendor's fix is djust 1.0.7, and there is no workaround on the live path short of upgrading.
RemediationAI
Vendor-released patch: upgrade to djust 1.0.7, which migrates tenant storage from threading.local() to contextvars.ContextVar, binds the tenant around WS/SSE mount and every dispatch, and forces the tenant-aware QuerySet managers to fail closed (.none()) under the default STRICT_MODE. The vendor explicitly states there is no workaround on the live path short of upgrading, so the upgrade should be treated as the only real fix for affected applications; note that setting STRICT_MODE=False makes things no better, because the live path ignored STRICT_MODE and failed open regardless, and turning it off only suppresses the new S006 system check. If an upgrade cannot be deployed immediately, treat the exposure as unmitigated at the application layer and apply compensating controls with acknowledged trade-offs: disable or refuse WebSocket/SSE endpoints for the affected tenant-aware views (breaks all live/realtime functionality), restrict the live endpoints at the reverse proxy or network layer to trusted clients only (reduces but does not eliminate the risk from any authenticated user who can still reach the socket), or run affected tenants in separate deployments/databases so no single socket can reach cross-tenant rows (substantial operational cost). After upgrading, verify that system check S006 is clean and that STRICT_MODE remains enabled so the manager's fail-closed behavior stays in effect. Details and the release notes are at https://github.com/djust-org/djust/security/advisories/GHSA-3492-cvg7-9mr2 and https://github.com/djust-org/djust/releases/tag/v1.0.7.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in pypi
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The root cause is CWE-636 (Not Failing Securely / Failing Open). djust stored the active tenant in threading.local(), which was populated exclusively by the HTTP-only TenantMiddleware. Consequently, on the live (WebSocket/SSE) path get_current_tenant() returned None during mount and for every event handler, and the tenant-aware QuerySet manager interpreted the missing tenant as 'no filter required' - returning the unfiltered base queryset and ignoring STRICT_MODE entirely, so any socket holder could observe other tenants' rows. A secondary defect made threading.local unsafe on the sync_to_async executor thread, where the same thread-local slot is reused across connections and one connection's tenant could bleed into another's request context. The fix in 1.0.7 replaces thread-local storage with a contextvars.ContextVar that is naturally scoped per async task, binds the resolved tenant around WS/SSE mount and each dispatch, and makes both managers scope the base queryset once and fail CLOSED (.none() under the default STRICT_MODE). A new system check, S006, warns when STRICT_MODE=False so deployments do not silently lose the closed-fail safety net. Affected package is pkg:pip/djust; the vulnerability is classified under the Information Disclosure tag and is network-reachable (AV:N) with low complexity and no user interaction, with a scope change (S:C) reflecting the boundary crossing between tenants.
Know when Python gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N
Network-reachable live socket with low complexity; PR:L because a valid tenant socket is needed; S:C as one tenant reads another's data; confidentiality-only, so C:H, I:N, A:N.
Primary rating from Vendor (https://github.com/djust-org/djust).
CVSS VectorVendor: https://github.com/djust-org/djust
Lifecycle Timeline
2DescriptionCVE.org
Impact
djust.tenants isolation was enforced only on the HTTP path. The current tenant was stored in threading.local() and set exclusively by the HTTP-only TenantMiddleware, so on the live (WebSocket/SSE) path get_current_tenant() was always None during mount and every event handler - and the tenant-aware QuerySet manager failed OPEN (returned the unfiltered queryset, ignoring STRICT_MODE), disclosing every tenant's rows to whoever held the socket. threading.local was additionally shared across connections on the sync_to_async executor thread.
Patches
Fixed in djust 1.0.7. Tenant storage moved to a contextvars.ContextVar (per async task); the resolved tenant is bound around WS/SSE mount and every dispatch; both managers scope the base queryset once and fail CLOSED (.none() under the default STRICT_MODE); and system check S006 warns when STRICT_MODE=False.
Workarounds
No workaround on the live path short of upgrading.
Technical POC Analysis
CWE-636 (Not Failing Securely / Failing Open), with a secondary CWE-862 (Missing Authorization) classification from the advisory.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Latest POC
1 PoC candidate from github (unverified)
Sign in to open the public PoC links collected for this CVE.
Executive ViewAI
A tenant-isolation defect in the djust framework (all versions before 1.0.7) lets any low-privileged user who holds a live WebSocket or SSE connection read data belonging to every tenant on the platform, defeating the isolation guarantee customers depend on. The affected code path fails open rather than rejecting an unscoped query, so the exposure is silent - it produces no error and would not surface in existing application monitoring. Leadership should care because any organization running multi-tenant djust applications with real-time features is exposed to a cross-customer data breach with contractual, regulatory, and reputational consequences, and there is no way to close the live path short of upgrading.
Apply vendor patch (upgrade to djust 1.0.7); no workaround exists on the WebSocket/SSE live path, so until upgrade is complete the only interim mitigations are disabling or strongly restricting live real-time endpoints in multi-tenant applications and increasing monitoring of live-channel data access.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t
BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser
pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi
The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python
BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica
OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph
pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.
Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301
In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse
Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne
EUVD-2026-80851
GHSA-3492-cvg7-9mr2
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB