Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSubmit attacker-controlled bytes to GIS spatial lookup
-
ExploitBytes opened as VRT via GDAL in-memory vsimem
-
ExecutionGDAL resolves external raster reference in VRT
-
ImpactDjango 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 |
| 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 |
| Exploit ScenarioDerived | A web application built on django.contrib.gis accepts user-supplied binary data and passes it as a |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
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
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
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
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.
AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
Primary rating from Vendor (DSF).
CVSS VectorVendor: DSF
Lifecycle Timeline
2DescriptionCVE.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
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
Server-Side Request Forgery exploits applications that fetch remote resources based on user-supplied URLs.
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
Same weakness CWE-918 – Server-Side Request Forgery (SSRF)
View allVendor 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 |
EUVD-2026-93388
GHSA-7cqx-w4gp-37v7
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB