<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Vulnerability Spoiler Alert - django/django</title>
    <link>https://spaceraccoon.github.io/vulnerability-spoiler-alert</link>
    <description>Vulnerability alerts for django/django</description>
    <language>en-us</language>
    <lastBuildDate>Tue, 01 Sep 2026 14:23:07 GMT</lastBuildDate>
    <atom:link href="https://spaceraccoon.github.io/vulnerability-spoiler-alert/feed/django-django.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>[CVE-2026-15920] [MEDIUM] Broken Access Control / Improper Authorization in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/378</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/378</guid>
      <pubDate>Thu, 06 Aug 2026 09:49:39 GMT</pubDate>
      <description>When using Django admin&apos;s &apos;save as new&apos; functionality, inline formsets for related models where the user lacks add permission (but has view permission) could be rendered as editable/populated forms upon a validation error re-render, because the total/initial form counts were not cleared before instantiating the formset. This allowed a user without add permission on the inline model to potentially submit and persist changes to inline objects that they should only be able to view, effectively bypassing the permission check enforced elsewhere in the admin.</description>
      <category>medium</category>
      <category>confirmed</category>
      <category>CVE-2026-15920</category>
    </item>
    <item>
      <title>[CVE-2026-15307] [HIGH] Server-Side Request Forgery / Arbitrary File Write (SSRF/File Write via unsanitized raster input) in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/366</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/366</guid>
      <pubDate>Tue, 04 Aug 2026 16:01:44 GMT</pubDate>
      <description>GeoDjango spatial lookups optimistically parsed lookup values as GDALRaster before falling back to GEOSGeometry parsing. Because GDALRaster&apos;s constructor could interact with GDAL virtual filesystem drivers regardless of the write=False flag, a malicious string or dict passed into a spatial lookup (e.g., via the Django admin&apos;s changelist filtering, which allows staff users to submit arbitrary lookups) could cause the server to write files to disk or issue network requests to attacker-controlled URLs. The patch blocks strings and dicts from being treated as raster input in lookup contexts unless explicitly wrapped in GDALRaster, closing the SSRF/file-write vector while preserving normal model field assignment behavior.

Patch landed 6 hours 41 minutes before CVE-2026-15307 was published.</description>
      <category>high</category>
      <category>confirmed</category>
      <category>CVE-2026-15307</category>
    </item>
    <item>
      <title>[CVE-2026-15337] [LOW] Denial of Service (Memory Exhaustion via Unbounded Cache Key Size) in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/365</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/365</guid>
      <pubDate>Tue, 04 Aug 2026 16:01:13 GMT</pubDate>
      <description>The check_for_language() function used an lru_cache with maxsize=1000, but did not limit the length of the lang_code strings used as cache keys. An attacker could submit many distinct, very long language codes (e.g., via the set_language() view&apos;s POST data), causing up to 1000 large strings to be retained in memory as cache keys, consuming excessive process memory. The patch adds a length check (max 500 characters) before the cached lookup, so long codes are rejected without being cached.

Patch landed 6 hours 41 minutes before CVE-2026-15337 was published.</description>
      <category>low</category>
      <category>confirmed</category>
      <category>CVE-2026-15337</category>
    </item>
    <item>
      <title>[CVE-2026-15830] [HIGH] Denial of Service (Uncontrolled Resource Consumption / Stack Exhaustion) in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/364</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/364</guid>
      <pubDate>Tue, 04 Aug 2026 16:01:02 GMT</pubDate>
      <description>Before this patch, GEOSGeometry parsing (from WKT or WKB) had no limit on the depth or number of nested GEOMETRYCOLLECTION elements. Because GEOS parses these recursively, a maliciously crafted input with deeply nested geometry collections could exhaust the stack or memory and trigger a fatal error/crash in GEOS, effectively causing a denial of service in any application that accepts user-supplied geometry data (e.g., via GeometryField model/form fields). The patch introduces a `max_geom_collections` parameter, forwarded through GEOSGeometry, model fields, and form fields, to cap the depth (for WKT) or total count (for WKB) of nested collections before they reach the GEOS library.

Patch landed 6 hours 41 minutes before CVE-2026-15830 was published.</description>
      <category>high</category>
      <category>confirmed</category>
      <category>CVE-2026-15830</category>
    </item>
    <item>
      <title>[CVE-2026-15920] [MEDIUM] Cross-Site Scripting (XSS) in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/363</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/363</guid>
      <pubDate>Tue, 04 Aug 2026 16:00:47 GMT</pubDate>
      <description>The Django admin&apos;s display_for_field() rendered URLField values as clickable &amp;lt;a href&amp;gt; links without validating the URL scheme. A stored value using a dangerous scheme like javascript: or data: would be rendered as a clickable link, and clicking it would execute arbitrary script in the authenticated admin session (staff user context).

Patch landed 6 hours 41 minutes before CVE-2026-15920 was published.</description>
      <category>medium</category>
      <category>confirmed</category>
      <category>CVE-2026-15920</category>
    </item>
    <item>
      <title>[CVE-2026-15307] [MEDIUM] Code/Output Injection (CRLF injection into generated Python source) in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/349</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/349</guid>
      <pubDate>Thu, 23 Jul 2026 13:30:02 GMT</pubDate>
      <description>inspectdb generates a Python models.py file by writing raw table names and exception messages directly into comment lines without escaping. If a table name or an introspection error message contains newline characters, the unescaped output breaks out of the &apos;#&apos; comment prefix and injects arbitrary attacker-controlled lines into the generated source file, which is later imported/executed as Python code.

Patch landed 12 days 5 hours 36 minutes before CVE-2026-15307 was published.</description>
      <category>medium</category>
      <category>confirmed</category>
      <category>CVE-2026-15307</category>
    </item>
    <item>
      <title>[CVE-2026-53878] [LOW] Improper Input Validation (CRLF/Header Injection) in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/315</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/315</guid>
      <pubDate>Tue, 07 Jul 2026 14:17:36 GMT</pubDate>
      <description>DomainNameValidator&apos;s regex used `$` instead of `\\Z` as the end anchor, which in Python regex matches before a trailing newline. This allowed strings like &apos;example.com\\n&apos; to pass validation as a valid domain name, potentially enabling HTTP header/CRLF injection if such validated values were later embedded into HTTP headers or other newline-sensitive contexts outside Django&apos;s form fields.

Patch landed 12 hours 2 minutes before CVE-2026-53878 was published.</description>
      <category>low</category>
      <category>confirmed</category>
      <category>CVE-2026-53878</category>
    </item>
    <item>
      <title>[CVE-2026-53877] [LOW] Heap Buffer Over-read in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/316</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/316</guid>
      <pubDate>Tue, 07 Jul 2026 14:17:48 GMT</pubDate>
      <description>When constructing a GDALRaster from a bytes object, the code used sys.getsizeof() to determine the buffer size, which includes CPython&apos;s PyBytesObject overhead (~32-49 bytes) rather than the actual data length. This caused GDAL to read past the end of the allocated buffer into adjacent heap memory when accessing the vsi_buffer property, potentially disclosing sensitive heap memory contents or causing a crash.

Patch landed 12 hours 2 minutes before CVE-2026-53877 was published.</description>
      <category>low</category>
      <category>confirmed</category>
      <category>CVE-2026-53877</category>
    </item>
    <item>
      <title>[CVE-2026-48588] [LOW] Sensitive Data Exposure / Cache Poisoning (CWE-524) in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/317</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/317</guid>
      <pubDate>Tue, 07 Jul 2026 14:18:10 GMT</pubDate>
      <description>UpdateCacheMiddleware only skipped caching Set-Cookie responses varying on Cookie when the incoming request had zero cookies, so a request carrying any unrelated cookie (e.g., a language preference) bypassed the protection. This allowed a response that issues a new session or CSRF cookie to be stored in Django&apos;s shared cache and served to other users, leaking session cookies via a shared cache hit. The patch removes the &apos;no cookies at all&apos; condition, always skipping caching when a response sets a cookie and varies on Cookie.

Patch landed 12 hours 2 minutes before CVE-2026-48588 was published.</description>
      <category>low</category>
      <category>confirmed</category>
      <category>CVE-2026-48588</category>
    </item>
    <item>
      <title>[CVE-2026-53878] [MEDIUM] Cache Key Collision in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/298</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/298</guid>
      <pubDate>Wed, 24 Jun 2026 14:53:10 GMT</pubDate>
      <description>The `_generate_cache_key` function in Django&apos;s cache framework concatenated HTTP header values without any delimiter when building the cache key hash. This allowed two requests with different header values to produce the same cache key if the values concatenated to the same string (e.g., headers &apos;EU&apos; and &apos;&apos; vs &apos;&apos; and &apos;EU&apos;). The patch fixes this by using netstring encoding (length-prefixed with trailing comma) for each header value, ensuring unique encodings for distinct value combinations.

Patch landed 13 days 1 hour 32 minutes before CVE-2026-53878 was published.</description>
      <category>medium</category>
      <category>confirmed</category>
      <category>CVE-2026-53878</category>
    </item>
    <item>
      <title>[MEDIUM] Cache Key Collision in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/297</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/297</guid>
      <pubDate>Wed, 24 Jun 2026 14:52:53 GMT</pubDate>
      <description>The template fragment cache key generation used a simple `:` delimiter between vary-on arguments without encoding the length of each argument, allowing cache key collisions between different argument combinations. For example, vary_on=\[&apos;a:b&apos;,&apos;c&apos;\] and vary_on=\[&apos;a&apos;,&apos;b:c&apos;\] would produce the same MD5 hash, potentially causing one user&apos;s cached content to be served to another user with different cache parameters.</description>
      <category>medium</category>
      <category>verified</category>
      
    </item>
    <item>
      <title>[CVE-2026-35193] [MEDIUM] Cache Poisoning / Improper Cache Storage in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/289</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/289</guid>
      <pubDate>Fri, 19 Jun 2026 17:01:48 GMT</pubDate>
      <description>Django&apos;s UpdateCacheMiddleware failed to recognize qualified Cache-Control directives (e.g., `Cache-Control: private=&quot;Set-Cookie&quot;`) as restrictions on caching. The code used exact token matching against the full directive string, so `private=&quot;Set-Cookie&quot;` would not match the string `private`, causing the response to be stored in a shared cache even though it was marked private. The patch introduces a `split_directive_names()` helper that strips the qualified value portion before comparison.</description>
      <category>medium</category>
      <category>confirmed</category>
      <category>CVE-2026-35193</category>
    </item>
    <item>
      <title>[CVE-2026-15307] [MEDIUM] Information Disclosure / BCC Header Leak in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/265</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/265</guid>
      <pubDate>Tue, 16 Jun 2026 23:27:58 GMT</pubDate>
      <description>Before the patch, passing a &apos;Bcc&apos; key in the `extra_headers` argument of `EmailMessage` would cause the BCC addresses to be serialized directly into the email message headers, making them visible to all recipients. The `from`, `to`, `cc`, and `reply-to` headers were explicitly excluded from being written via `extra_headers`, but `bcc` was not, allowing it to leak into the message. The patch raises a `ValueError` when `Bcc` is found in `extra_headers`, directing users to use the `bcc` argument instead.

Patch landed 48 days 19 hours 35 minutes before CVE-2026-15307 was published.</description>
      <category>medium</category>
      <category>confirmed</category>
      <category>CVE-2026-15307</category>
    </item>
    <item>
      <title>[HIGH] Path Traversal in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/254</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/254</guid>
      <pubDate>Tue, 09 Jun 2026 16:38:30 GMT</pubDate>
      <description>When Django&apos;s `startproject` or `startapp` command downloads a template archive from a URL, the Content-Disposition header&apos;s filename was used directly with `os.path.join()` to construct a path within a temp directory. An attacker-controlled server could return a filename like `/nonexistent/../../etc/passwd` or an absolute path, causing the file to be written outside the intended temporary directory. The fix replaces `os.path.join()` with `safe_join()`, which raises `SuspiciousFileOperation` if the resulting path escapes the base directory.</description>
      <category>high</category>
      <category>verified</category>
      
    </item>
    <item>
      <title>[CVE-2026-35193] [MEDIUM] Cache Poisoning / Improper Cache Control Bypass in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/253</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/253</guid>
      <pubDate>Tue, 09 Jun 2026 15:43:53 GMT</pubDate>
      <description>The UpdateCacheMiddleware used a substring check (`directive in cache_control`) to detect Cache-Control directives like &apos;private&apos;, &apos;no-cache&apos;, &apos;no-store&apos;, and &apos;public&apos;. This meant that an extension directive like &apos;myprivate&apos; or &apos;nopublic&apos; would be falsely matched, causing responses that should be cached to not be cached, or causing Authorization-based Vary headers to be incorrectly omitted. More critically, the inverse case for &apos;public&apos; means that a response with a custom directive containing &apos;public&apos; as a substring would skip the Authorization vary header, potentially serving a user-specific cached response to other users. The fix replaces substring matching with exact token matching using `split_header_value`.</description>
      <category>medium</category>
      <category>confirmed</category>
      <category>CVE-2026-35193</category>
    </item>
    <item>
      <title>[CVE-2026-6873] [MEDIUM] Cookie Forgery / Signed Cookie Namespace Collision in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/239</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/239</guid>
      <pubDate>Wed, 03 Jun 2026 17:53:22 GMT</pubDate>
      <description>Django&apos;s signed cookie salt derivation historically used `cookie_name + salt` (concatenation), which is ambiguous: a cookie named &apos;a&apos; with salt &apos;bc&apos; produces the same salt string as a cookie named &apos;ab&apos; with salt &apos;c&apos;. This means a valid signed cookie for one (name, salt) pair could be submitted as a valid cookie for a different (name, salt) pair, allowing an attacker to reuse a legitimately obtained signed cookie value in an unintended context. The patch changes the default of SIGNED_COOKIE_LEGACY_SALT_FALLBACK from True to False, so Django now only accepts cookies signed with the unambiguous new salt derivation by default.</description>
      <category>medium</category>
      <category>confirmed</category>
      <category>CVE-2026-6873</category>
    </item>
    <item>
      <title>[CVE-2026-6873] [LOW] Signed Cookie Salt Namespace Collision in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/238</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/238</guid>
      <pubDate>Wed, 03 Jun 2026 14:31:00 GMT</pubDate>
      <description>Django&apos;s get_signed_cookie derived its signing salt by concatenating the cookie name (key) and salt arguments using simple string concatenation: `key + salt`. This meant that distinct (name, salt) pairs that produce the same concatenated string (e.g., name=&apos;ab&apos;, salt=&apos;c&apos; and name=&apos;a&apos;, salt=&apos;bc&apos;) would use the same signing namespace, allowing a signed cookie created for one context to be accepted in another. The patch fixes this by using an injective encoding that includes the salt length as a prefix, making it impossible for different (name, salt) pairs to collide.

Patch landed 3 hours 53 minutes before CVE-2026-6873 was published.</description>
      <category>low</category>
      <category>confirmed</category>
      <category>CVE-2026-6873</category>
    </item>
    <item>
      <title>[CVE-2026-7666] [LOW] Cleartext Transmission of Sensitive Information in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/237</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/237</guid>
      <pubDate>Wed, 03 Jun 2026 14:30:40 GMT</pubDate>
      <description>When using EMAIL_USE_TLS with fail_silently=True, a failed STARTTLS handshake would leave self.connection set to a partially-initialized SMTP connection that had not completed TLS negotiation. Subsequent email sends would reuse this unencrypted connection, transmitting emails (including credentials and content) in plaintext. The patch fixes this by only setting self.connection after all configuration steps (STARTTLS and login) succeed, using a temporary self._partial_connection during setup.

Patch landed 3 hours 53 minutes before CVE-2026-7666 was published.</description>
      <category>low</category>
      <category>confirmed</category>
      <category>CVE-2026-7666</category>
    </item>
    <item>
      <title>[CVE-2026-8404] [LOW] Cache Misconfiguration / Sensitive Data Exposure in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/236</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/236</guid>
      <pubDate>Wed, 03 Jun 2026 14:30:20 GMT</pubDate>
      <description>Django&apos;s UpdateCacheMiddleware performed a case-sensitive check for Cache-Control directives like &apos;private&apos;, &apos;no-cache&apos;, and &apos;no-store&apos;. If a response manually set &apos;Cache-Control: Private&apos; (or any mixed/uppercase variant), the middleware would fail to recognize it and cache the response anyway, potentially storing and serving private user data to other users. The patch lowercases the Cache-Control header value before checking for these directives.

Patch landed 3 hours 53 minutes before CVE-2026-8404 was published.</description>
      <category>low</category>
      <category>confirmed</category>
      <category>CVE-2026-8404</category>
    </item>
    <item>
      <title>[CVE-2026-35193] [LOW] Information Disclosure / Cache Poisoning in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/235</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/235</guid>
      <pubDate>Wed, 03 Jun 2026 14:30:00 GMT</pubDate>
      <description>Django&apos;s UpdateCacheMiddleware and cache_page decorator failed to add &apos;Authorization&apos; to the Vary header when caching responses to authenticated requests. This meant that a response generated for an authenticated user (with a specific Authorization header) could be served from cache to unauthenticated users or users with different credentials, potentially leaking private/user-specific data. The patch adds &apos;Authorization&apos; to the Vary header whenever the request contains an Authorization header and the response is not explicitly marked &apos;Cache-Control: public&apos;.

Patch landed 3 hours 53 minutes before CVE-2026-35193 was published.</description>
      <category>low</category>
      <category>confirmed</category>
      <category>CVE-2026-35193</category>
    </item>
    <item>
      <title>[CVE-2026-48587] [LOW] Cache Bypass / Improper Input Validation in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/234</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/234</guid>
      <pubDate>Wed, 03 Jun 2026 14:29:44 GMT</pubDate>
      <description>The `has_vary_header()` function in Django&apos;s cache utility failed to strip whitespace from individual Vary header values before comparison. This meant that a `Vary: *` header with surrounding whitespace (e.g., `Vary: * ` or `Vary:  * `) would not be recognized as containing the wildcard, causing `UpdateCacheMiddleware` to cache responses that should never be cached (responses with `Vary: *` should not be cached as they vary on all request headers). This could lead to private/personalized data being stored in and served from the cache to unintended users.

Patch landed 3 hours 53 minutes before CVE-2026-48587 was published.</description>
      <category>low</category>
      <category>confirmed</category>
      <category>CVE-2026-48587</category>
    </item>
    <item>
      <title>[MEDIUM] HTTP Response Splitting in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/189</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/189</guid>
      <pubDate>Fri, 22 May 2026 15:17:35 GMT</pubDate>
      <description>The `reason_phrase` setter in Django&apos;s `HttpResponseBase` class did not validate or sanitize control characters, allowing an attacker to inject arbitrary HTTP headers via carriage return (\\r) and newline (\\n) characters in the reason phrase. This is an HTTP Response Splitting vulnerability where a crafted reason phrase could inject additional headers or manipulate the HTTP response structure. The patch adds a regex check that raises `BadHeaderError` when control characters are detected in the reason phrase.</description>
      <category>medium</category>
      <category>verified</category>
      
    </item>
    <item>
      <title>[CVE-2026-15920] [HIGH] Improper Authorization / CSRF-like Action Targeting in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/178</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/178</guid>
      <pubDate>Wed, 20 May 2026 12:19:15 GMT</pubDate>
      <description>Before the patch, the Django admin change form allowed actions to be executed against arbitrary objects, not just the object being edited. An attacker could craft a POST request to a change form URL (for object A) but include the ACTION_CHECKBOX_NAME value of a different object (object B), causing the action to be executed on object B instead. This allowed privilege escalation or unauthorized modification/deletion of objects the user might not intend to affect. The fix adds a server-side check ensuring the checkbox value matches exactly the object being edited.

Patch landed 76 days 6 hours 26 minutes before CVE-2026-15920 was published.</description>
      <category>high</category>
      <category>confirmed</category>
      <category>CVE-2026-15920</category>
    </item>
    <item>
      <title>[CVE-2026-6907] [LOW] Information Disclosure / Cache Poisoning in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/167</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/167</guid>
      <pubDate>Tue, 05 May 2026 15:57:18 GMT</pubDate>
      <description>Django&apos;s UpdateCacheMiddleware erroneously cached responses where the Vary header contained an asterisk (&apos;*&apos;). Per RFC 7231, &apos;Vary: *&apos; means the response is unique per request and must never be served from cache, as it may contain private/user-specific data. An attacker could potentially receive cached private data intended for another user if the server responded with Vary: * but Django still stored and served it from cache.

Patch landed 5 hours 59 minutes before CVE-2026-6907 was published.</description>
      <category>low</category>
      <category>confirmed</category>
      <category>CVE-2026-6907</category>
    </item>
    <item>
      <title>[CVE-2026-35192] [LOW] Session Fixation / Cache Poisoning in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/168</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/168</guid>
      <pubDate>Tue, 05 May 2026 15:57:33 GMT</pubDate>
      <description>When SESSION_SAVE_EVERY_REQUEST=True, Django&apos;s session middleware would set a session cookie on responses but failed to include &apos;Vary: Cookie&apos; in the response headers when the session was not explicitly modified. This meant caching proxies could cache a response containing a Set-Cookie header with a specific session key, and serve that cached response (with that session cookie) to other users, allowing an attacker to steal or fixate another user&apos;s session. The patch ensures that whenever a session cookie is set in the response, the Vary: Cookie header is also added.

Patch landed 5 hours 59 minutes before CVE-2026-35192 was published.</description>
      <category>low</category>
      <category>confirmed</category>
      <category>CVE-2026-35192</category>
    </item>
    <item>
      <title>[CVE-2026-5766] [LOW] Denial of Service (Resource Exhaustion) in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/169</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/169</guid>
      <pubDate>Tue, 05 May 2026 15:57:51 GMT</pubDate>
      <description>In Django&apos;s ASGI deployments, the MemoryFileUploadHandler relied solely on the Content-Length header to determine whether a file upload should be stored in memory. Since ASGI doesn&apos;t guarantee that Content-Length accurately reflects the actual request body size (e.g., with chunked transfer encoding or a deliberately understated header), an attacker could send a multipart file upload with a small or missing Content-Length value but a very large body, bypassing FILE_UPLOAD_MAX_MEMORY_SIZE and forcing the server to load arbitrarily large files into memory. The patch fixes this by seeking to the end of the stream to measure the actual size when possible, falling back to Content-Length only for non-seekable streams.

Patch landed 5 hours 59 minutes before CVE-2026-5766 was published.</description>
      <category>low</category>
      <category>confirmed</category>
      <category>CVE-2026-5766</category>
    </item>
    <item>
      <title>[HIGH] Improper Authorization / Permission Bypass in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/158</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/158</guid>
      <pubDate>Tue, 28 Apr 2026 17:50:21 GMT</pubDate>
      <description>Before the patch, when a POST request was submitted to the Django admin changelist view with list_editable fields, the formset used for saving data was constructed directly with `FormSet(request.POST, request.FILES, queryset=modified_objects)` rather than going through `_get_formset_with_permissions()`. This meant the per-object permission check that removes editable fields for unauthorized objects was bypassed during form submission. An authenticated admin user with restricted per-object change permissions could modify objects they were not permitted to edit by crafting a POST request to the changelist view.</description>
      <category>high</category>
      <category>verified</category>
      
    </item>
    <item>
      <title>[CVE-2026-25674] [LOW] Incorrect Permissions / Race Condition (umask) in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/65</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/65</guid>
      <pubDate>Tue, 03 Mar 2026 14:31:34 GMT</pubDate>
      <description>In multi-threaded Django applications, the file-based cache backend and filesystem storage used temporary umask changes (via os.umask()) to control directory permissions when creating directories. Because os.umask() is a process-wide operation, a temporary umask change in one thread could affect directory/file creation in other threads, resulting in file system objects being created with unintended (potentially overly permissive) permissions. The patch replaces the umask manipulation approach with a safe_makedirs() function that uses os.chmod() after os.mkdir() to enforce the exact requested permissions.

Patch landed 3 hours 22 minutes before CVE-2026-25674 was published.</description>
      <category>low</category>
      <category>confirmed</category>
      <category>CVE-2026-25674</category>
    </item>
    <item>
      <title>[CVE-2026-25673] [MEDIUM] Denial of Service (DoS) in django/django</title>
      <link>https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/66</link>
      <guid isPermaLink="true">https://github.com/spaceraccoon/vulnerability-spoiler-alert/issues/66</guid>
      <pubDate>Tue, 03 Mar 2026 14:31:49 GMT</pubDate>
      <description>Django&apos;s URLField.to_python() used urlsplit() to detect URL schemes, which on Windows performs NFKC Unicode normalization. This normalization is disproportionately slow for inputs containing certain Unicode characters (e.g., characters like &apos;¾&apos;), allowing an attacker to craft a POST payload that causes excessive CPU consumption. The patch replaces urlsplit() with str.partition(&apos;:&apos;) for scheme detection, avoiding Unicode normalization entirely.

Patch landed 3 hours 22 minutes before CVE-2026-25673 was published.</description>
      <category>medium</category>
      <category>confirmed</category>
      <category>CVE-2026-25673</category>
    </item>
  </channel>
</rss>