CVE-2026-32639: Medium severity composer/winter/wn-cms-module vulnerability
Impact
Affected versions of Winter CMS did not enforce per-template-type permission checks in the CMS section's AJAX handlers. The CMS controller (Cms\Controllers\Index) used OR-logic across its five permissions (cms.managepages, cms.managepartials, cms.managelayouts, cms.managecontent, cms.manageassets) to control access to the section as a whole, but individual handlers such as onSave(), onDelete(), and onDeleteTemplates() did not verify that the authenticated user holds the specific permission corresponding to the requested template type.
This allowed a backend user with any single Theme Editor permission (e.g. cms.managepages) to craft AJAX requests targeting template types outside their authorized scope — for example, deleting layouts, modifying partials, or reading content files.
In addition, the AssetList widget was registered for all users who passed the controller gate regardless of whether they held the cms.manageassets permission, and its onUpload() handler was missing the validateRequestTheme() call that is present on all other mutating handlers in the same widget. This allowed unauthorized file uploads into the active theme's asset directory.
To actively exploit this security issue, an attacker would need access to the Backend with a user account with any of the following permissions:
- cms.managepages - cms.managepartials - cms.managelayouts - cms.managecontent - cms.manageassets
The Winter CMS maintainers strongly recommend that all Winter CMS sites that rely on granular CMS permission assignments (specifically users with only access to cms.managecontent to only be able to edit content files through the Theme Editor) to update immediately.
Patches
Per-template-type permission checks are now enforced on all Theme Editor AJAX handlers, the AssetList widget is only registered for users with the cms.manageassets permission, and onUpload() now includes theme validation consistent with the other mutating handlers.
This security issue has been fixed as of v1.2.13.
Workarounds
If users cannot upgrade, they may apply the following changes to their Winter CMS installation manually to resolve this issue:
1. In modules/cms/controllers/Index.php, wrap each widget registration in the constructor with the corresponding hasAccess() check, and add a validateRequestType() call to the indexonOpenTemplate(), onSave(), onCreateTemplate(), onDeleteTemplates(), onDelete(), onCommit(), and onReset() handlers that verifies the user holds the permission for the requested template type. 2. In modules/cms/widgets/AssetList.php, add a $this->validateRequestTheme() call at the top of the onUpload() method.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
composer/winter/wn-cms-moduleto a version that resolves this vulnerability.Fixed in 1.2.13 - Upgrade
Upgrade to a fixed release to a version that resolves this vulnerability.
Fixed in v1.2.13 - Configuration
Edit modules/cms/controllers/Index.php so each widget registration in the CMS Index constructor is guarded with the matching hasAccess() check, and ensure validateRequestType() is called in index_onOpenTemplate(), onSave(), onCreateTemplate(), onDeleteTemplates(), onDelete(), onCommit(), and onReset() to verify the authenticated user has the permission for the requested template type.
Winter CMS (modules/cms/controllers/Index.php) Widget registration permissions via hasAccess() and request validation = Wrap each widget registration in the constructor with the corresponding hasAccess() check; add validateRequestType() to index_onOpenTemplate(), onSave(), onCreateTemplate(), onDeleteTemplates(), onDelete(), onCommit(), and onReset() handlers - Configuration
In modules/cms/widgets/AssetList.php, add a $this->validateRequestTheme() call at the top of the onUpload() method to prevent unauthorized uploads into the active theme asset directory.
Winter CMS (modules/cms/widgets/AssetList.php) AssetList onUpload() theme validation = Add $this->validateRequestTheme() call at the top of onUpload() - Configuration
Ensure the AssetList widget is only registered for users who have the cms.manage_assets permission (not for all users that pass the CMS section controller gate).
Winter CMS (modules/cms/widgets/AssetList.php registration via CMS Index controller) AssetList widget registration gate = Register AssetList only for users with cms.manage_assets
Event History
Frequently Asked Questions
What is the severity of CVE-2026-32639?
The severity of CVE-2026-32639 is rated medium with a score of 6.8.
How do I fix CVE-2026-32639?
To fix CVE-2026-32639, upgrade to Winter CMS version 1.2.13 or later where the permissions issue has been addressed.
What impact does CVE-2026-32639 have on Winter CMS?
CVE-2026-32639 allows unauthorized users to access and modify CMS sections due to improper permission checks.
Which versions of Winter CMS are affected by CVE-2026-32639?
CVE-2026-32639 affects versions of Winter CMS prior to 1.2.13.
What are the permissions affected by CVE-2026-32639?
CVE-2026-32639 affects permissions such as cms.manage_pages, cms.manage_partials, cms.manage_layouts, and others.