Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessRegister low-privilege authenticated account
-
DeliverySubmit intake issue with malicious description_html
-
ExploitVictim opens closed intake item and clicks planted link
-
ExecutionTipTap javascript: parser bypass executes JS in session
-
ImpactExfiltrate victim's long-lived API token
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 | The target project must have a published DeployBoard with intake enabled - a non-default, public-facing configuration; without it the IntakeIssuePublicViewSet.create path is not reachable. The attacker needs any authenticated account (PR:L), including a brand-new user with zero workspace memberships, so the authentication bar is minimal. Successful token theft further requires a victim who is a project member or viewer to open the closed intake item and click the attacker-planted link (UI:R), which limits reliability and makes this opportunistic rather than guaranteed. Affected builds are Plane up to and including 1.3.1; upgrading to 1.4.0 removes the flaw. |
| Impact | This is a credible, well-substantiated stored XSS (CWE-79) in Plane's intake flow, confirmed by vendor advisory GHSA-hh2r-3hwp-mvq3 and a source-level patch (PR #9287). The CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N, 8.7) is internally consistent with the description: network-reachable, low attacker complexity, requires only a low-privilege authenticated account (PR:L - even a new user with no workspace membership), needs victim interaction (UI:R - a member or viewer must click the planted link), and the scope change (S:C) plus high C/I reflect JavaScript executing in the victim's authenticated session and exfiltrating a long-lived API token. Signals partly conflict on real-world urgency: no EPSS score is present in the input, the CVE is NOT in CISA KEV, and no public exploit was provided, so exploitation is not confirmed active - yet the advisory documents a concrete, specific bypass (the TipTap javascript: parser bypass plus the target="_self" click handler) and a token-theft payoff, raising practical exploitability for a motivated attacker. Two mitigating realities temper the score: exploitation depends on a non-default configuration (a published DeployBoard with intake enabled) and on a victim clicking an attacker-planted link. Net: a real priority for self-hosted Plane operators exposing public intake, but not a mass-exploitation emergency given the authentication requirement, required user interaction, and non-default prerequisite. |
| Exploit ScenarioDerived | An attacker registers a low-privilege Plane account (or uses an existing one with no workspace membership) and submits an intake issue containing crafted description_html with a javascript: link that bypasses the TipTap parser. When a legitimate project member or viewer opens the closed intake item and clicks the planted link, the JavaScript runs in their authenticated session and exfiltrates their long-lived API token. No public exploit was identified, but a detailed vendor advisory and the fix diff clearly document the technique. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 05, 2026
Stored cross-site scripting in Plane (versions up to and including 1.3.1) allows any authenticated user - including a brand-new account with no workspace memberships - to plant arbitrary HTML in a project that has a published DeployBoard with intake enabled, because the public intake endpoint writes description_html without sanitization. When a project member or viewer opens the affected closed intake item and clicks the attacker-planted link, a TipTap javascript: parser bypass and a target="_self" click handler execute JavaScript in the victim's session and exfiltrate a long-lived API token. The issue is fixed in 1.4.0 per vendor advisory GHSA-hh2r-3hwp-mvq3 and upstream patch PR #9287; no public exploit identified at time of analysis.
RemediationAI
Upgrade to Plane 1.4.0, the vendor-released fixed version, which introduces validate_html_content sanitization on the intake create paths and comment serializer (upstream fix in PR https://github.com/makeplane/plane/pull/9287, commit 0d58adb69d859fc94c43b9d68fadd77e810d5ed1); consult advisory GHSA-hh2r-3hwp-mvq3 and the release notes at https://github.com/makeplane/plane/releases/tag/v1.4.0. If immediate upgrade is not possible, disable the intake feature on any published DeployBoard or unpublish DeployBoards entirely - this removes the public anonymous/authenticated write path that plants the payload, at the cost of losing public intake submissions; alternatively, restrict who can publish DeployBoards and audit existing intake items for planted anchor tags or javascript: URIs before members view them. Because the token theft relies on a victim clicking a crafted link inside a closed intake item, treat long-lived API tokens as potentially compromised if a project ran a published DeployBoard with intake enabled on a vulnerable version, and rotate them after patching. Enforcing a Content-Security-Policy that disallows inline script and blocks javascript: navigation provides defense-in-depth but may break legitimate TipTap-rendered content and should be tested before rollout.
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
The flaw is a stored cross-site scripting (CWE-79) rooted in inconsistent HTML input handling in Plane's Python/Django backend. Plane's intake endpoints (IntakeIssuePublicViewSet.create in the space API, and the corresponding API-app views) construct issue records via Issue.objects.create(...) and pass the caller-supplied description_html straight through, bypassing the project's nh3-based sanitizer wrapper validate_html_content that other code paths (such as comment_html handling) use. The upstream patch adds validate_html_content calls in apps/api/plane/api/views/intake.py, apps/api/plane/space/views/intake.py, and the app/api issue serializers, replacing an older, weaker lxml html.fromstring/html.tostring round-trip used for comment_html that merely re-serialized markup rather than sanitizing it. On the client side, the TipTap rich-text editor's handling of javascript: URIs provides a parser bypass, and a target="_self" click handler ensures payload execution stays in the current origin, which is why the CVSS vector carries S:C (scope change) and the confidentiality/integrity impacts are High while availability is None. The CPE cpe:2.3:a:makeplane:plane:*:*:*:*:*:*:*:* confirms the affected component is the makeplane/plane application itself rather than a third-party dependency.
Know when Plane 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
AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N
Any authenticated user can plant the payload (PR:L) over the network (AV:N, AC:L); a victim must click the link (UI:R); XSS runs in the victim's session crossing authority (S:C), stealing a token and allowing actions (C:H/I:H), with no availability impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
Plane is an open-source project management tool. Prior to 1.4.0, IntakeIssuePublicViewSet.create in Plane v1.3.1 writes description_html through Issue.objects.create(...) without calling validate_html_content from nh3. Any authenticated user, including a new user with no workspace memberships, can plant arbitrary HTML in a project that has a published DeployBoard with intake enabled. When a project member or viewer of a closed intake item clicks the planted link, the TipTap \tjavascript: parser bypass and the target="_self" click handler execute JavaScript in the viewer's session and exfiltrate a long-lived API token. This issue is fixed in 1.4.0.
Technical POC Analysis
Stored cross-site scripting (CWE-79), compounded by a missing authorization check (CWE-862, also flagged in the advisory).
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Plane deployments running versions up to and including 1.3.1 contain a stored cross-site scripting flaw in the public DeployBoard intake workflow, where content planted through the intake endpoint executes in the browser session of project members and viewers who open the affected item. Successful exploitation allows a long-lived API token to be exfiltrated, giving an attacker durable, browser-independent access to project data and workspace functions. Any organization using Plane to track projects, roadmaps, or internal plans should treat this as a high-priority remediation because the compromise path runs through ordinary day-to-day user activity rather than a perimeter weakness.
Upgrade to Plane 1.4.0 per vendor advisory GHSA-hh2r-3hwp-mvq3. Until the upgrade is complete, disable public intake on all published DeployBoards or unpublish those boards, restrict who can view closed intake items, sanitize or escape description_html before it is rendered, and rotate all long-lived API tokens for affected workspaces. Exploitation status: no public exploit identified at time of analysis.
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.
Plane version 0.7.1 allows an unauthenticated attacker to view all stored server files of all users. Rated high severity
Authenticated users who can create a workspace in Plane can force the application's background worker to fetch internal-
Unauthenticated remote attackers can forge Django-signed session cookies, CSRF tokens, and password-reset tokens, and by
Workspace invitation hijacking in Plane prior to 1.4.0 lets an unauthenticated attacker take over a pending workspace in
Plane is an open-source project management tool. Rated medium severity (CVSS 5.8), this vulnerability is remotely exploi
Improper authorization in Plane before 1.4.0 lets an authenticated workspace Guest hijack file assets from other project
Account takeover in Plane (makeplane) versions prior to 1.4.0 allows remote unauthenticated attackers to log in as exist
Brute-forceable magic-code email login in Plane versions prior to 1.4.0 allows unauthenticated remote attackers to guess
Server-side request forgery in Plane, the open-source project management tool, allows a low-privilege user of a connecte
Authenticated cross-workspace access control bypass in Plane (makeplane/plane) before version 1.4.0 lets any user with a
Plane prior to 1.4.0 allows an authenticated workspace member to bypass project-level authorization and join any project
Stored cross-site scripting in Plane prior to 1.4.0 lets an authenticated low-privilege workspace member - including a G
EUVD-2026-92538
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB