GHSA-fwjf-m4qw-9f2x: Medium severity pip/django-cms vulnerability

Published Aug 24, 2026
·
Updated

Summary The CMS page cache key ignores the request headers that plugins declare via getvarycacheon(). 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.

Details pagecachekey (in cms/cache/page.py) keys only on cache prefix, site, language, path and timezone. setpagecache collects the plugin-declared vary headers and calls patchvaryheaders(response, ...) (affecting only the emitted Vary header), but stores and retrieves the cached page under the header-agnostic key. getpagecache therefore returns whichever variant was cached first.

Impact - 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. - 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.

Applies only when CMSPAGECACHE is enabled and at least one plugin implements getvarycacheon().

Patches Fixed in 5.0.8: the page cache now folds the request's values implements getvarycacheon().

Patches Fixed 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 learncachekey/getcachekey); a missing header-list entry degrades to a cache miss, never a wrong-variant hit.

Workarounds Disable CMSPAGECACHE, or avoid plugins that rely on getvarycacheon(), until upgraded.

Credits Reported by the security team at the University of Sydney ([@reporter]).

Affected Software

1 affected componentFixes available
pip/django-cms<5.0.8
5.0.8

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade pip/django-cms to a version that resolves this vulnerability.

    Fixed in 5.0.8
  2. Upgrade

    Upgrade CMS page cache to a version that resolves this vulnerability.

    Fixed in 5.0.8
  3. Configuration

    Disable CMS_PAGE_CACHE until upgraded, because the bug applies only when CMS_PAGE_CACHE is enabled and at least one plugin implements get_vary_cache_on().

    CMS_PAGE_CACHE enabled = false
  4. Compensating control

    Avoid plugins that rely on get_vary_cache_on() until upgraded.

Event History

Aug 24, 2026
Advisory Published
via GitHub·08:09 PM
Data Sourced
via GitHub·08:09 PM
DescriptionSeverityWeaknessAffected Software

Frequently Asked Questions

1

Which deployments are exposed to cross-user content mixing?

Deployments are exposed when the CMS page cache is used for anonymous pages and a plugin varies its rendered output based on request headers declared through get_vary_cache_on(). The cache key does not include those header values, so one cached variant can be returned to visitors with different header values.

2

What does an attacker need to do to poison the cache?

An unauthenticated attacker can request a cacheable anonymous page with attacker-chosen values for a header that affects plugin output. If their request populates the cache first, that rendered variant can be served to subsequent visitors until the cache entry expires.

3

How can I determine whether a page is affected?

Identify plugins that implement get_vary_cache_on() and render different content according to the declared request headers, such as Country-Code. For affected pages, the response may contain the appropriate Vary header, but the CMS page cache key still uses only the cache prefix, site, language, path, and timezone rather than the header values.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203