Update dependency django-cms to v5 [SECURITY] - #282
Open
renovate[bot] wants to merge 1 commit into
Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
^4.1.6→^5.0.0django CMS: Structure endpoint bypasses page-view permission
CVE-2026-54624 / GHSA-vgxm-h9gx-h9w7
More information
Details
Summary
The structure-board endpoint (
render_object_structure) renders a page's plugin structure without verifying that the requesting user is allowed to view the page. The edit and preview endpoints enforce this viarender_page(), but the structure endpoint does not, allowing a low-privileged staff user to read the plugin structure of a view-restricted page.Details
render_object_structure(incms/views.py) loads thePageContentobject and renderscms/toolbar/structure.htmldirectly. Unlikerender_object_endpoint(used by edit/preview), which renders throughrender_pagecontent→render_pageand callsuser_can_view_page(request.user, page)(returning 404 when the user may not view the page), the structure endpoint performs no page-level authorization.The rendered structure board includes each plugin's
get_short_description()(e.g. link names/URLs, text snippets), so the content of a restricted page is disclosed, not just its shape.Impact
A staff user (any account with
is_staff=True) who lacks view permission on a view-restricted page can retrieve that page's plugin structure and short descriptions by requesting the structure endpoint with the page's content-type id and object id.This only applies when
CMS_PERMISSION=Trueand the page has view restrictions (orCMS_PUBLIC_FOR='staff'). Sites without per-page view restrictions are not affected.Patches
Fixed in 5.0.8: the structure endpoint now enforces
user_can_view_page()forPageContentobjects, matching edit/preview.Workarounds
None other than restricting staff access. Upgrade is recommended.
Credits
Reported by the security team at the University of Sydney ([@reporter]).
Severity
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
django CMS: Clipboard copy IDOR discloses unauthorized plugin content
CVE-2026-54622 / GHSA-4xfr-4p46-gc6p
More information
Details
Summary
The clipboard copy paths of the
copy_pluginsadmin endpoint validate only the target (the user's own clipboard) and skip source-side authorization. A staff user can copy plugins out of a placeholder they have no permission on into their clipboard, then read the (secret) content.Details
In
cms/admin/placeholderadmin.py,_copy_plugin_to_clipboardand_copy_placeholder_to_clipboardcheckhas_copy_plugins_permission, which only evaluatesrequest.toolbar.clipboard.has_add_plugins_permission(...)— theclipboard belongs to the requesting user, and
check_sourceis likewise applied only to the clipboard. The source placeholder identified by the attacker-suppliedsource_placeholder_id/source_plugin_idis never authorization-checked. (The placeholder-to-placeholder copy path,has_copy_from_placeholder_permission, correctly checks both sides.)Impact
A staff user holding the global add permission for a plugin type, but with no access to a given placeholder/page, can copy that placeholder's plugins into their own clipboard and read content (e.g. link names/URLs, text) they cannot reach through the normal edit endpoints.
Requires
CMS_PERMISSION=Truewith per-placeholder/page restrictions.Patches
Fixed in 5.0.8: the clipboard copy paths now also verify source-side permission (
has_add_plugins_permission+check_sourceon the source placeholder), matching placeholder-to-placeholder copy.Workarounds
None. Upgrade is recommended.
Credits
Reported by the security team at the University of Sydney ([@reporter]).
Severity
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
django CMS: Broken access control in page Duplicate allows reading the content of any page (cross-site / restriction bypass)
CVE-2026-63003 / GHSA-6x92-6vx4-5fwr
More information
Details
Impact
The only authorization gate on the duplicate flow is
PageAdmin.has_add_permission,which checks
user_can_add_page(user, site)/user_can_add_subpage(...)— i.e. “maythis user create a page at all”. Nothing checks the user’s relationship to the page being
copied:
cms/admin/forms.py—DuplicatePageForm.source = ModelChoiceField(queryset=Page.objects.all(), widget=HiddenInput())spans every page in the database, on every site.
cms/admin/forms.py—AddPageForm.__init__returns early when thesourcewidget ishidden, so the queryset is never narrowed to the user’s site/subtree.
cms/admin/forms.py—AddPageForm.clean()validates only URL uniqueness;sourceisnever validated against the user.
cms/admin/pageadmin.py—duplicate()seedssourcefrom the URL only on GET; onPOST the value comes entirely from the request body.
cms/admin/forms.py—AddPageForm.save()→from_source()performssource.copy(..., permissions=False)and copies every placeholder and all plugins ofsourceinto a new page on the attacker’s site. Becausepermissions=Falsedrops thesource’s view restrictions, the resulting copy is fully readable by the attacker.
This crosses a real privilege boundary: a staff user restricted (via
CMS_PERMISSION) totheir own site or subtree can exfiltrate the content of restricted pages and of pages
belonging to other tenants.
Read-back is trivial (verified): the copy is created on the attacker’s site and, because
copy(..., permissions=False)strips the source’s view restrictions, the new page isunrestricted.
user_can_view_page()then returnsTruefor it (unrestricted +PUBLIC_FOR), so the attacker — or even an anonymous visitor — can read the duplicatedcontent directly from the front end. No further permission on the new page is required.
Proof of concept
attackerwho has add page permission but no view/changepermission on a target (secret / other-site) page
SECRET_ID.<id>only needs to be aPageContentthe attacker can already see —e.g. one of their own pages; the victim id goes in the POST body):
copy of the secret page’s plugins, which the attacker can now preview/edit/read.
Patches
Enforce an object-level permission check on
source:(
user_can_view_pageis imported fromcms.utils.page_permissions.)Workarounds
Until patched, restrict access to the
cms.add_pagepermission to fully-trusted staff, ordisable the duplicate action for delegated/limited editors.
References
cms/admin/pageadmin.py—duplicate(),has_add_permission(),get_urls()cms/admin/forms.py—DuplicatePageForm,AddPageForm.__init__/clean/save/from_sourcecms/tests/test_forms.py::DuplicatePageFormSecurityTestCaseSeverity
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
django CMS: Missing authorization in
render_object_structurediscloses non-PageContent placeholder structure to low-privileged staffCVE-2026-61663 / GHSA-8qj2-c6q4-f399
More information
Details
Summary
The django-cms frontend-editing structure endpoint
did not perform an object-level authorization check for non-
PageContentobjects. Any authenticated, active staff user could request the structure endpoint for a frontend-editable object (a model usingPlaceholderRelationField) and read its placeholder/plugin structure, even without permission to change that object and without thecms.use_structurepermission that the toolbar UI requires before offering structure mode.PageContentobjects were already protected (a page-view check added in GHSA/PR #8644); this advisory covers the remaining non-PageContentbranch of the same view.Severity
The issue is staff-gated and read-only, disclosing CMS structure metadata (placeholder slot names, plugin tree, plugin identifiers/labels, object existence) rather than write access or arbitrary field data.
Affected versions
>= 4.0.0, <= 5.0.xand5.1.0a1(the vulnerable non-
PageContentbranch was introduced with the frontend-editing endpoints in 4.0)Patched versions
Preconditions
is_staff=True).PageContentmodel with django-cms placeholders / frontend editing (e.g. viaPlaceholderRelationField).content_type_idand object id.cms.use_structurepermission.Impact
A low-privileged staff user can read the editorial placeholder/plugin structure of non-
PageContentobjects they are not authorized to edit through the toolbar. Depending on the installed plugins and templates this may reveal placeholder names, plugin layout, plugin identifiers and the existence of objects owned by other staff users or teams. This is most relevant for deployments using third-party or custom django-cms apps that expose frontend-editable objects outside the page tree.Proof of concept
Using django-cms' own test model
placeholder_relation_field_app.FancyPoll(a non-PageContentmodel with aPlaceholderRelationField):Patch
render_object_structurenow authorizes the non-PageContentbranch, mirroringPlaceholder.has_change_permissionat the object level (honouring a customhas_placeholder_change_permissionhook, otherwise falling back to the model/objectchange permission) and returning
404when the user is not authorized:Workarounds
No configuration workaround. Deployments that do not register any non-
PageContentfrontend-editable model are not affected. Otherwise, upgrade to a patched release.
Credit
Reported by doanmanhducz.
Severity
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Release Notes
django-cms/django-cms (django-cms)
v5.0.9Compare Source
What's Changed
render_object_structuredisclosed non-PageContent placeholder structure (#8692) by @fsbraun in #8703Full Changelog: django-cms/django-cms@5.0.8...5.0.9
v5.0.8Compare Source
==================
Bug Fixes:
7642a98) -- Fabian Braun1b164a4) -- Fabian Braund5dc1ef) -- Fabian Braunf975cac) -- Venelin Stoykov23df299) -- Fabian Braun9fed876) -- Fabian Braun936a620) -- Fabian Braunc7424f7) -- RalphStatistics:
This release includes 14 pull requests, and was created with the help of the following contributors (in alphabetical order):
With the review help of the following contributors:
Thanks to all contributors for their efforts!
v5.0.7Compare Source
==================
Bug Fixes:
CMSPluginwere not downcasted correctly (#8539) by @fsbraun in #8541page_titleparameter tocms.api.create_pagefunction (#8567) by @fsbraun in #8572Statistics:
This release includes 15 pull requests, and was created with the help of the following contributors (in alphabetical order):
With the review help of the following contributors:
Thanks to all contributors for their efforts!
v5.0.6Compare Source
==================
Features:
8c383c9) -- Fabian Braun9bcfb08) -- Fabian BraunBug Fixes:
4fc76cf) -- Fabian Braun19f8c9d) -- Fabian Brauna5f7398) -- Fabian Braun3afd42b) -- Fabian Braun1e8a3f9) -- Fabian Braun15cebb3) -- Fabian Braun1327364) -- Fabian Braune4751d6) -- Fabian BraunStatistics:
This release includes 15 pull requests, and was created with the help of the following contributors (in alphabetical order):
With the review help of the following contributors:
Thanks to all contributors for their efforts!
v5.0.5Compare Source
==================
Bug Fixes:
9e00f69) -- Fabian BraunStatistics:
This release includes 5 pull requests, and was created with the help of the following contributors (in alphabetical order):
With the review help of the following contributors:
Thanks to all contributors for their efforts!
v5.0.4Compare Source
==================
Bug Fixes:
7753923) -- Fabian BraunStatistics:
This release includes 1 pull request, and was created with the help of the following contributors (in alphabetical order):
With the review help of the following contributors:
Thanks to all contributors for their efforts!
v5.0.3Compare Source
==================
Bug Fixes:
Statistics:
This release includes 9 pull requests, and was created with the help of the following contributors (in alphabetical order):
With the review help of the following contributors:
Thanks to all contributors for their efforts!
v5.0.2Compare Source
==================
Bug Fixes:
14dd89f) -- Fabian Braun46f0e07) -- Muhammad Hassan Siddiqi2c1ab2d) -- Fabian Braune7be7bc) -- Fabian Braun3651858) -- Fabian Braunec2f4e8) -- Fabian Braunbcf7f89) -- jmit-modern4a12dd3) -- Fabian Braun3d069cb) -- Stefan Wehrmeyera9105a7) -- Stefan WehrmeyerStatistics:
This release includes 13 pull requests, and was created with the help of the following contributors (in alphabetical order):
With the review help of the following contributors:
Thanks to all contributors for their efforts!
v5.0.1Compare Source
==================
Bug Fixes:
prepopulated_fields(d6be474) -- Fabian Braun0a2ce64) -- Fabian Braund040cee) -- Fabian Brauncms.forms.validators(1548fba) -- Fabian BraunStatistics:
This release includes 4 pull requests, and was created with the help of the following contributors (in alphabetical order):
With the review help of the following contributors:
Thanks to all contributors for their efforts!
v5.0.0Compare Source
==================
Features:
fae83a8) -- Fabian BraunPage/TreeNodemodel merge (#8163) (f85297d) -- Fabian BraunCMS_ALWAYS_REFRESH_CONTENTsetting and other fixes (#8154) (1e2ff09) -- Fabian Braun3981f92) -- Fabian Braun2704cd4) -- Fabian Braun203dfcb) -- Vinit Kumar6731f24) -- Fabian Braunbe71c9d) -- Fabian Braun8274ff6) -- Fabian Braunea98301) -- Fabian Braun47b6301) -- Fabian BraunFrontendEditableAdminMixinendpoint to plugins (#8062) (0224f1e) -- Fabian Braunadbcb71) -- Fabian Braund0a25c0) -- Fabian Braun8577444) -- Jacob Rief8630db8) -- Fabian BraunBug Fixes:
7f8a6e3) -- Fabian Braun4b5d0f0) -- Fabian Braun2403d4e) -- Fabian BraunCMSPlugin(#8159) (502ced1) -- Fabian Brauneab0f34) -- Hana Belay4777a02) -- Amanda Savluchinske693e910) -- Fabian Braunfa3618e) -- Fabian Braun579db86) -- Hana Belaydone.htmlredirect wizard (#8142) (1ee530c) -- Fabian Braun733c377) -- Fabian Braun76cb708) -- Fabian Braun01fd09b) -- Fabian Braun5f36e1c) -- Fabian Braunmanage.py cms fixtreedid not fix PageUrl model (#7905) (63a3836) -- Jacob Riefded96db) -- Fabian Braundf40666) -- Fabian Braunchanged_dateof page content in sitemap (#8122) (d987576) -- Jacob Rief4bcb4b4) -- Fabian Braun4632949) -- Fabian Braunf2c367d) -- Fabian Braun3f8fcb5) -- Fabian Braun58eb76b) -- 사재혁Pageobject from admin index (introduced by #7995) (#8066) (fe54de4) -- Fabian Braun9e33db4) -- Fabian Braunlanguagesfield fromPagewhich used to become inconsistent (#8080) (1031d20) -- Fabian Braun241d1cb) -- Fabian Braune1af998) -- Fabian Braund4b811d) -- Fabian Braun17343b0) -- Halit Çelik69962fe) -- Abdulwasiu Apalowo835938c) -- Sale8d1abf) -- Jacob Rief052eac5) -- Jens-Erik Weberdb0a0c7) -- Filip Weidemann1acb816) -- Sal19ef774) -- Jacob Riefaccc8da) -- Jens-Erik Weber9a1e178) -- Fabian Braun1f864af) -- Fabian Brauna56decf) -- Fabian Braun4f1cbc5) -- Fabian Braun5f2f9e4) -- Fabian Braunprefers-color-scheme: auto(#7979) (f82bcac) -- Fabian Braun59d50f2) -- Fabian Braunget_admin_url_for_languagedid not return the latest page content (#7967) (b4f54a5) -- Fabian Braun93f6fc5) -- Fabian Braun1240e18) -- Fabian Braun0f81cea) -- Fabian Braun302c1b5) -- Fabian BraunRefactoring and Cleanups:
cca00a5) -- Jacob RiefStatistics:
This release includes 137 pull requests, and was created with the help of the following contributors (in alphabetical order):
With the review help of the following contributors:
Thanks to all contributors for their efforts!
v4.1.11[Compare Source](https://re
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.