Skip to main content

Django CVE-2026-87890

| EUVDEUVD-2026-93388 MEDIUM
Server-Side Request Forgery (SSRF) (CWE-918)
2026-10-06 DSF GHSA-7cqx-w4gp-37v7
6.9
CVSS 4.0 · Vendor: DSF
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Submit attacker-controlled bytes to GIS spatial lookup
  2. Exploit
    Bytes opened as VRT via GDAL in-memory vsimem
  3. Execution
    GDAL resolves external raster reference in VRT
  4. Impact
    Django process issues outbound network request (SSRF)

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V4 - API and Web Service URL allowlisting, SSRF prevention
MITRE ATT&CK

2 techniques across 2 tactics: Initial Access, Credential Access

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitable only when an application using django.contrib.gis passes attacker-controlled bytes values directly into a spatial lookup against a RasterField without wrapping them in a GDALRaster object; the malicious bytes must form a VRT document referencing an external raster source that GDAL will fetch. Limiting factors: the deployment must use GeoDjango raster fields and spatial lookups (a minority of Django apps), must forward raw untrusted bytes into those lookups, and the impact is confined to attacker-directed outbound network requests (SSRF) by the Django process rather than data compromise or code execution. Bytes representing valid hexadecimal geometries remain legitimately accepted, so generic byte input is not sufficient - the value must be interpretable as an external-referencing raster. This is not reachable in a default Django configuration that does not use GIS raster lookups.

Impact

This is a moderate-severity SSRF (CWE-918) that the vendor itself rates 5.3 and classifies as 'moderate' under Django's security policy. The provided CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N) reports network, low-complexity, unauthenticated access with only limited confidentiality impact and no integrity/availability impact - consistent with a server-side request forgery that coerces outbound network requests rather than code execution or data destruction. No EPSS score was supplied, this CVE is NOT on CISA KEV, and no public exploit code is referenced, so exploitation status is 'no public exploit identified at time of analysis.' The most important nuance is that the CVSS PR:N/AC:L rating overstates real-world reachability: per the vendor advisory the flaw is only exploitable by applications that pass attacker-controlled bytes directly into a GeoDjango spatial lookup against a RasterField - a narrow, non-default usage of django.contrib.gis. Treat this as a genuine but lower-priority patch-management item: raw CVSS looks like an easy unauthenticated network bug, but the practical precondition (GIS raster lookups fed untrusted bytes) sharply limits the affected population. This is a high-framework-prevalence but low-feature-prevalence issue, and it is an incomplete-fix regression of CVE-2026-15307, so organizations that patched the earlier CVE are still exposed.

Exploit ScenarioDerived

A web application built on django.contrib.gis accepts user-supplied binary data and passes it as a bytes value into a spatial lookup against a RasterField. An attacker submits bytes containing a crafted VRT document that references an external (e.g. HTTP) raster source, and when Django prepares the lookup, GDAL opens the in-memory raster and issues a network request to the attacker-chosen URL as the Django process user. No public exploit code is identified at time of analysis.

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

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

Alert me

AnalysisAIv1 – Oct 06, 2026

Server-side request forgery (SSRF) in Django's GeoDjango spatial lookups allows remote unauthenticated attackers to make the Django process issue outbound network requests when an application passes attacker-controlled bytes raster values directly into a lookup against a RasterField. Affected versions are Django 6.1 before 6.1.2, 6.0 before 6.0.9, and 5.2 before 5.2.18; older unsupported series (5.1.x, 5.0.x, 4.2.x) were not evaluated and may also be affected. The flaw is an incomplete fix for CVE-2026-15307, and exploitation requires a deployment that uses GeoDjango raster fields and forwards raw untrusted bytes into spatial lookups - not a default Django configuration. There is no public exploit identified at time of analysis and the issue is not in CISA KEV; Django rates it 'moderate' severity (CVSS 5.3), with impact limited to attacker-directed outbound requests rather than data compromise or code execution.

RemediationAI

Vendor-released patch: upgrade to Django 6.1.2, 6.0.9, or 5.2.18 (whichever matches your release series); the corresponding upstream commits are ebcb13b327301f28cbc6cd5e4988a719f00575aa, 4e77ef1e69c94780006b82795aa7db101996c3af, a2347fe8234a1831d56c875acc0ea51e0742957c, and dd0558d1617619e0d66163675ef02135d0f54e5f, with advisories at https://docs.djangoproject.com/en/dev/releases/security/ and https://www.djangoproject.com/weblog/2026/oct/06/security-releases/. Be aware this is a backward-incompatible change: after upgrading, raster values supplied as bytes must be wrapped in GDALRaster before being used in spatial lookups, though byte values representing valid hexadecimal geometries remain accepted - so code that legitimately passes hex-encoded geometry bytes will keep working. If you cannot upgrade immediately, the most effective compensating control is to stop passing untrusted bytes into spatial lookups entirely: validate and reject non-hexadecimal byte input at the application boundary, and only wrap values in GDALRaster when the input is trusted, since wrapping untrusted data does not make it safe (the fix's own documentation warns that GDAL memory-based handling does not neutralize VRT references). In addition, constrain outbound network egress from the Django/GDAL process (deny egress to arbitrary hosts, restrict to required raster origins) to blunt SSRF impact, accepting that this may break legitimate remote raster fetching; disabling GDAL virtual filesystem drivers is not practical without breaking GIS functionality. Note that a fix for unsupported branches (5.1.x, 5.0.x, 4.2.x) has not been evaluated by the vendor, so those deployments should migrate to a supported release.

Affected VersionsENISA

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

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

The vulnerability lies in Django's GIS layer (django.contrib.gis), which wraps the GDAL/OGR geospatial library. Spatial lookups on raster fields previously rejected types such as dict, str, and pathlib.Path because those could trigger file writes or external fetches, but explicitly permitted bytes on the assumption that bytes are handled safely through GDAL's memory-based virtual filesystem (/vsimem). That assumption was wrong: a bytes value can contain a VRT (GDAL Virtual Raster) XML document whose SourceFilename points at a remote raster, causing GDAL to dereference the external source and issue network requests as the Django process user during lookup preparation. The root cause is CWE-918 (Server-Side Request Forgery), and it is a direct regression/omission from the earlier CVE-2026-15307 hardening. The upstream fixes (commits ebcb13b3, 4e77ef1e, a2347fe8, dd0558d1) extend the deny list in django/contrib/gis/gdal/raster/source.py's check_raster_lookup_value() to include bytes alongside dict and str, add the same bytes check to GDALRasterField.get_prep_value() in django/contrib/gis/db/models/fields.py, and update the GIS documentation to state that bytes raster values must now be wrapped in GDALRaster before use in spatial lookups. The patch also truncates oversized value representations (4 KB cap) in error messages to avoid log-flooding from large attacker-supplied inputs, and adds a documentation warning that GDAL's in-memory filesystem does not make untrusted raster data safe.

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 6.9 MEDIUM
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:L/SA:N
vuln.today AI 5.3 MEDIUM

Network-reachable with no Django-side auth or privileges (PR:N), SSRF yields limited confidentiality via coerced requests (C:L) with no integrity/availability impact; aligns with vendor rating.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N
SUSE 5.3 MEDIUM
AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
Red Hat 5.3 MEDIUM

Primary rating from Vendor (DSF).

CVSS VectorVendor: DSF

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

Lifecycle Timeline

2
CVSS changed
Oct 06, 2026 - 14:22 NVD
5.3 (MEDIUM) 6.9 (MEDIUM)
CVE Published
Oct 06, 2026 - 13:35 cve.org
MEDIUM 5.3

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. An incomplete fix for CVE-2026-15307 in Django spatial lookups allows an attacker who can supply bytes values to cause the Django process to make network requests via a crafted VRT document referencing an external raster source. 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 sicksec for reporting this issue.

Threat Intelligence Overview

EPSS Score
0.3%
Top 81% exploitable
Prevalence
High
Django is a widely deployed enterprise web framework; GIS raster feature is niche
Data Quality
5 sources
Confidence: Medium
EUVD NVD CVE.org EPSS Vulnrichment Vendor GitHub VulDB

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.3%
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
Yes
Human Impact· derived
High
Technical Impact
Partial

Priority Score

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

Attack Technique

Server-Side Request Forgery exploits applications that fetch remote resources based on user-supplied URLs.

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