Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessReach endpoint accepting SRS string
-
DeliverySubmit reference embedding URL or file path
-
ExploitGDAL resolves input without restriction
-
ExecutionServer fetches URL or reads local file
-
ImpactExfiltrate file contents or probe internal services
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 | Exploitation requires that the application pass attacker-influenced string input into django.contrib.gis.gdal.SpatialReference, GEOSGeometry.transform(), OGRGeometry.transform()/srs setter, GDALRaster.transform(), or the GDALRaster srs/srid setters - i.e. GeoDjango must be in use with a code path that forwards untrusted SRS strings to GDAL. Limiting factors: the vulnerable surface is confined to applications that expose these GIS APIs to external input (not a default Django site), so an app that never feeds user data to SpatialReference is unaffected. Even after patching, full file/network blocking is only enforced on GDAL 3.9 or higher; on older GDAL the fix blocks the 'dict:'/'esri::dict:' parser bypass but cannot otherwise restrict resolution, and Django only emits a system-check warning. Impact is read-oriented (SSRF to internal/attacker hosts and local file reads), with no integrity or availability effect. |
| Impact | This is a moderate, condition-dependent SSRF/local-file-read (CWE-918) in Django's GeoDjango stack, not a high-urgency mass-exploitation issue. The vendor CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N) with only low confidentiality impact (VC:L) and no integrity or availability impact yields 6.9 (Medium), and this matches the mechanism: attacker-supplied strings reach GDAL, which by default resolves URLs and reads files, so the payoff is SSRF and file-content disclosure rather than code execution. No EPSS score, KEV listing, or PoC/exploit reference was provided - the only references are the vendor advisory and four patch commits - so exploitation signals are absent, consistent with the vuln.today 'this_month' (not act_now/emergency) decision label. The network vector and PR:N would normally suggest easy remote reach, but real-world exploitability is gated by an application-design precondition absent from the raw vector: the app must actually pass untrusted input into SpatialReference/transform()/srs/srid. Treat this as a real but prioritizable patch item, not an emergency; EPSS and SSVC-automatable signals were not supplied and cannot be assessed. |
| Exploit ScenarioDerived | A web application accepts a user-controlled coordinate-system identifier and passes it to django.contrib.gis.gdal.SpatialReference (or a transform()/srs/srid setter). An attacker submits a crafted spatial reference string containing a URL or local file path; GDAL (below 3.9, or before the Django fix) resolves it, causing the server to issue an outbound request to an attacker or internal host, or to read a local file. No public exploit code is identified at time of analysis. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Nov 03, 2026
Server-side request forgery and local file disclosure in Django's GeoDjango module affect 5.2 before 5.2.19, 6.0 before 6.0.10, and 6.1 before 6.1.3, where SpatialReference, the transform() methods on GEOSGeometry/OGRGeometry/GDALRaster, and the OGRGeometry.srs and GDALRaster.srs/srid setters forward attacker-influenced strings to GDAL without restricting its file and network access, letting unauthenticated remote attackers on an affected code path trigger outbound requests or read local files. Exposure is conditional: only applications that pass untrusted spatial-reference strings into these GIS APIs are reachable, and even after patching the file/network blocking is only enforced on GDAL 3.9 or newer. No public exploit code or active exploitation was identified at time of analysis; Django has released fixes in 6.1.3, 6.0.10, and 5.2.19.
RemediationAI
Vendor-released patches are available: upgrade to Django 6.1.3, 6.0.10, or 5.2.19 as appropriate for your branch (advisory: https://www.djangoproject.com/weblog/2026/nov/03/security-releases/). Because the mitigation depends on GDAL, also upgrade GDAL to 3.9 or higher; on older GDAL the patch only blocks the 'dict:'/'esri::dict:' parser bypass and Django merely emits the gis.W001 system-check warning that malicious spatial references remain resolvable. Until both upgrades are in place, apply the vendor-documented workaround for the affected API surface: compare any user-supplied spatial-reference string against a strict allow list first, or accept only integer SRID/EPSG identifiers - the trade-off is that legitimate free-form WKT or PROJ input from users will be rejected. Run Django's system checks in CI or at deploy time to detect the gis.W001 condition on hosts still running GDAL below 3.9.
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 flaw is CWE-918 (server-side request forgery) rooted in GeoDjango's GDAL bindings. django.contrib.gis.gdal.srs passed user strings to GDAL's OSRSetFromUserInput, which by design resolves URLs and reads files when parsing a spatial reference (WKT, PROJ strings, EPSG codes, and similar). Django never documented that behavior or constrained it. The upstream fix adds a ctypes papsz option array containing ALLOW_FILE_ACCESS=NO and ALLOW_NETWORK_ACCESS=NO and routes input through OSRSetFromUserInputEx instead of OSRSetFromUserInput, but that extended entry point exists only in GDAL 3.9 and later; on older GDAL the code falls back to the original call. Because GDAL's dictionary parser bypasses those restrictions, the patch also rejects any input that, after whitespace stripping and removal of an 'esri::' prefix, begins with 'dict:', raising GDALException. A new system check, gis.W001 in the new 'gis' checks tag, warns when the installed GDAL is older than 3.9 and therefore cannot enforce blocking. The independent assessment scores this CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - unauthenticated network reachability with confidentiality-only impact.
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:N/SA:N
Network-reachable SSRF/file read with no authentication required by the flaw itself (PR:N) and low confidentiality-only impact; no integrity or availability effect, scope unchanged.
Primary rating from Vendor (DSF).
CVSS VectorVendor: DSF
Lifecycle Timeline
2DescriptionCVE.org
An issue was discovered in Django 6.1 before 6.1.3, 6.0 before 6.0.10, and 5.2 before 5.2.19. django.contrib.gis.gdal.SpatialReference (and related transform() methods and srs/srid setters) do not restrict GDAL’s file and network access when parsing string input, which allows attackers to trigger server-side requests or local file reads via crafted spatial reference strings. 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 Adraca 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
EUVD-2026-116023
NVD
CVE.org
GitHub
Exploit-DB