Medium

Kimai vulnerable to formula Injection via tag names in XLSX export

  • Disclosed: 05.05.2026
  • Updated: 11.10.2026 10:22

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

Affected software

Click a technology to see all vulnerabilities affecting it.

PlatformPackageVulnerable versionsFixed in
Composer package kimai/kimai >= 2.27.0, < 2.54.0 2.54.0

References

CVSS score 5.7/10
CVSS vector
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:N/I:H/A:N
Weakness (CWE)
CWE-1236
Platform
Composer
Package
kimai/kimai
Disclosed
05.05.2026
Updated
11.10.2026 10:22

Sources and licenses

OSV / GitHub Advisory Database - GHSA-3xc2-h5r3-wv3r - CC BY 4.0

Vulnerability history: kimai/kimai

All published vulnerabilities of this package (Composer package), newest first. Shows whether this is a one-off slip or a package that needs watching.

All (33) in the archive
Total entries
33
First → latest
02.2023 07.2026
Without a fix
1
Exploited in attacks
0

Severity breakdown

  • Critical 2
  • High 4
  • Medium 20
  • Low 7

Disclosures per year

  1. 2023: 2
  2. 2024: 3
  3. 2025: 1
  4. 2026: 27
Severity:
  1. Kimai vulnerable to formula Injection via tag names in XLSX export this entry
    Medium · 5.7 CVE-2026-42267 >= 2.27.0, < 2.54.0 2.54.0
  2. High · 9.8 CVE-2023-53957 <= 1.30.10 no fix
  3. High · 6.5 ghsa-534c-hcr7-67jg < 2.21.0 2.21.0
  4. Critical · 9.6 CVE-2020-19825 < 1.1 1.1

Know which vulnerabilities affect your application

With the DockRay integration and software inventory enabled, DockRay checks reported component versions against known vulnerabilities and notifies you about confirmed matches. Coverage depends on the supported technology and available advisory data.

Connect your application
DockRay newsletter

Application security in your inbox

Important vulnerabilities, actionable guidance and practical advice for your applications. Choose your technologies and follow what matters to your project.

  • A daily digest of new vulnerabilities, critical ones included.
  • Notifications about important updates.
  • Practical advice on application security and monitoring.

Leave empty to receive updates for every technology.

Free to subscribe. Unsubscribe with one click in any email.