CVE-2026-50280: Craft CMS: Authorization bypass in `entries/move-to-section` via missing target-section save check
Summary
The EntriesController::actionMoveToSection() endpoint checks only whether the current user can view the destination section, but it does not require permission to save entries into that section. A low-privileged authenticated control-panel user who can move an entry out of its current section can therefore move that entry into a different section where they have read access but no write access.
Details
The vulnerable route is implemented in EntriesController.php:465:
The destination check is only viewEntries:$section->uid . The source-entry gate is Entry::canMove(), which verifies whether the user can move the existing entry based on the source section:
This closes the exploit chain:
1. External source: authenticated CP request to entries/move-to-section. 2. Missing authorization check: destination section requires only viewEntries, not saveEntries. 3. Privileged sink: moveEntryToSection() rewrites sectionId and saves the entry into the unauthorized section.
Preconditions derived from the code:
1. The attacker is authenticated to the control panel. 2. Entry 345 is movable by the attacker from its current section. 3. The attacker can satisfy viewEntries on destination section 12. 4. The attacker does not have saveEntries:DESTINATIONUID, which is the missing check that makes the bypass possible.
Result:
1. The controller accepts the request because viewEntries:$section->uid passes. 2. Each source entry passes canMove() based on source-section permissions. 3. moveEntryToSection() updates the entry’s sectionId and saves it. 4. The entry is now located in a section where the attacker did not have write permission.
Impact
This breaks the intended section-level authorization model. A user with limited content permissions can inject or relocate content into a protected section, interfering with editorial boundaries, approval workflows, section-specific business logic, and content ownership expectations.
Other sources
Craft CMS is a content management system (CMS). In versions 5.0.0-RC1 and above prior to 5.9.21, the EntriesController::actionMoveToSection() endpoint gates the destination section only by viewEntries:$section->uid rather than requiring saveEntries permission (the source entry is separately checked via Entry::canMove()). As a result, a low-privileged authenticated control-panel user who can move an entry out of its current section can call moveEntryToSection() to rewrite the entry's sectionId and save it into a section where they have read access but no write access. This breaks the section-level authorization model, letting a user with limited permissions inject content into a protected section and interfere with editorial boundaries, approval workflows, and section-specific business logic. This issue has been fixed in version 5.9.21.
— MITRE
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
composer/craftcms/cmsto a version that resolves this vulnerability.Fixed in 5.9.21 - Upgrade
Upgrade
Craft CMSto a version that resolves this vulnerability.Fixed in 5.9.21 - Compensating control
As a mitigation for Craft CMS versions 5.0.0-RC1 through < 5.9.21, restrict access to the control-panel endpoint/route that performs `entries/move-to-section` so that only users who have `saveEntries:<destinationSectionUid>` for the destination section can invoke it (the vulnerability exists because the controller gates only on `viewEntries:<destinationSectionUid>`).
Event History
Frequently Asked Questions
What is the severity of CVE-2026-50280?
CVE-2026-50280 has a medium severity rating of 6.
What does CVE-2026-50280 affect?
CVE-2026-50280 affects Craft CMS versions 5.0.0-RC1 and above prior to 5.9.21.
What type of vulnerability is CVE-2026-50280?
CVE-2026-50280 is an authorization bypass vulnerability in the `entries/move-to-section` feature.
How can I fix CVE-2026-50280?
To fix CVE-2026-50280, update Craft CMS to version 5.9.21 or later.
What is the impact of CVE-2026-50280?
CVE-2026-50280 allows unauthorized users to move entries to different sections without the proper permissions.