The vulnerability, identified as CVE-2026-8327, lies in the user profile update functionality of Concrete CMS. The root cause is improper input validation in the save() method of the EditProfile controller. The controller was accepting the entire raw POST request data and passing it to the UserInfo::update() method. This allowed an authenticated user to modify any attribute of their user object, even those not intended to be editable through this form.
Specifically, two issues were identified:
- Password Change without Reauthorization: A user could add
uPassword and uPasswordConfirm fields to their request to change their password without supplying their current password, as the controller did not enforce this check and UserInfo::update() would blindly apply the change.
- Session-Hardening Bypass: A user could modify other security-related attributes, such as the one controlling per-user IP pinning for sessions, effectively disabling this protection against session hijacking.
The patch addresses this in two main locations:
- In
concrete/controllers/single_page/account/edit_profile.php, the save() method was changed to use a whitelist approach. Instead of taking all POST data, it now initializes an empty array and only populates it with the specific fields that are allowed to be edited through this form.
- As a defense-in-depth measure, the
UserInfo::update() method in concrete/src/User/UserInfo.php was modified to only update the password if a special _allowPasswordUpdate flag is present in the data, which is only set by the save() method after it has validated the current password.
Therefore, during exploitation, a runtime profile would show calls to Concrete\Controller\SinglePage\Account\EditProfile::save() processing the malicious request, which in turn calls Concrete\Core\User\UserInfo::update() to persist the unauthorized changes.