{"id":"CVE-2026-114582","kind":"vulnerability","aliases":["CVE-2026-114582"],"related":[],"title":"Django GIS: crafted spatial reference strings can read local files or trigger requests","description":"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.\n`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.\nEarlier, unsupported Django series (such as 5.1.x, 5.0.x, and 4.2.x) were not evaluated and may also be affected.\nDjango would like to thank Adraca for reporting this issue.","summary":"Django's GIS spatial reference parser passes string input to GDAL without restricting file and network access. An attacker who supplies a crafted spatial reference string can make the server fetch URLs or read local files.","severity":"medium","cvss":6.9,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["django","geodjango","package","python","self-hosted"],"not_affected_if":["no-geodjango","trusted-input-only"],"how_to_check":"- Check the installed Django version with `python -m django --version`.\n- Look for use of `django.contrib.gis` with `SpatialReference`, `transform()`, or `srs`/`srid` settings that take user-supplied input.","fix":"- Django `6.1.3` for the 6.1 series\n- Django `6.0.10` for the 6.0 series\n- Django `5.2.19` for the 5.2 series","status":"open","published_at":"2026-11-03T16:17:19+00:00","first_seen_at":"2026-11-03T16:21:42+00:00","triaged_at":"2026-11-03T16:24:01+00:00","updated_at":"2026-11-03T16:24:01+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-11-03T16:24:01Z","model":"claude-haiku-5-5","output":{"fix":"- Django `6.1.3` for the 6.1 series\n- Django `6.0.10` for the 6.0 series\n- Django `5.2.19` for the 5.2 series","reach":"internet","title":"Django GIS: crafted spatial reference strings can read local files or trigger requests","impact":"medium","summary":"Django's GIS spatial reference parser passes string input to GDAL without restricting file and network access. An attacker who supplies a crafted spatial reference string can make the server fetch URLs or read local files.","audience":"businesses","category":"package","nicknames":[],"who_cares":["django","geodjango","python","self-hosted"],"confidence":0.7,"fix_status":"available","needs_auth":"unknown","worst_case":"Server makes outbound requests or reads local files via GDAL","analyst_note":"Confirm whether the NVD entry's 6.9 CVSS and the unsupported-series note hold; check the Django security release notes and the linked patch commits.","how_to_check":"- Check the installed Django version with `python -m django --version`.\n- Look for use of `django.contrib.gis` with `SpatialReference`, `transform()`, or `srs`/`srid` settings that take user-supplied input.","plain_action":"","needs_analyst":true,"not_affected_if":["no-geodjango","trusted-input-only"],"who_is_affected":"Only applications that use Django's GIS module (`django.contrib.gis`) and pass user-controlled strings into spatial reference handling or transform calls are exposed. Sites that do not use GeoDjango, or that only handle trusted spatial data, can skip it. Earlier unsupported series (5.1, 5.0, 4.2) were not evaluated and may also be affected.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"medium"},"cost_usd":0.000744,"input_tokens":4306,"output_tokens":626,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-114582':16A,19A '-2026':15A,18A '4.2':130C '5.0':127C '5.1':125C '5.2':76C '5.2.19':78C '6.0':72C '6.0.10':74C '6.1':69C '6.1.3':71C 'access':43B,96C 'adraca':145C 'affect':139C 'allow':102C 'also':137C 'attack':45B,103C 'craft':3A,49B,115C 'cve':14A,17A 'discov':66C 'django':1A,20B,27B,68C,121C,140C 'django.contrib.gis.gdal.spatialreference':79C 'earlier':119C 'evalu':134C 'fetch':57B 'file':10A,40B,62B,93C,112C 'gdal':37B,91C 'geodjango':21B 'gis':2A,29B 'host':26B 'input':35B,100C 'issu':64C,149C 'like':142C 'local':9A,61B,111C 'make':54B 'may':136C 'method':83C 'network':42B,95C 'packag':22B 'pars':98C 'parser':32B 'pass':33B 'python':23B 'read':8A,60B,113C 'refer':5A,31B,51B,117C 'relat':81C 'report':147C 'request':13A,109C 'restrict':39B,90C 'self':25B 'self-host':24B 'seri':122C 'server':56B,107C 'server-sid':106C 'setter':87C 'side':108C 'spatial':4A,30B,50B,116C 'srid':86C 'srs':85C 'string':6A,34B,52B,99C,118C 'suppli':47B 'thank':144C 'transform':82C 'trigger':12A,105C 'unsupport':120C 'url':58B 'via':114C 'without':38B 'would':141C 'x':126C,128C,131C","nicknames":[],"mitigations":[],"who_affected":"Only applications that use Django's GIS module (`django.contrib.gis`) and pass user-controlled strings into spatial reference handling or transform calls are exposed. Sites that do not use GeoDjango, or that only handle trusted spatial data, can skip it. Earlier unsupported series (5.1, 5.0, 4.2) were not evaluated and may also be affected.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"businesses","plain_action":null,"pkeys":[],"ptokens":[],"labels":["django","geodjango","medium","package","python","selfhosted"],"campaign_type":null,"first_public_at":"2026-11-03T16:17:19+00:00","kev":null,"cvss_vector":"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/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","cvss_by":"6a34fbeb-21d4-45e7-8e0a-62b95bc12c92","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-114582","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-114582","severity":null,"published_at":"2026-11-03T16:17:19+00:00","modified_at":"2026-11-03T16:17:19+00:00","first_seen_at":"2026-11-03T16:21:42+00:00","fetched_at":"2026-11-03T16:21:42+00:00","note":null}],"documents":[{"id":58796,"url":"https://github.com/django/django/commit/1c980729e53ef119d43a01d32ead30116c46cd36","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":58797,"url":"https://github.com/django/django/commit/3a2ec4378b53c7b8ff5283ad7eba624ffa6f2b2f","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":58798,"url":"https://github.com/django/django/commit/8bda4d0db15f28828d8db000287562efae5ce063","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":58799,"url":"https://github.com/django/django/commit/a658355eb51feccbe90b5ca2e3b7f3543cd99e01","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"}],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}