Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as low-privileged user
-
DeliveryInject payload into group/status/project name field
-
ExploitPayload stored and rendered raw in board header label
-
ExecutionOwner views Kanban/list board
-
PersistScript executes in Owner session
-
ImpactPrivilege 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
Affected Packages
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
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
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).
Primary rating from Vendor (VulDB).
CVSS VectorVendor: VulDB
Lifecycle Timeline
3DescriptionCVE.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
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.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.
Leantime 3.0.6 is vulnerable to Cross Site Request Forgery (CSRF). Rated high severity (CVSS 8.8), this vulnerability is
Cross-site request forgery in Leantime 3.6.2 lets a remote unauthenticated attacker execute state-changing actions in th
Server-side request forgery and local file inclusion in Leantime 3.6.2 lets authenticated attackers coerce the server in
Cross Site Scripting vulnerability in Leantime v3.0.6 allows attackers to execute arbitrary code via upload of crafted P
Leantime is an open source project management system. Rated medium severity (CVSS 6.5), this vulnerability is remotely e
In Leantime 3.0.6, a Cross-Site Scripting vulnerability exists within the ticket creation and modification functionality
Cross Site Scripting vulnerability in Leantime 3.0.6 allows a remote attacker to execute arbitrary code via the to-do ti
Open redirect in Leantime 3.6.2's Login controller lets unauthenticated attackers craft login URLs where the `redirectUr
Privilege escalation in Leantime prior to 3.10.0 allows an authenticated low-privilege user to create a full administrat
Missing centralized authorization in Leantime's JSON-RPC API dispatcher (through v3.9.0) enables any authenticated user
Leantime before versions 2.0.15 and 2.1-beta3 has a SQL Injection vulnerability. Rated high severity (CVSS 8.8), this vu
Leantime 3.0.6 is vulnerable to HTML Injection via /dashboard/show#/tickets/newTicket. Rated medium severity (CVSS 4.7),
EUVD-2026-83890
GHSA-j9vw-9527-3hx6
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB