Skip to main content

Kimai CVE-2026-42267

MEDIUM
Improper Neutralization of Formula Elements in a CSV File (CWE-1236)
2026-05-05 https://github.com/kimai/kimai GHSA-3xc2-h5r3-wv3r
5.4
CVSS 4.0 · GitHub Advisory
Share

Severity by source

GitHub Advisory PRIMARY
5.4 MEDIUM
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:A/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N/E:P/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X

Primary rating from GitHub Advisory · only source for this CVE.

CVSS VectorGitHub Advisory

CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:A/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N/E:P/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
A
Scope
X

Lifecycle Timeline

3
CVSS changed
May 08, 2026 - 04:22 NVD
5.4 (MEDIUM)
Source Code Evidence Fetched
May 05, 2026 - 21:33 vuln.today
Analysis Generated
May 05, 2026 - 21:33 vuln.today

DescriptionGitHub Advisory

Summary

Any ROLE_USER can create a tag with a formula string as its name (e.g. =SUM(54+51)) via POST /api/tags and assign it to a timesheet. When an admin exports timesheets to XLSX, ArrayFormatter.formatValue() joins tag names with implode() and returns the result unchanged. OpenSpout promotes any =-prefixed string to a FormulaCell, writing <f>SUM(54+51)</f> into the XLSX archive. Excel evaluates the formula when the file is opened.

Details

1. ArrayFormatter does not sanitize before returning

sanitizeDDE() exists on StringHelper and is called by TextFormatter, but ArrayFormatter never calls it.

php
// src/Export/Package/CellFormatter/ArrayFormatter.php:24
return implode(', ', $value);  // no sanitizeDDE() call

2. Tag name validation does not block formula trigger characters

The API blocks commas in tag names but permits =, +, -, and @ - all valid formula prefixes in Excel and LibreOffice Calc.

3. OpenSpout silently promotes strings to formula cells

Cell::fromValue("=SUM(54+51)") returns a FormulaCell with no warning.

PoC

  1. It logs in as normal user, creates tag =SUM(54+51), assigns it to a timesheet.
  2. Admin has to export timesheets to Excel version via /en/export/ endpoint.

<img width="1339" height="700" alt="image" src="https://github.com/user-attachments/assets/884c7943-5e3b-4647-8bcc-e264d6719d66" />

<img width="1304" height="128" alt="formula_injection_tags" src="https://github.com/user-attachments/assets/ef28f2ad-7491-4a15-bb18-1fcd6ff5e55a" />

Impact

  • Any ROLE_USER can plant a formula that executes on the workstation of any user who exports and opens timesheet data
  • A single malicious tag poisons all future exports across all users and date ranges until the tag is deleted

Fixes

  1. Prevent = being part of the tag name (and other fields as well)
  2. Use OpenSpout TextCell for everything that is a string

AnalysisAI

Formula injection in Kimai 2.27.0 through 2.53.0 allows authenticated users with ROLE_USER to create tags containing formula strings (e.g., =SUM(54+51)) via the POST /api/tags endpoint. When administrators export timesheets to XLSX format, the ArrayFormatter joins tag names without sanitization, and OpenSpout automatically promotes formula-prefixed strings to FormulaCell objects. Excel or LibreOffice Calc evaluates these formulas when the exported file is opened, enabling code execution on any workstation that imports and opens the poisoned spreadsheet. Publicly available exploit code demonstrates the attack via normal user account and admin export workflow.

Technical ContextAI

The vulnerability involves three converging technical failures in Kimai's XLSX export pipeline. First, the ArrayFormatter class (src/Export/Package/CellFormatter/ArrayFormatter.php) uses PHP's implode() function to join tag names without calling the existing sanitizeDDE() method that is available on StringHelper and used by TextFormatter elsewhere in the codebase. Second, tag name validation at the API level blocks commas but permits formula trigger characters (=, +, -, @) that are recognized by Excel and LibreOffice Calc as formula prefixes. Third, the underlying OpenSpout library (used by Kimai for XLSX generation) contains logic in its Cell::fromValue() method that automatically detects strings beginning with = and promotes them to FormulaCell objects, writing literal <f>...</f> XML elements into the XLSX archive structure. When Excel opens the file, it evaluates these formula cells without user confirmation, creating a formula injection attack vector. The root cause is insufficient input validation (CWE-1236: Improper Neutralization of Formula Elements in a CSV File) combined with inadequate output encoding for the XLSX format.

RemediationAI

Upgrade Kimai to version 2.54.0 or later, which includes fixes that prevent formula trigger characters in tag names and ensure tag values are exported as TextCell objects rather than formula cells. The vendor-released patch addresses both the input validation failure (blocking =, +, -, @ in tag names) and the output encoding failure (forcing string cells to be TextCell type in OpenSpout). If immediate upgrading is not feasible, a temporary compensating control is to disable XLSX export functionality in Kimai's configuration settings, though this severely restricts reporting capabilities and is not a long-term solution. Organizations should also audit existing tags in their Kimai instances for formula injection patterns (strings beginning with =, +, -, or @) and delete any malicious tags before updating. The workarounds do not address the underlying product flaw and should be considered temporary only. See GitHub advisory GHSA-3xc2-h5r3-wv3r for patch details and deployment guidance.

More in PHP

View all
CVE-2012-1823 CRITICAL POC
9.8 May 11

sapi/cgi/cgi_main.c in PHP before 5.3.12 and 5.4.x before 5.4.2, when configured as a CGI script (aka php-cgi), does not

CVE-2016-1555 CRITICAL POC
9.8 Apr 21

(1) boardData102.php, (2) boardData103.php, (3) boardDataJP.php, (4) boardDataNA.php, and (5) boardDataWW.php in Netgear

CVE-2024-11680 CRITICAL POC
9.8 Nov 26

ProjectSend versions prior to r1720 are affected by an improper authentication vulnerability. Rated critical severity (C

CVE-2025-49113 CRITICAL POC
9.9 Jun 02

Roundcube Webmail contains a critical PHP object deserialization vulnerability (CVE-2025-49113, CVSS 9.9) that allows au

CVE-2017-9841 CRITICAL POC
9.8 Jun 27

Util/PHP/eval-stdin.php in PHPUnit before 4.8.28 and 5.x before 5.6.3 allows remote attackers to execute arbitrary PHP c

CVE-2025-0108 HIGH POC
8.8 Feb 12

Palo Alto Networks PAN-OS management web interface contains an authentication bypass allowing unauthenticated attackers

CVE-2021-25298 HIGH POC
8.8 Feb 15

Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re

CVE-2021-25296 HIGH POC
8.8 Feb 15

Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re

CVE-2013-4983 CRITICAL POC
10.0 Sep 10

The get_referers function in /opt/ws/bin/sblistpack in Sophos Web Appliance before 3.7.9.1 and 3.8 before 3.8.1.1 allows

CVE-2023-6553 CRITICAL POC
9.8 Dec 15

The Backup Migration plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, 1

CVE-2024-46506 CRITICAL POC
10.0 May 13

NetAlertX (formerly PiAlert) versions 23.01.14 through 24.x before 24.10.12 allow unauthenticated command injection thro

CVE-2024-8353 CRITICAL POC
9.8 Sep 28

The GiveWP - Donation Plugin and Fundraising Platform plugin for WordPress is vulnerable to PHP Object Injection in all

Share

CVE-2026-42267 vulnerability details – vuln.today

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy