{"id":"CVE-2026-113593","kind":"vulnerability","aliases":["CVE-2026-113593"],"related":[],"title":"Django: cache keys collide, letting one request read another's cached private data","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.\nThe `django.middleware.cache.UpdateCacheMiddleware` and the `django.views.decorators.cache.cache_page()` decorator generate identical cache keys for requests that omit a header listed in the response’s `Vary` header and requests that include that header with an empty value, potentially allowing remote attackers to access private data cached for another request.\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 Andrew Gonzalez for reporting this issue.","summary":"Django's cache middleware and cache_page decorator build the same cache key for a request that omits a Vary header and one that sends that header empty. A remote attacker can therefore be served private data cached for a different request.","severity":"low","cvss":3.1,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["django","package","python","self-hosted"],"not_affected_if":["no-page-caching","static-export"],"how_to_check":"- `python -m django --version` on each Django install, compare against the fixed ranges\n- Look for `UpdateCacheMiddleware` or `cache_page` in the project settings and views, and check whether responses vary on a header","fix":"- Django 6.1: upgrade to `6.1.3` or later\n- Django 6.0: upgrade to `6.0.10` or later\n- Django 5.2: upgrade to `5.2.19` or later","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:26+00:00","updated_at":"2026-11-03T16:24:26+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-11-03T16:24:26Z","model":"claude-haiku-5-5","output":{"fix":"- Django 6.1: upgrade to `6.1.3` or later\n- Django 6.0: upgrade to `6.0.10` or later\n- Django 5.2: upgrade to `5.2.19` or later","reach":"internet","title":"Django: cache keys collide, letting one request read another's cached private data","impact":"medium","summary":"Django's cache middleware and cache_page decorator build the same cache key for a request that omits a Vary header and one that sends that header empty. A remote attacker can therefore be served private data cached for a different request.","audience":"businesses","category":"package","nicknames":[],"who_cares":["django","python","self-hosted"],"confidence":0.8,"fix_status":"available","needs_auth":"no","worst_case":"Remote users read private cached responses meant for other users","analyst_note":"","how_to_check":"- `python -m django --version` on each Django install, compare against the fixed ranges\n- Look for `UpdateCacheMiddleware` or `cache_page` in the project settings and views, and check whether responses vary on a header","plain_action":"","needs_analyst":false,"not_affected_if":["no-page-caching","static-export"],"who_is_affected":"Sites built on Django that use the site-wide cache middleware or the cache_page decorator with responses that vary on a request header. Earlier unsupported Django series (5.1, 5.0, 4.2) were not evaluated and may also be affected. Projects that do not use Django's page caching can skip it.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"low"},"cost_usd":0.000701,"input_tokens":4323,"output_tokens":537,"severity_before":"low"},"analyst_status":null,"analyst_note":null,"search":"'-113593':16A,19A '-2026':15A,18A '4.2':141C '5.0':138C '5.1':136C '5.2':81C '5.2.19':83C '6.0':77C '6.0.10':79C '6.1':74C '6.1.3':76C 'access':123C 'affect':150C 'allow':119C 'also':148C 'andrew':156C 'anoth':9A,128C 'attack':56B,121C 'build':34B 'cach':2A,11A,28B,31B,37B,63B,93C,126C 'collid':4A 'cve':14A,17A 'data':13A,62B,125C 'decor':33B,90C 'differ':66B 'discov':71C 'django':1A,20B,26B,73C,132C,151C 'django.middleware.cache.updatecachemiddleware':85C 'django.views.decorators.cache.cache':88C 'earlier':130C 'empti':53B,116C 'evalu':145C 'generat':91C 'gonzalez':157C 'header':46B,52B,100C,107C,113C 'host':25B 'ident':92C 'includ':111C 'issu':69C,161C 'key':3A,38B,94C 'let':5A 'like':153C 'list':101C 'may':147C 'middlewar':29B 'omit':43B,98C 'one':6A,48B 'packag':21B 'page':32B,89C 'potenti':118C 'privat':12A,61B,124C 'python':22B 'read':8A 'remot':55B,120C 'report':159C 'request':7A,41B,67B,96C,109C,129C 'respons':104C 'self':24B 'self-host':23B 'send':50B 'seri':133C 'serv':60B 'thank':155C 'therefor':58B 'unsupport':131C 'valu':117C 'vari':45B,106C 'would':152C 'x':137C,139C,142C","nicknames":[],"mitigations":[],"who_affected":"Sites built on Django that use the site-wide cache middleware or the cache_page decorator with responses that vary on a request header. Earlier unsupported Django series (5.1, 5.0, 4.2) were not evaluated and may also be affected. Projects that do not use Django's page caching can skip it.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"businesses","plain_action":null,"pkeys":[],"ptokens":[],"labels":["django","low","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:P/PR:N/UI:P/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-113593","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-113593","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":58789,"url":"https://github.com/django/django/commit/2006a2b068766bf332f1afcc32b7614d8e5759a2","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":58790,"url":"https://github.com/django/django/commit/55e2e009b4f3996e5c55af7b22a8c41eb826e892","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":58791,"url":"https://github.com/django/django/commit/9007fecd3633cfd90b093ebe106af564347c8aee","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":58792,"url":"https://github.com/django/django/commit/c0b7e5e4e4546e8ddc58262f1945938bb9d9ac2d","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"}