{"id":"CVE-2026-54625","aliases":["GHSA-fwjf-m4qw-9f2x","PYSEC-2026-3824"],"url":"https://o3.security/vulnerability/CVE-2026-54625","summary":"django CMS: Page cache ignores plugin-declared Vary headers (disclosure & poisoning)","details":"### Summary\nThe CMS page cache key ignores the request headers that plugins declare via `get_vary_cache_on()`. The header is added to the response `Vary` header, but the CMS's own cache key does not incorporate the header values, so the first visitor's variant is served to all subsequent visitors regardless of their header values.\n\n### Details\n`_page_cache_key` (in `cms/cache/page.py`) keys only on cache prefix, site, language, path and timezone. `set_page_cache` collects the plugin-declared vary headers and calls `patch_vary_headers(response, ...)` (affecting only the emitted `Vary` header), but stores and retrieves the cached page under the header-agnostic key. `get_page_cache` therefore returns whichever variant was cached first.\n\n### Impact\n- **Information disclosure:** when a plugin varies its output on a request  header (e.g. `Country-Code`), the variant rendered for the first anonymous visitor is served to everyone until the entry expires, leaking request-specific content across users.\n- **Cache poisoning:** an unauthenticated attacker can prime the anonymous page cache with content rendered from attacker-chosen header values, which is then served to subsequent visitors.\n\nApplies only when `CMS_PAGE_CACHE` is enabled and at least one plugin implements `get_vary_cache_on()`.\n\n### Patches\nFixed in 5.0.8: the page cache now folds the request's values implements `get_vary_cache_on()`.\n\n### Patches\nFixed in 5.0.8: the page cache now folds the request's values for plugin-declared vary headers into the content key. The set of vary headers is persisted on write and looked up first on read (mirroring Django's  `learn_cache_key`/`get_cache_key`); a missing header-list entry degrades to a cache miss, never a wrong-variant hit.\n\n### Workarounds\nDisable `CMS_PAGE_CACHE`, or avoid plugins that rely on `get_vary_cache_on()`, until upgraded.\n\n### Credits\nReported by the security team at the University of Sydney ([@reporter]).","published":"2026-08-20T17:58:03.255Z","modified":"2026-09-20T11:31:02.570015213Z","cvss":{"score":4.8,"severity":"MEDIUM","vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N"},"epss":{"score":0.00147,"percentile":0.04335,"asOf":"2026-09-17"},"cisaKev":null,"exploitsKnown":0,"affectedPackages":[{"ecosystem":"PyPI","name":"django-cms","fixedVersion":"5.0.8"}],"fix":{"url":"https://github.com/django-cms/django-cms/commit/8758714b865ffa79c6bcd0e5c503958ea48885aa","label":"django-cms/django-cms@8758714"},"references":[{"type":"WEB","url":"https://github.com/django-cms/django-cms/releases/tag/5.0.8"},{"type":"WEB","url":"https://github.com/django-cms/django-cms/releases/tag/5.1.0"},{"type":"ADVISORY","url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/54xxx/CVE-2026-54625.json"},{"type":"ADVISORY","url":"https://github.com/django-cms/django-cms/security/advisories/GHSA-fwjf-m4qw-9f2x"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-54625"},{"type":"FIX","url":"https://github.com/django-cms/django-cms/commit/8758714b865ffa79c6bcd0e5c503958ea48885aa"},{"type":"FIX","url":"https://github.com/django-cms/django-cms/commit/d5dc1efa18d157445491c4b12c2dd1efd56f439f"},{"type":"FIX","url":"https://github.com/django-cms/django-cms/pull/8646"},{"type":"FIX","url":"https://github.com/django-cms/django-cms/pull/8647"},{"type":"PACKAGE","url":"https://github.com/django-cms/django-cms"}],"provenance":{"sources":["OSV.dev","FIRST.org (EPSS)"],"lastVerified":"2026-09-20T11:31:02.570015213Z"}}