/

CVE-2026-104979

Severity:

HIGH RISK

(8.7)

Stored XSS (CWE-79) in Plane Intake Issue Viewset Endpoint

CVE-2026-104979

Deferred

Vulnerability type

Category:

Stored Cross-Site Scripting

CWE:

CWE-79, CWE-862

Impact:

Session compromise and sensitive data disclosure

Severity:

HIGH RISK

(8.7)

CVSS version:

3.1

Catch this CVE while code is being written

Detect vulnerable code directly in pull requests, so CVEs are fixed before merge.

Summary

Plane contains a stored cross-site scripting vulnerability in the public intake issue creation flow because submitted HTML is stored without the expected sanitization. An authenticated user may plant a malicious link in an eligible project, and a project member or viewer who activates it could execute JavaScript in their session and expose sensitive session data.

Plane contains a stored cross-site scripting vulnerability in the public intake issue creation flow because submitted HTML is stored without the expected sanitization. An authenticated user may plant a malicious link in an eligible project, and a project member or viewer who activates it could execute JavaScript in their session and expose sensitive session data.

Affected context

The issue occurs in Plane deployments where:

  • The public intake feature is enabled for a project
  • The project has a published DeployBoard
  • User-supplied issue descriptions are persisted as HTML without effective sanitization
  • Project members or viewers can access the affected intake item and interact with its content

Exploitation depends on a victim viewing and activating the planted content in a browser session with useful privileges.

The issue occurs in Plane deployments where:

  • The public intake feature is enabled for a project
  • The project has a published DeployBoard
  • User-supplied issue descriptions are persisted as HTML without effective sanitization
  • Project members or viewers can access the affected intake item and interact with its content

Exploitation depends on a victim viewing and activating the planted content in a browser session with useful privileges.

Exploit preconditions

  • Attack surface: Authenticated public intake issue creation
  • Required access: An authenticated Plane account; workspace membership may not be required when the intake configuration permits submission
  • Target condition: A project with a published DeployBoard and intake enabled
  • Trigger point: A project member or viewer opens the stored intake item and clicks the malicious link
  • Why exploitation is possible: The submitted description HTML is persisted without the intended sanitization, while client-side link handling permits script execution in the viewer's session
  • Attack surface: Authenticated public intake issue creation
  • Required access: An authenticated Plane account; workspace membership may not be required when the intake configuration permits submission
  • Target condition: A project with a published DeployBoard and intake enabled
  • Trigger point: A project member or viewer opens the stored intake item and clicks the malicious link
  • Why exploitation is possible: The submitted description HTML is persisted without the intended sanitization, while client-side link handling permits script execution in the viewer's session

Why this happens

The vulnerable flow writes attacker-controlled description_html directly during issue creation without applying the application's HTML sanitization and validation routine. This is a stored cross-site scripting condition mapped to CWE-79, because untrusted markup is later rendered and interpreted in another user's browser.

The issue also reflects an authorization weakness associated with CWE-862: the intake creation path permits users without the expected workspace membership relationship to introduce content into a project context. Together, insufficient authorization and incomplete output sanitization broaden the set of users who can plant persistent browser-executable content.

The vulnerable flow writes attacker-controlled description_html directly during issue creation without applying the application's HTML sanitization and validation routine. This is a stored cross-site scripting condition mapped to CWE-79, because untrusted markup is later rendered and interpreted in another user's browser.

The issue also reflects an authorization weakness associated with CWE-862: the intake creation path permits users without the expected workspace membership relationship to introduce content into a project context. Together, insufficient authorization and incomplete output sanitization broaden the set of users who can plant persistent browser-executable content.

Potential impact

  • A victim's browser session may execute attacker-controlled JavaScript
  • Long-lived API tokens or other accessible session data could be disclosed
  • An attacker could perform actions available to the victim's account
  • Project data may be modified, exposed, or poisoned
  • The issue could facilitate further compromise of connected services
  • A victim's browser session may execute attacker-controlled JavaScript
  • Long-lived API tokens or other accessible session data could be disclosed
  • An attacker could perform actions available to the victim's account
  • Project data may be modified, exposed, or poisoned
  • The issue could facilitate further compromise of connected services

General mitigation guidance

Mitigation generally focuses on enforcing both authorization and content-safety controls at the server boundary.

Common defensive patterns include:

  • Apply a well-maintained HTML sanitizer such as the application's intended restricted sanitizer before persistence or rendering
  • Prefer plain text or a narrowly defined markup allowlist for intake descriptions
  • Treat all client-submitted HTML as untrusted, including fields named or represented as pre-rendered HTML
  • Normalize and validate links, schemes, targets, and event-related attributes before storage and display
  • Enforce workspace and project authorization independently of client-side visibility controls
  • Use short-lived, scoped tokens and avoid exposing long-lived credentials to browser-accessible contexts
  • Apply browser defenses such as an appropriate Content Security Policy as defense in depth
  • Run intake and viewer roles with the minimum permissions required

Mitigation generally focuses on enforcing both authorization and content-safety controls at the server boundary.

Common defensive patterns include:

  • Apply a well-maintained HTML sanitizer such as the application's intended restricted sanitizer before persistence or rendering
  • Prefer plain text or a narrowly defined markup allowlist for intake descriptions
  • Treat all client-submitted HTML as untrusted, including fields named or represented as pre-rendered HTML
  • Normalize and validate links, schemes, targets, and event-related attributes before storage and display
  • Enforce workspace and project authorization independently of client-side visibility controls
  • Use short-lived, scoped tokens and avoid exposing long-lived credentials to browser-accessible contexts
  • Apply browser defenses such as an appropriate Content Security Policy as defense in depth
  • Run intake and viewer roles with the minimum permissions required

How teams detect issues like this

High-level detection can include:

  • Static analysis searches for direct persistence of request-supplied HTML fields without sanitizer calls
  • Code review checks that every create and update path applies consistent server-side validation
  • Tests that submit disallowed tags, URL schemes, targets, and encoded markup through intake endpoints
  • Authorization tests for users with no workspace membership and for project viewer roles
  • Monitoring for suspicious links or unexpected HTML in issue descriptions
  • Policy enforcement requiring approved sanitization libraries and centralized authorization checks
  • Automated security review tools can help identify unsafe HTML sinks and missing access-control checks

High-level detection can include:

  • Static analysis searches for direct persistence of request-supplied HTML fields without sanitizer calls
  • Code review checks that every create and update path applies consistent server-side validation
  • Tests that submit disallowed tags, URL schemes, targets, and encoded markup through intake endpoints
  • Authorization tests for users with no workspace membership and for project viewer roles
  • Monitoring for suspicious links or unexpected HTML in issue descriptions
  • Policy enforcement requiring approved sanitization libraries and centralized authorization checks
  • Automated security review tools can help identify unsafe HTML sinks and missing access-control checks

Sources

SourceLink
github.comgithub.com/makeplane/plane/commit/0d58adb69d859fc94c43b9d68fadd77e810d5ed1
github.comgithub.com/makeplane/plane/pull/9287
github.comgithub.com/makeplane/plane/releases/tag/v1.4.0
github.comgithub.com/makeplane/plane/security/advisories/GHSA-hh2r-3hwp-mvq3

Frequently asked

questions

An authenticated user may be able to plant content when the target project exposes an enabled public intake flow. Workspace membership is not necessarily required, depending on the deployment's intake configuration.

Yes. The stored content generally requires a project member or viewer to open the affected item and activate the malicious link in a browser session.

Sanitize and validate submitted HTML on the server using a restrictive allowlist, validate URL schemes and link attributes, and ensure the same controls apply to every create and update path.

Combine centralized output and input sanitization with explicit project-level authorization tests, secure browser policies, scoped credentials, and regression tests for both authenticated and unaffiliated intake users.

An authenticated user may be able to plant content when the target project exposes an enabled public intake flow. Workspace membership is not necessarily required, depending on the deployment's intake configuration.

Yes. The stored content generally requires a project member or viewer to open the affected item and activate the malicious link in a browser session.

Sanitize and validate submitted HTML on the server using a restrictive allowlist, validate URL schemes and link attributes, and ensure the same controls apply to every create and update path.

Combine centralized output and input sanitization with explicit project-level authorization tests, secure browser policies, scoped credentials, and regression tests for both authenticated and unaffiliated intake users.

Find out what's already
exploitable in your codebase.