CVE-2026-75526

CVE-2026-75526 is a medium-severity cross-site scripting (XSS) vulnerability in django-cms (pip), affecting versions >= 5.0.8, < 5.0.9. It is fixed in 5.0.9.

Does this CVE actually affect you?

Kodem shows which CVEs are reachable and running in your applications, so you fix what's exploitable, not just what's listed.

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

Runtime intelligence, not another scanner.

Summary

django CMS: Stored XSS in edit-mode plugin exception rendering

When plugin rendering fails in edit mode, django CMS renders a cms-rendering-exception block so editors can see that a placeholder could not be rendered. Older code built that block's heading by interpolating the exception message, placeholder/source strings, and the failing plugin's short description directly into an HTML string, then returned the placeholder output as safe markup.

If an editor could store HTML in data used by a plugin's get_short_description() (or in other values interpolated into the exception message), and that plugin later raised during edit-mode rendering, the payload was parsed as HTML in the staff user's browser. This is a stored XSS condition in the CMS editing context.

Workarounds

Until patched, reduce exposure by ensuring only fully trusted staff can edit plugins whose stored fields are included in get_short_description(), and fix or disable plugins that can be made to raise during edit-mode rendering. This is only a partial mitigation because the escaping bug is in the shared exception-rendering path.

References

  • cms/plugin_rendering.py - ContentRenderer.render_placeholder
  • cms/plugin_rendering.py - ContentRenderer.render_exception
  • Fixed code: heading = format_html('<h2 class="cms-rendering-exception-title">{}</h2>', message)
  • Regression tests:
    cms.tests.test_plugin_renderers.TestExceptionCatchers.test_exception_in_plugin_render_escapes_user_content_in_edit_mode,
    cms.tests.test_plugin_renderers.TestLegacyRendererExceptionCatcher.test_exception_in_plugin_render_escapes_user_content_in_edit_mode

Impact

The vulnerable path is only reached when placeholder rendering catches a plugin rendering exception:

try:
    placeholder_content = "".join(plugin_content)
except Exception as e:
    context["exc_info"] = sys.exc_info()
    placeholder_content = self.render_exception("rendering placeholder", context, placeholder, editable)

render_exception() constructs a message from values that can include stored content:

  • value - the exception message.
  • placeholder - the placeholder string representation.
  • placeholder.source - the source object string representation, such as page content.
  • instance.get_short_description() - plugin-provided summary text, often derived from plugin model fields.

In the vulnerable implementation, that message was embedded directly into an HTML heading. The final placeholder content was later returned through mark_safe, so Django template autoescaping did not protect the heading.

settings.DEBUG does not mitigate the issue: it only controls whether Django's traceback HTML is appended. The custom heading is rendered in edit mode regardless of DEBUG.

Untrusted input is rendered as active markup in a victim's browser, which can run script in their session. Typical impact: session or credential theft, and actions taken as the user.

CVE-2026-75526 has a CVSS score of 4.4 (Medium). The vector is network-reachable, low privileges required, and user interaction required. A CVSS score reflects the worst-case severity of the vulnerability, not your specific exposure. Whether this affects your application depends on whether the vulnerable code is present and reachable in your environment. A fixed version is available (5.0.9); upgrading removes the vulnerable code path.

Affected versions

django-cms (>= 5.0.8, < 5.0.9)

Security releases

django-cms → 5.0.9 (pip)

Kodem intelligence

Severity tells you how bad this could be in the worst case. It does not tell you whether you are exposed. Exploitability and impact are functions of runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A vulnerable package can sit in your dependency tree and never run.

Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter. Kodem's runtime-powered SCA identifies whether this CVE is reachable in your applications.

Already deployed Kodem?

See it in your environmentNew to Kodem? Get a demo →

Remediation advice

Escape the custom exception heading before returning it as safe placeholder markup. The current fixed code uses format_html, which escapes message before inserting it into the heading:

heading = format_html('<h2 class="cms-rendering-exception-title">{}</h2>', message)

The traceback HTML from ExceptionReporter.get_traceback_html() should remain separate from django CMS's custom heading; Django's traceback escaping does not protect additional HTML assembled by django CMS.

Frequently Asked Questions

  1. What is CVE-2026-75526? CVE-2026-75526 is a medium-severity cross-site scripting (XSS) vulnerability in django-cms (pip), affecting versions >= 5.0.8, < 5.0.9. It is fixed in 5.0.9. Untrusted input is rendered as active markup in a victim's browser, which can run script in their session.
  2. How severe is CVE-2026-75526? CVE-2026-75526 has a CVSS score of 4.4 (Medium). This score reflects the worst-case severity of the vulnerability, not your specific exposure. Whether it represents real risk in your environment depends on whether the vulnerable code is present and reachable.
  3. Which versions of django-cms are affected by CVE-2026-75526? django-cms (pip) versions >= 5.0.8, < 5.0.9 is affected.
  4. Is there a fix for CVE-2026-75526? Yes. CVE-2026-75526 is fixed in 5.0.9. Upgrade to this version or later.
  5. Is CVE-2026-75526 exploitable, and should I be worried? Whether CVE-2026-75526 is exploitable in your environment depends on whether the vulnerable code is present and reachable. A CVSS score is a worst-case rating; it does not account for your specific deployment, configuration, or usage patterns. Kodem, an Intelligent Application Security platform, uses runtime intelligence to show which vulnerabilities actually execute in production, so you can focus on the ones that represent real risk. Get a demo
  6. What actually determines whether CVE-2026-75526 is exploitable, and how bad it is? Exploitability and impact are not fixed properties of a CVE. They depend on runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A high CVSS score on a dependency that never runs is not the same as real risk. Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter.
  7. How do I fix CVE-2026-75526? Upgrade django-cms to 5.0.9 or later.

Other vulnerabilities in django-cms

Stop the waste.
Protect your environment with Kodem.