Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as staff user with view-only permission
-
ExploitOpen read-only admin change form for affected user model
-
ExecutionRead full unobfuscated password hash
-
ImpactExfiltrate hash for offline cracking
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V6 - Authentication Credential protection in transit/storage
|
| Exploitation Conditions | Exploitation requires an authenticated admin staff user holding only the 'view' permission on a user model that is EITHER not the configured AUTH_USER_MODEL, OR is an AUTH_USER_MODEL that inherits its |
| Impact | This is a genuinely low-priority issue, and the signals are internally consistent rather than conflicting. The CVSS 4.0 vector (AV:N/AC:L/AT:P/PR:H/UI:N/VC:L with VI:N/VA:N) describes an information-disclosure flaw limited to low confidentiality impact with no integrity or availability effect, and crucially requires high privileges (PR:H) - an already-authenticated staff user. The vendor itself rates it 'low' under the Django security policy, and vuln.today assigns a 'monitor' decision label, the lowest urgency tier. No EPSS score and no CISA KEV entry were provided, and there is no public exploit reference in the input, so there is nothing to suggest active or widespread exploitation. The only material caveat is scope: exploitation does not apply to Django's default User model - it needs a non-standard custom user model configuration (see exploitation_conditions) - so even the modest base score overstates risk for the typical deployment. There is no high-CVSS/low-real-risk contradiction here; both the raw score and all contextual signals agree this is a minor, privilege-gated disclosure. |
| Exploit ScenarioDerived | An authenticated Django admin staff member who has been granted only the 'view' permission (not 'change') on a custom user model opens that user's read-only change form in the admin. Because display_for_field() failed to obfuscate the password field for non-AUTH_USER_MODEL user models (or an AUTH_USER_MODEL inheriting its password column from a concrete parent via multi-table inheritance), the form renders the full password hash instead of a masked placeholder, which the staff user can copy for offline cracking. No public exploit code is referenced; exploitation requires network access to the admin plus valid staff credentials (PR:H). |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Nov 03, 2026
Password-hash disclosure in the Django admin affects custom user-model deployments: staff users who hold only the 'view' permission on a user model can read the entire stored password hash from the read-only change form when that model is not the configured AUTH_USER_MODEL, or when AUTH_USER_MODEL inherits its password field from a concrete parent through multi-table inheritance. The flaw is in django.contrib.admin.utils.display_for_field(), which only masked the password field when the field's model was exactly get_user_model(); the fix broadens that check to any AbstractBaseUser subclass and to models that are ancestors of the configured user model. Supported branches 6.1 before 6.1.3 and 6.0 before 6.0.10 are affected, and Django rates the issue severity "low"; there is no CISA KEV listing and no public exploit identified at time of analysis, and the operator decision label is monitor. Exposure requires an attacker who already holds valid staff credentials and admin access (PR:H per the assessed vector), and what is disclosed is a hash rather than plaintext, so offline cracking is still needed to make the information useful.
RemediationAI
Vendor-released patch: upgrade to Django 6.1.3 (for the 6.1 branch) or 6.0.10 (for the 6.0 branch), which contain the corrected check in display_for_field(); the fix is also visible in upstream commits f5b039a619b3b5394ea5b966e17c7546fda6f937, 7d875c0a49d2a59335c65f6bf57970a5bac03be2 and 67cce9dcd23ddeec41ccf0abfe3431e3cd724365. Projects on the unsupported 5.1.x, 5.0.x or 4.2.x series were not evaluated by the vendor and should be moved onto a supported, patched branch rather than assumed clean. If an upgrade cannot be staged immediately, the practical interim control is to withhold the admin 'view' permission on the affected user models: exploitation depends on a staff user having view-but-not-change access to a custom user model (or to an AUTH_USER_MODEL that inherits password through multi-table inheritance) so that the change form is rendered read-only, and granting change permission instead removes the read-only display path but widens what that staff user can modify, so scope it deliberately or remove access to those models from the admin entirely until the patch is applied. Review existing staff group and user permissions for custom user models that are exposed in the admin to determine whether any hashes were already retrievable, and treat those hashes as potentially disclosed. Note that Django classifies this issue as low severity, and no public exploit was identified at time of analysis.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Django's admin application renders read-only model fields through display_for_field() in django/contrib/admin/utils.py, which substitutes a masked representation for sensitive values. For the password field it called render_password_as_hash() only when field.name "password" and field.model get_user_model(). Because field.model is the model on which the field was originally declared, that equality check missed two cases: a user model that is not the one designated by the AUTH_USER_MODEL setting, and an AUTH_USER_MODEL that inherits password from a concrete parent via multi-table inheritance, so field.model resolves to the parent rather than the swapped-in user model. The upstream fix replaces the equality test with issubclass(field.model, AbstractBaseUser) or issubclass(get_user_model(), field.model), covering both a non-default user model built on AbstractBaseUser and any ancestor model of the configured user model; the accompanying tests add a ParentUser/ChildUser multi-table inheritance pair and a MinimalPasswordUser to exercise both paths. The weakness maps to CWE-522 (Insufficiently Protected Credentials): the admin UI leaks a credential artifact (the password hash) to a principal that should only see a masked placeholder. Per the Django security policy this is a "low" severity issue; the assessed CVSS:3.1 vector is AV:N/AC:L/PR:H/UI:N/S:U/C:L/I:N/A:N, reflecting limited confidentiality impact reachable only by an already-privileged admin user.
Know when Django 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
CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N
Requires an authenticated staff admin (PR:H) reaching the web admin (AV:N), no user interaction; impact is limited disclosure of password hashes (C:L) with no integrity or availability effect.
Primary rating from Vendor (DSF).
CVSS VectorVendor: DSF
Lifecycle Timeline
2DescriptionCVE.org
An issue was discovered in Django 6.1 before 6.1.3 and 6.0 before 6.0.10. The django.contrib.admin.utils.display_for_field() function did not obfuscate the password field of user models other than AUTH_USER_MODEL, or of an AUTH_USER_MODEL inheriting its password field from a concrete parent model through multi-table inheritance, which allows authenticated staff users with only the view permission on such a model to obtain full password hashes via the read-only change form. Earlier, unsupported Django series (such as 5.1.x, 5.0.x, and 4.2.x) were not evaluated and may also be affected. Django would like to thank Aaron chen for reporting this issue.
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.
The package python/cpython from 0 and before 3.6.13, from 3.7.0 and before 3.7.10, from 3.8.0 and before 3.8.8, from 3.9
In Django 1.10.x before 1.10.8 and 1.11.x before 1.11.5, HTML autoescaping was disabled in a portion of the template for
An issue was discovered in Django 3.2 before 3.2.14 and 4.0 before 4.0.6. Rated critical severity (CVSS 9.8), this vulne
Django 3.1.x before 3.1.13 and 3.2.x before 3.2.5 allows QuerySet.order_by SQL injection if order_by is untrusted input
Django before 1.11.27, 2.x before 2.2.9, and 3.x before 3.0.1 allows account takeover. Rated critical severity (CVSS 9.8
An authentication/authorization bypass in the djust Python live-view framework (versions prior to 1.0.7) lets unauthenti
Unauthenticated arbitrary Python module import in djust before 1.0.7 lets any client that can reach the WebSocket or SSE
Django 1.11 before 1.11.29, 2.2 before 2.2.11, and 3.0 before 3.0.4 allows SQL Injection if untrusted data is used as a
Cross-site scripting (XSS) vulnerability in the dismissChangeRelatedObjectPopup function in contrib/admin/static/admin/j
Forged content modification in django-page-cms through 2.0.13 lets unauthenticated remote attackers exploit five CSRF-ex
Cross-site request forgery in djust's Server-Sent-Events transport affects all versions prior to 1.0.7 and allows a cros
Unauthenticated remote attackers can read live Django view and session state and invoke server-side handlers through dju
EUVD-2026-116022
NVD
CVE.org
GitHub
Exploit-DB