Django: server-side request forgery via GeoJSON geometries
Medium
Time
—
Cost
—
Product
Django
Affected versions
Before 6.1.3, 6.0.10, and 5.2.19
Class
Server-side request forgery CWE-918
Severity
Medium
Summary
Overview
GeoJSON geometries can carry a crs member that names a coordinate reference system. GDAL resolves CRS URLs found there.
Creating a geometry from user input could therefore make the Django process issue network requests or read files. Django rates the issue moderate under its security policy.
The issue is fixed in Django 6.1.3, 6.0.10, and 5.2.19, released on November 3, 2026.
Sequence
Attack path
01
Step 1
Supply a GeoJSON geometry whose crs member names a URL.
02
Step 2
Pass that geometry into code that creates a Django geometry from user input.
03
Step 3
GDAL resolves the CRS URL during geometry creation.
04
Step 4
The Django process issues a network request or reads a file named by that resolution.
#poc
Proof of concept
On affected releases, a geometry created from user input could resolve a CRS URL through GDAL. The same input on 6.1.3, 6.0.10, and 5.2.19 does not.
We will update this post at a later time to include additional proof of concept details. Operators should treat geometry creation from user input on affected releases as in scope and upgrade.
#exploit
Exploitation
The primitive is a network request or file read issued by the Django process during geometry creation. It requires code that creates geometries from user input.
Reach is limited to network requests and file reads by the Django process during geometry creation. That reach does not by itself execute caller-supplied code in the process.
We will update this post at a later time to include additional exploitation details.
#details
Technical details
Root cause: GDAL resolves CRS URLs in the crs member of GeoJSON geometries during geometry creation.
Affected configuration: Django releases before the 6.1.3, 6.0.10, and 5.2.19 fixes, where geometries are created from user input.
The fix in 6.1.3, 6.0.10, and 5.2.19 stops that CRS resolution from reaching the network or the filesystem.
Remediation
Fixed in Django 6.1.3, 6.0.10, and 5.2.19.
Upgrade to Django 6.1.3, 6.0.10, or 5.2.19 or later on your release line.
Until you can upgrade, do not create geometries from untrusted GeoJSON, and limit outbound network access from the Django process.
How Submersion found it
01
Step 1
We will update this post at a later time to include proof of concept and exploitation details.
Basin was pointed at Django. It received the application and a running environment. It did not receive a vulnerability description, an exploit, a patch diff, or a prior disclosure.