Skip to main content

Leantime EUVDEUVD-2026-83890

| CVE-2026-94210 LOW
Cross-site Scripting (XSS) (CWE-79)
2026-09-21 VulDB GHSA-j9vw-9527-3hx6
2.0
CVSS 4.0 · Vendor: VulDB
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Authenticate as low-privileged user
  2. Delivery
    Inject payload into group/status/project name field
  3. Exploit
    Payload stored and rendered raw in board header label
  4. Execution
    Owner views Kanban/list board
  5. Persist
    Script executes in Owner session
  6. Impact
    Privilege escalation / account actions

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK

2 techniques across 2 tactics: Initial Access, Execution

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Requires an authenticated Leantime account with permission to set a value that becomes a grouping label - a project name, status name, ticket type, or milestone headline (PR:L). Exploitation is limited by: (1) needing that authenticated low-privileged access rather than being unauthenticated; (2) requiring a victim to passively view the affected Kanban/list/table board (UI:P) for the stored payload to fire; and (3) applying only to Leantime up to and including 3.9.8, where the getAllGrouped() label branches render user-controlled text raw. No special non-default configuration is needed beyond normal board usage.

Impact

This is a genuine but moderate-severity issue, not a critical one. The vendor CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:L/VA:N) describes a stored XSS reachable over the network but requiring an authenticated low-privileged account (PR:L) and passive victim interaction (UI:P) - a victim must simply view the Kanban/list board where the malicious label is rendered. The E:P (proof-of-concept) exploit-maturity flag is corroborated by a publicly published exploit and a merged vendor patch (PR #3767, commit a30a6837), so 'publicly available exploit code exists' is confirmed. There is no EPSS score or CISA KEV entry in the input, so there is no evidence of active exploitation - treat this as a POC-available, not exploited-in-the-wild, issue. The most important nuance: the vendor scored confidentiality as VC:N and only VI:L, but the public exploit is titled 'Stored XSS in Leantime Kanban Swimlane Headers Enables Privilege Escalation to Owner,' implying script execution in a higher-privileged (Owner) session - the real impact plausibly includes session/action hijacking beyond the low integrity impact scored. Net: prioritize as a standard authenticated stored-XSS with a privilege-escalation angle; patch promptly but it is not an emergency network-unauthenticated RCE.

Exploit ScenarioDerived

A low-privileged authenticated Leantime user sets a project, status, or ticket-type name containing a malicious HTML/JS payload, which getAllGrouped() embeds unescaped into a Kanban swimlane or list/table accordion header label. When a higher-privileged user (e.g., a project Owner) opens that board, the script executes in their session, enabling privilege escalation. A public proof-of-concept for this exact swimlane-header vector has been published.

Monitor Track and reassess. Why: LOW severity (CVSS 0.1-3.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Sep 21, 2026

Stored cross-site scripting in Leantime (up to and including 3.9.8) lets a low-privileged authenticated user inject HTML/JavaScript that executes in the browser of anyone who later views the affected Kanban, list, or table board. The root cause is the getAllGrouped() grouping-label function in app/Domain/Tickets/Services/Tickets.php, which concatenates user-controlled values such as project names, status labels, ticket types, milestone headlines, and editor names directly into labels that consumers render raw; the maintainers patched it by treating that switch as the escaping boundary (htmlspecialchars with ENT_QUOTES/UTF-8, plus a preg_replace sanitizer for the id used inside inline onclick handlers). Publicly available exploit code exists (a GitHub vulnerability-research write-up), but there is no indication of confirmed active exploitation, and the issue is assessed as moderate severity (CVSS 3.1: AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N) rather than critical, because it requires authenticated low-privileged access and a victim passively viewing the board for the stored payload to fire.

RemediationAI

Patch status: upstream fix available (PR/commit) - the escaping change is commit a30a6837b4071ac05a4f58d0e1baa2c62aa8695e in PR https://github.com/Leantime/leantime/pull/3767; a tagged release containing this commit was not independently confirmed from the provided data, so verify the changelog of the next Leantime release beyond 3.9.8 before relying on a version number. Until a patched build is deployed, apply the escaping boundary manually: wrap every user-controlled text value embedded in grouping labels with htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8') in the status, milestone, editor, ticket-type, and project branches of getAllGrouped(), cast editorId to int, and run the project-derived sortId through preg_replace('/[^a-zA-Z0-9_-]/', '_', ...) since it is interpolated into inline onclick JavaScript - the trade-off is that any legitimate markup previously embedded via project names will render as visible escaped text. Because exploitation requires an authenticated account that can set a grouping value (project name, status name, ticket type, milestone headline), reducing write access to those fields to trusted roles limits exposure, though it degrades self-service project management for regular users. A Content-Security-Policy that disallows inline script and blocks script sources outside the application origin would neutralize the inline-onclick injection vector and will break any legitimate inline JS widgets still in use, and a WAF rule filtering HTML/script payloads in project/status/milestone fields offers only superficial coverage since the payload is stored and served from the application itself. Note that public exploit code exists (https://github.com/natanmorette-thoropass/thoropass-vuln-research-program), so prioritize patching any internet-reachable Leantime instance even though there is no confirmed active exploitation (no CISA KEV entry identified at time of analysis).

Affected VersionsENISA

Leantime 3.9.3
Leantime 3.9.8
Leantime 3.9.0
Leantime 3.9.2
Leantime 3.9.1
Leantime 3.9.4
Leantime 3.9.6
Leantime 3.9.5
Leantime 3.9.7

Affected Packages

euvd leantime no fix

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

Leantime is an open-source PHP project-management application, and this is a CWE-79 improper-neutralization (stored XSS) flaw in the Kanban Board component. The vulnerable code path is Tickets::getAllGrouped($searchCriteria) in app/Domain/Tickets/Services/Tickets.php, which builds the 'label' string used to group tickets by status, milestone, editor, ticket type, or project. According to the upstream patch comments, every consumer of that label (Kanban swimlane headers, table/list accordion headers) renders it RAW because some legitimate branches deliberately embed markup such as a type icon or an assignee avatar image, so the switch in getAllGrouped() is supposed to act as the escaping boundary. Several branches failed to honor that contract: status names, milestone status labels, milestone headlines, editor first/last names, and ticket type were interpolated unescaped, and the project branch derived a $sortId value ('a_' . strtolower(projectName)) that templates interpolate into inline onclick JavaScript string literals, giving an additional DOM/JS-context injection surface. The fix applies htmlspecialchars((string) ..., ENT_QUOTES, 'UTF-8') to each user-controlled text fragment, casts the editor id to int, and applies preg_replace('/[^a-zA-Z0-9_-]/', '_', ...) to the sortId so only safe characters reach the JS string context. The CPE cpe:2.3:a:hyve5:leantime:*:*:*:*:*:*:*:* identifies the affected product family, with the affected range given as Leantime up to and including 3.9.8.

Know when Leantime gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (VulDB) PRIMARY 2.0 MEDIUM
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N/E:P
vuln.today AI 5.4 MEDIUM

Authenticated low-priv attacker (PR:L) stores a payload that fires when another user views the board (UI:R); XSS executing in a different security context is S:C with limited confidentiality/integrity impact (C:L/I:L).

3.1 AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
4.0 AV:N/AC:L/AT:N/PR:L/UI:P/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (VulDB).

CVSS VectorVendor: VulDB

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
Low
User Interaction
Passive
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
Low
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

3
Severity Changed
Sep 21, 2026 - 12:22 NVD
MEDIUM LOW
CVSS changed
Sep 21, 2026 - 12:22 NVD
5.1 (MEDIUM) 2.0 (LOW)
CVE Published
Sep 21, 2026 - 11:30 cve.org
MEDIUM 5.1

DescriptionCVE.org

A flaw has been found in Hyve5 Leantime up to 3.9.8. Affected by this vulnerability is the function getAllGrouped of the file app/Domain/Tickets/Services/Tickets.php of the component Kanban Board. This manipulation causes cross site scripting. The attack is possible to be carried out remotely. The exploit has been published and may be used. Patch name: a30a6837b4071ac05a4f58d0e1baa2c62aa8695e. To fix this issue, it is recommended to deploy a patch.

Threat Intelligence Overview

EPSS Score
0.2%
Top 89% exploitable
Prevalence
Medium
popular self-hosted open-source project-management application
Exploit
POC
Public exploit code exists
Data Quality
5 sources
Confidence: Medium
EUVD NVD CVE.org EPSS Vulnrichment GitHub VulDB

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity LOW
CISA KEV No
Public POC Yes
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
LOW severity (CVSS 0.1-3.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Low
Technical Impact
Partial

Priority Score

30
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +10
PoC: +20
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.

CVE-2024-27474 HIGH POC
8.8 Apr 10

Leantime 3.0.6 is vulnerable to Cross Site Request Forgery (CSRF). Rated high severity (CVSS 8.8), this vulnerability is

CVE-2026-66416 HIGH POC
8.6 Jul 30

Cross-site request forgery in Leantime 3.6.2 lets a remote unauthenticated attacker execute state-changing actions in th

CVE-2026-66415 HIGH POC
8.4 Jul 30

Server-side request forgery and local file inclusion in Leantime 3.6.2 lets authenticated attackers coerce the server in

CVE-2024-27705 HIGH POC
7.6 Apr 03

Cross Site Scripting vulnerability in Leantime v3.0.6 allows attackers to execute arbitrary code via upload of crafted P

CVE-2023-45826 MEDIUM POC
6.5 Oct 19

Leantime is an open source project management system. Rated medium severity (CVSS 6.5), this vulnerability is remotely e

CVE-2024-27477 MEDIUM POC
6.1 Apr 10

In Leantime 3.0.6, a Cross-Site Scripting vulnerability exists within the ticket creation and modification functionality

CVE-2024-27703 MEDIUM POC
5.4 Mar 13

Cross Site Scripting vulnerability in Leantime 3.0.6 allows a remote attacker to execute arbitrary code via the to-do ti

CVE-2026-66414 MEDIUM POC
5.1 Jul 30

Open redirect in Leantime 3.6.2's Login controller lets unauthenticated attackers craft login URLs where the `redirectUr

CVE-2026-85990 HIGH
8.8 Oct 13

Privilege escalation in Leantime prior to 3.10.0 allows an authenticated low-privilege user to create a full administrat

CVE-2026-76647 HIGH
8.8 Aug 19

Missing centralized authorization in Leantime's JSON-RPC API dispatcher (through v3.9.0) enables any authenticated user

CVE-2020-5292 HIGH
8.8 Mar 31

Leantime before versions 2.0.15 and 2.1-beta3 has a SQL Injection vulnerability. Rated high severity (CVSS 8.8), this vu

CVE-2024-27476 MEDIUM POC
4.7 Apr 10

Leantime 3.0.6 is vulnerable to HTML Injection via /dashboard/show#/tickets/newTicket. Rated medium severity (CVSS 4.7),

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