CVE-2026-40486: Kimai's User Preferences API allows standard users to modify restricted attributes: hourly_rate, internal_rate
Summary A Mass Assignment / Broken Object Property Level Authorization (BOPA) vulnerability in the User Preferences API allows any authenticated user (even those with the lowest privileges) to arbitrarily modify restricted financial attributes on their profile, specifically their hourlyrate and internalrate.
Details Kimai restrictively protects the hourlyrate and internalrate parameters during standard GUI flow. Users lacking the hourly-rate role permissions cannot see or edit these fields via the standard Web Form (UserApiEditForm / UserEditType).
The vulnerability exists in the dedicated preferences API endpoint: src/API/UserController.php::updateUserPreference.
When a PATCH request is sent to /api/users/{id}/preferences, the endpoint iterates through the submitted JSON array and blindly applies the new values: php foreach ($request->request->all() as $preference) { // ... validation omitted ... if (null === ($meta = $profile->getPreference($name))) { throw $this->createNotFoundException(\sprintf('Unknown custom-field "%s" requested', $name)); }
$meta->setValue($value); // <-- VULNERABILITY }
The underlying Role-Based Access Control logic (UserPreferenceSubscriber::getDefaultPreferences) accurately identifies that standard users lack the hourly-rate role, and flags the dynamically generated preference object as disabled ($preference->setEnabled(false)).
However, the updateUserPreference API endpoint entirely ignores this isEnabled() flag and forcefully saves the mutated object to the database natively via Doctrine ORM. This allows unauthorized accounts to manipulate the business-logic variables calculating their own financial earnings.
PoC 1. Log into Kimai as an unprivileged, standard employee account (a user with absolutely no roles array privileges). 2. Capture the cookie or Session cookies. (In this example, the user's ID is 2). 3. Send the following cURL request (or intercept via Burp Suite) targeting your own user ID:
bash curl -i -X PATCH "http://localhost:8001/api/users/2/preferences" \ -H "Content-Type: application/json" \ -H "cookie: <YOURSTANDARDUSERTOKEN>" \ -d '[ { "name": "hourlyrate", "value": "1337" }, { "name": "internalrate", "value": "1337" } ]'
4. The server responds with HTTP/1.1 200 OK. (Note: The hourlyrate will intentionally NOT appear in the JSON echo due to User::getVisiblePreferences sanitizing output based on the same disabled flag). 5. If an Administrator organically views User 2's profile within Kimai, or if the user logs any new timesheets, the active and billed hourlyrate applied to their account will be confirmed as 1337. <img width="1542" height="1039" alt="useraccount" src="https://github.com/user-attachments/assets/fff5e2da-d598-408d-8a01-784499ade844" /> <img width="1539" height="1037" alt="adminaccount" src="https://github.com/user-attachments/assets/86a6e8c3-a97f-4be3-9f9f-2e23fad1d8a0" />
Impact This is a Privilege Escalation and Business Logic Flaw impacting the core financial calculations of the application. An attacker with a standard user account can manipulate their own billing rate multipliers unbeknownst to administrators, resulting in fraudulent invoices, distorted timesheet exports, and unauthorized financial tampering.
Other sources
Kimai is an open-source time tracking application. In versions 2.52.0 and below, the User Preferences API endpoint (PATCH /api/users/{id}/preferences) applies submitted preference values without checking the isEnabled() flag on preference objects. Although the hourlyrate and internalrate fields are correctly marked as disabled for users lacking the hourly-rate role permission, the API ignores this restriction and saves the values directly. Any authenticated user can modify their own billing rates through this endpoint, resulting in unauthorized financial tampering affecting invoices and timesheet calculations. This issue has been fixed in version 2.53.0.
— MITRE
Affected Software
Event History
Frequently Asked Questions
What is the severity of CVE-2026-40486?
CVE-2026-40486 is considered a high severity vulnerability due to its potential to allow unauthorized financial modifications.
How do I fix CVE-2026-40486?
To fix CVE-2026-40486, upgrade your Kimai installation to version 2.53.0 or later.
What type of vulnerability is CVE-2026-40486?
CVE-2026-40486 is categorized as a Mass Assignment and Broken Object Property Level Authorization vulnerability.
Who is affected by CVE-2026-40486?
Any authenticated user with low privileges is affected by CVE-2026-40486, as they can modify restricted financial attributes.
What can be compromised due to CVE-2026-40486?
CVE-2026-40486 allows unauthorized modification of restricted attributes, specifically the 'hourly_rate' of user profiles.