{"title":"Django 6.0.4 release notes","version":"dev","locale":"en","docname":"releases/6.0.4","url":"/en/dev/releases/6.0.4/","canonical":"https://djangodocs.dev/en/dev/releases/6.0.4/","summary":"Django 6.0.4 fixes one security issue with severity “moderate”, four security issues with severity “low”, and several bugs in 6.0.3.","html":"<h1>Django 6.0.4 release notes<a class=\"heading-anchor\" href=\"#django-6-0-4-release-notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p><em>April 7, 2026</em></p>\n<p>Django 6.0.4 fixes one security issue with severity “moderate”, four security\nissues with severity “low”, and several bugs in 6.0.3. Also, the latest string\ntranslations from Transifex are incorporated.</p>\n<section id=\"cve-2026-3902-asgi-header-spoofing-via-underscore-hyphen-conflation\">\n<h2>CVE-2026-3902: ASGI header spoofing via underscore/hyphen conflation<a class=\"heading-anchor\" href=\"#cve-2026-3902-asgi-header-spoofing-via-underscore-hyphen-conflation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><code class=\"docutils literal notranslate\">ASGIRequest</code> normalizes header names following WSGI conventions, mapping\nhyphens to underscores. As a result, even in configurations where reverse\nproxies carefully strip security-sensitive headers named with hyphens, such a\nheader could be spoofed by supplying a header named with underscores.</p>\n<p>Under WSGI, it is the responsibility of the server or proxy to avoid ambiguous\nmappings. (Django’s <a class=\"reference internal\" href=\"/en/dev/ref/django-admin/#django-admin-runserver\"><code class=\"xref std std-djadmin docutils literal notranslate\">runserver</code></a> was patched in <span class=\"target\" id=\"index-0\"></span><a class=\"cve reference external\" href=\"https://www.cve.org/CVERecord?id=CVE-2015-0219\"><strong>CVE 2015-0219</strong></a>.) But\nunder ASGI, there is not the same uniform expectation, even if many proxies\nprotect against this under default configuration (including <code class=\"docutils literal notranslate\">nginx</code> via\n<code class=\"docutils literal notranslate\">underscores_in_headers off;</code>).</p>\n<p>Headers containing underscores are now ignored by <code class=\"docutils literal notranslate\">ASGIRequest</code>, matching the\nbehavior of <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/daphne/\">Daphne</a>, the reference server for ASGI.</p>\n<p>This issue has severity “low” according to the <a class=\"reference internal\" href=\"/en/dev/internals/security/#severity-levels\"><span class=\"std std-ref\">Django security policy</span></a>.</p>\n</section>\n<section id=\"cve-2026-4277-privilege-abuse-in-genericinlinemodeladmin\">\n<h2>CVE-2026-4277: Privilege abuse in <code class=\"docutils literal notranslate\">GenericInlineModelAdmin</code><a class=\"heading-anchor\" href=\"#cve-2026-4277-privilege-abuse-in-genericinlinemodeladmin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Add permissions on inline model instances were not validated on submission of\nforged <code class=\"docutils literal notranslate\">POST</code> data in\n<a class=\"reference internal\" href=\"/en/dev/ref/contrib/contenttypes/#django.contrib.contenttypes.admin.GenericInlineModelAdmin\" title=\"django.contrib.contenttypes.admin.GenericInlineModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">GenericInlineModelAdmin</code></a>.</p>\n<p>This issue has severity “low” according to the <a class=\"reference internal\" href=\"/en/dev/internals/security/#severity-levels\"><span class=\"std std-ref\">Django security policy</span></a>.</p>\n</section>\n<section id=\"cve-2026-4292-privilege-abuse-in-modeladmin-list-editable\">\n<h2>CVE-2026-4292: Privilege abuse in <code class=\"docutils literal notranslate\">ModelAdmin.list_editable</code><a class=\"heading-anchor\" href=\"#cve-2026-4292-privilege-abuse-in-modeladmin-list-editable\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Admin changelist forms using\n<a class=\"reference internal\" href=\"/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_editable\" title=\"django.contrib.admin.ModelAdmin.list_editable\"><code class=\"xref py py-attr docutils literal notranslate\">list_editable</code></a> incorrectly allowed new\ninstances to be created via forged <code class=\"docutils literal notranslate\">POST</code> data.</p>\n<p>This issue has severity “low” according to the <a class=\"reference internal\" href=\"/en/dev/internals/security/#severity-levels\"><span class=\"std std-ref\">Django security policy</span></a>.</p>\n</section>\n<section id=\"cve-2026-33033-potential-denial-of-service-vulnerability-in-multipartparser-via-base64-encoded-file-upload\">\n<h2>CVE-2026-33033: Potential denial-of-service vulnerability in <code class=\"docutils literal notranslate\">MultiPartParser</code> via base64-encoded file upload<a class=\"heading-anchor\" href=\"#cve-2026-33033-potential-denial-of-service-vulnerability-in-multipartparser-via-base64-encoded-file-upload\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>When using <code class=\"docutils literal notranslate\">django.http.multipartparser.MultiPartParser</code>, multipart uploads\nwith <code class=\"docutils literal notranslate\">Content-Transfer-Encoding: base64</code> that include excessive whitespace\nmay trigger repeated memory copying, potentially degrading performance.</p>\n<p>This issue has severity “moderate” according to the <a class=\"reference internal\" href=\"/en/dev/internals/security/#severity-levels\"><span class=\"std std-ref\">Django security\npolicy</span></a>.</p>\n</section>\n<section id=\"cve-2026-33034-potential-denial-of-service-vulnerability-in-asgi-requests-via-memory-upload-limit-bypass\">\n<h2>CVE-2026-33034: Potential denial-of-service vulnerability in ASGI requests via memory upload limit bypass<a class=\"heading-anchor\" href=\"#cve-2026-33034-potential-denial-of-service-vulnerability-in-asgi-requests-via-memory-upload-limit-bypass\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>ASGI requests with a missing or understated <code class=\"docutils literal notranslate\">Content-Length</code> header could\nbypass the <a class=\"reference internal\" href=\"/en/dev/ref/settings/#std-setting-DATA_UPLOAD_MAX_MEMORY_SIZE\"><code class=\"xref std std-setting docutils literal notranslate\">DATA_UPLOAD_MAX_MEMORY_SIZE</code></a> limit when reading\n<code class=\"docutils literal notranslate\">HttpRequest.body</code>, potentially loading an unbounded request body into\nmemory and causing service degradation.</p>\n<p>This issue has severity “low” according to the <a class=\"reference internal\" href=\"/en/dev/internals/security/#severity-levels\"><span class=\"std std-ref\">Django security policy</span></a>.</p>\n</section>\n<section id=\"bugfixes\">\n<h2>Bugfixes<a class=\"heading-anchor\" href=\"#bugfixes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<ul class=\"simple\">\n<li><p>Fixed a regression in Django 6.0 where <a class=\"reference internal\" href=\"/en/dev/topics/auth/default/#django.contrib.auth.alogin\" title=\"django.contrib.auth.alogin\"><code class=\"xref py py-func docutils literal notranslate\">alogin()</code></a>\nand <a class=\"reference internal\" href=\"/en/dev/topics/auth/default/#django.contrib.auth.alogout\" title=\"django.contrib.auth.alogout\"><code class=\"xref py py-func docutils literal notranslate\">alogout()</code></a> did not respectively set or clear\n<code class=\"docutils literal notranslate\">request.user</code> if it had already been materialized (e.g., by sync\nmiddleware) (<a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/37017\">#37017</a>).</p></li>\n<li><p>Fixed a regression in Django 6.0 in admin forms where\n<code class=\"docutils literal notranslate\">RelatedFieldWidgetWrapper</code> incorrectly wrapped all widgets in a\n<code class=\"docutils literal notranslate\">&lt;fieldset&gt;</code> (<a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/36949\">#36949</a>).</p></li>\n<li><p>Fixed a bug in Django 6.0 where the <code class=\"docutils literal notranslate\">fields.E348</code> system check did not\ndetect name clashes between model managers and\n<a class=\"reference internal\" href=\"/en/dev/ref/models/fields/#django.db.models.ForeignKey.related_name\" title=\"django.db.models.ForeignKey.related_name\"><code class=\"xref py py-attr docutils literal notranslate\">related_name</code></a>s for non-self-referential\nrelationships (<a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/36973\">#36973</a>).</p></li>\n</ul>\n</section>","rootId":"django-6-0-4-release-notes","toc":[{"title":"CVE-2026-3902: ASGI header spoofing via underscore/hyphen conflation","anchor":"cve-2026-3902-asgi-header-spoofing-via-underscore-hyphen-conflation","children":[]},{"title":"CVE-2026-4277: Privilege abuse in GenericInlineModelAdmin","anchor":"cve-2026-4277-privilege-abuse-in-genericinlinemodeladmin","children":[]},{"title":"CVE-2026-4292: Privilege abuse in ModelAdmin.list_editable","anchor":"cve-2026-4292-privilege-abuse-in-modeladmin-list-editable","children":[]},{"title":"CVE-2026-33033: Potential denial-of-service vulnerability in MultiPartParser via base64-encoded file upload","anchor":"cve-2026-33033-potential-denial-of-service-vulnerability-in-multipartparser-via-base64-encoded-file-upload","children":[]},{"title":"CVE-2026-33034: Potential denial-of-service vulnerability in ASGI requests via memory upload limit bypass","anchor":"cve-2026-33034-potential-denial-of-service-vulnerability-in-asgi-requests-via-memory-upload-limit-bypass","children":[]},{"title":"Bugfixes","anchor":"bugfixes","children":[]}],"breadcrumbs":[{"docname":"releases/index","title":"Release notes","url":"/en/dev/releases/"}],"prev":{"docname":"releases/6.0.5","title":"Django 6.0.5 release notes","url":"/en/dev/releases/6.0.5/"},"next":{"docname":"releases/6.0.3","title":"Django 6.0.3 release notes","url":"/en/dev/releases/6.0.3/"},"formats":{"html":"/en/dev/releases/6.0.4/","markdown":"/en/dev/releases/6.0.4.md","json":"/en/dev/releases/6.0.4.json"},"source":"https://github.com/django/django/blob/main/docs/releases/6.0.4.txt","official":"https://docs.djangoproject.com/en/dev/releases/6.0.4/","inVersions":["dev","6.1","6.0"],"inLocales":["en"]}