CVE-2026-40486: Kimai's User Preferences API allows standard users to modify restricted attributes: hourly_rate, internal_rate

Published Apr 15, 2026
·
Updated

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

2 affected componentsFixes available
composer/kimai/kimai<=2.52.0
2.53.0
Kimai Kimai<2.53.0

Event History

Apr 15, 2026
Advisory Published
via GitHub·07:46 PM
Data Sourced
via GitHub·07:46 PM
DescriptionSeverityWeaknessAffected Software
Apr 17, 2026
CVE Published
via MITRE·10:35 PM
Data Sourced
via MITRE·10:35 PM
DescriptionSeverityWeakness
Data Sourced
via NVD·11:16 PM
DescriptionSeverityWeaknessAffected Software

Frequently Asked Questions

1

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.

2

How do I fix CVE-2026-40486?

To fix CVE-2026-40486, upgrade your Kimai installation to version 2.53.0 or later.

3

What type of vulnerability is CVE-2026-40486?

CVE-2026-40486 is categorized as a Mass Assignment and Broken Object Property Level Authorization vulnerability.

4

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.

5

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.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203