Skip to main content

Django CVE-2026-87975

| EUVDEUVD-2026-93396 MEDIUM
Authorization Bypass Through User-Controlled Key (CWE-639)
2026-10-06 DSF GHSA-x869-hccf-fv7r
5.3
CVSS 4.0 · Vendor: DSF
View

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Object-level authorization, IDOR prevention
Impact

This is a genuinely moderate-severity authorization flaw (CWE-639), not a critical one, and the signals are internally consistent. The CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N = 4.3) indicates a network-reachable but privilege-requiring issue (PR:L) with only low integrity impact and no confidentiality or availability loss, which matches Django's own 'moderate' rating under its security policy. No EPSS score, KEV listing, or public exploit was supplied in the intelligence, so there is no evidence of active or at-scale exploitation - this reads as a defense-in-depth fix rather than an emergency. The real limiting factor understated by the raw CVSS is configuration dependence: exploitation only applies to the narrow case where a model's primary key is a form-editable field (OneToOneField/parent-link, natural key, or UUID), and applications using the default AutoField/BigAutoField PK are entirely unaffected. Net priority: patch during normal maintenance; prioritize sooner only if you operate inline/model formsets over models with editable primary keys exposed to semi-trusted authenticated users.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 06, 2026

Authenticated users who are permitted to submit a Django model formset can delete database rows outside that formset's limiting queryset - without holding any permission on the targeted object - by forging management-form POST data when the affected model's primary key is editable through the form. The flaw is an authorization bypass through a user-controlled key (CWE-639) in django.forms.models.BaseModelFormSet.save_existing_objects(), rated CVSS 4.3 (AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N) with integrity-only impact; it affects Django 6.1 before 6.1.2, 6.0 before 6.0.9, and 5.2 before 5.2.18, while models using the default AutoField/BigAutoField primary key are not affected. No public exploit code identified at time of analysis, and there is no confirmed active exploitation (not in CISA KEV); this is a genuinely moderate-severity authorization flaw and the signals are internally consistent.

RemediationAI

Vendor-released patch: upgrade to Django 6.1.2, 6.0.9, or 5.2.18 respectively for the 6.1, 6.0, and 5.2 branches, as documented in the Django security release announcement (https://www.djangoproject.com/weblog/2026/oct/06/security-releases/) and the per-series release notes; the fix is the change to django/forms/models.py in upstream commits 83cbd21be57483e6b3eb6e4688a561c841aff75e, cce6c57ed30ea83725f9d6abb2fe5ee932bab107, b83ab92bc5474558b083a840ea4628b3261b2cfe, and ff27883ca055aa9ab23015b50674a5b10dfe5a41, so backporting that guard (not obj._is_pk_set() or obj._state.adding) is required for unsupported branches (5.1.x, 5.0.x, 4.2.x) that were not evaluated. If upgrading immediately is not possible, reduce exposure by ensuring the primary key is not an editable form field - exclude it from formset fields or mark it read-only - since formsets over models with a default AutoField/BigAutoField are unaffected, and by restricting which authenticated users may submit such formsets and validating that any submitted primary key values belong to the intended limiting queryset before calling save(); both controls constrain legitimate workflows that rely on client-supplied natural keys and require application-side code changes rather than a configuration switch. Because exploitation already requires an authenticated account with formset-submission rights (CVSS PR:L), tightening that authorization boundary is a viable compensating control, but it does not address the underlying flaw and should be treated as temporary until the patched release is deployed.

Affected VersionsENISA

Django 6.1 <6.1.2
Django 5.2 <5.2.18
Django 6.0 <6.0.9

Affected Packages

euvd django fix: 5.2.18, 6.0.9, 6.1.2

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 model formsets (django.forms.models.BaseModelFormSet and its inlineformset_factory/modelformset_factory derivatives) let developers expose a queryset-limited set of model instances for bulk editing. During save, save_existing_objects() iterates the submitted forms and must decide whether each form's instance belongs to the formset's limiting queryset; instances that were never fetched from that queryset are represented by newly constructed, unsaved objects. The vulnerable logic inferred ownership from the mere presence of a primary key on the instance, but _is_pk_set() can return True on a fresh instance when the primary key is a form field the client controls - for example a OneToOneField or parent link used as the primary key of an inline formset's model, or a natural key/UUID primary key included in fields. Because that forged key value is then trusted as proof of queryset membership, the downstream delete path (triggered by the '-DELETE' management-form field) acts on an out-of-queryset row. This is CWE-639, Authorization Bypass Through User-Controlled Key: an object reference supplied by the user is not re-validated against the caller's authorized set. Notably, models with the default AutoField/BigAutoField primary key are unaffected because such keys are not accepted as editable form fields. The upstream fix tightens the guard to if not obj._is_pk_set() or obj._state.adding: so that any unfetched/new instance is skipped, and regression tests confirm both that out-of-queryset deletion is blocked and that edit_only formsets can no longer be used to create forged instances.

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

Vendor (DSF) PRIMARY 5.3 MEDIUM
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N
SUSE 4.3 MEDIUM
AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N
Red Hat 6.5 MEDIUM

Primary rating from Vendor (DSF).

CVSS VectorVendor: DSF

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
Low
User Interaction
None
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
Low
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

1
CVSS changed
Oct 06, 2026 - 14:22 NVD
4.3 (MEDIUM) 5.3 (MEDIUM)

DescriptionCVE.org

An issue was discovered in Django 6.1 before 6.1.2, 6.0 before 6.0.9, and 5.2 before 5.2.18. django.forms.models.BaseModelFormSet.save_existing_objects() used the presence of a primary key on a submitted form's instance as evidence that the instance belonged to the formset's limiting queryset. An object outside that queryset is represented by a newly constructed instance whose primary key can still be populated from submitted data when the model's primary key is a field accepted by the form, such as a OneToOneField or parent link used as the primary key of an inline formset's model, or a natural or UUID primary key included in the form's fields. This allows an authenticated user permitted to submit such a formset to delete rows outside the limiting queryset, without any permission on the targeted object, via forged management-form data marking an out-of-queryset object for deletion. Models using the default AutoField primary key are not affected. 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 Seonggwon Yoon for reporting this issue.

Threat Intelligence Overview

EPSS Score
0.2%
Top 86% exploitable
Data Quality
5 sources
Confidence: Medium
EUVD NVD CVE.org EPSS Vulnrichment Vendor GitHub

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

26
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +26
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.

More in Django

View all
CVE-2021-23336 MEDIUM POC
5.9 Feb 15

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

CVE-2017-12794 MEDIUM POC
6.1 Sep 07

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

CVE-2022-34265 CRITICAL POC
9.8 Jul 04

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

CVE-2021-35042 CRITICAL POC
9.8 Jul 02

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

CVE-2019-19844 CRITICAL POC
9.8 Dec 18

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

CVE-2026-61594 CRITICAL POC
9.1 Sep 16

An authentication/authorization bypass in the djust Python live-view framework (versions prior to 1.0.7) lets unauthenti

CVE-2026-61599 HIGH POC
8.8 Sep 16

Unauthenticated arbitrary Python module import in djust before 1.0.7 lets any client that can reach the WebSocket or SSE

CVE-2020-9402 HIGH POC
8.8 Mar 05

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

CVE-2016-6186 MEDIUM POC
6.1 Aug 05

Cross-site scripting (XSS) vulnerability in the dismissChangeRelatedObjectPopup function in contrib/admin/static/admin/j

CVE-2026-93456 HIGH POC
8.4 Sep 18

Forged content modification in django-page-cms through 2.0.13 lets unauthenticated remote attackers exploit five CSRF-ex

CVE-2026-61593 HIGH POC
8.1 Sep 16

Cross-site request forgery in djust's Server-Sent-Events transport affects all versions prior to 1.0.7 and allows a cros

CVE-2026-61590 HIGH POC
7.4 Sep 16

Unauthenticated remote attackers can read live Django view and session state and invoke server-side handlers through dju

Vendor StatusVendor

SUSE

Severity: Moderate
Product Status
SUSE Linux Enterprise Module for Package Hub 15 SP7 Affected
SUSE Linux Enterprise Module for Package Hub 15 SP6 Affected
openSUSE Leap 15.6 Affected

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy