Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconAuthenticate as low-privilege project contributor
-
DeliveryUpload malicious Turbo Stream attachment to OpenProject
-
ExploitInject data-controller attribute into work package description via macro element
-
InstallVictim navigates to affected work package
-
C2Stimulus.js auto-mounts poll-for-changes controller
-
ExecuteController fetches attacker attachment and calls renderStreamMessage()
-
ImpactVictim browser executes redirect_to attacker-controlled server
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 attacker must hold a low-privilege authenticated account in the target OpenProject instance with at minimum the permission to edit work package descriptions in at least one project (typically Contributor or Member role). The attacker must also be able to upload attachments to the OpenProject instance, as the malicious Turbo Stream payload is hosted as an uploaded file. Exploitation of victim sessions requires those victims to navigate to and load the affected work package in a browser - they need not click any link or perform any further action once on the page. Exploitation is limited to the scope of users who have view access to the affected work package. Deployments where all project members are fully trusted internal users are at significantly lower risk. The |
| Impact | The official CVSS 3.1 vector AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N scores 6.4, and the S:C (scope change) reflects the cross-user nature of stored XSS correctly. However, the UI:N designation warrants scrutiny: a victim must navigate to the affected work package, which under NVD guidance typically qualifies as UI:R; accepting UI:N inflates the score slightly. Setting UI:R yields approximately 5.4 but does not reduce the operational threat. The PR:L requirement is the primary limiting factor - exploitation is gated on authenticated contributor-level access, excluding unauthenticated internet-based attacks. The scope change combined with no-victim-action-beyond-page-load means a single injected payload propagates to all project members who view the work package, amplifying blast radius in collaborative environments. EPSS data was not provided in the input and exploitation probability cannot be independently quantified here. No CISA KEV listing and no public POC exist at time of analysis, making this a credible but not confirmed-exploited threat. Real-world priority is elevated for multi-tenant OpenProject deployments where external collaborators or untrusted project members have edit access to work packages; low for tightly controlled internal-only deployments. |
| Exploit ScenarioDerived | An authenticated OpenProject project member with contributor-level access edits a work package description and injects |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Jun 26, 2026
Stored XSS in OpenProject's HTML sanitizer allows authenticated project contributors to execute arbitrary Turbo Stream actions - including forced redirects - in every other user's authenticated browser session. The sanitizer's :data wildcard for <macro> elements permits injection of data-controller attributes that Stimulus.js silently mounts, chaining an attacker-uploaded attachment through renderStreamMessage() to achieve cross-user session manipulation without victim interaction beyond viewing the work package. Patch-confirmed by vendor GitHub Security Advisory GHSA-q33w-f822-hg8x; no public exploit identified at time of analysis.
RemediationAI
Upgrade to OpenProject 17.3.3 (stable) or 17.4.1 (development) as confirmed by the vendor advisory at https://github.com/opf/openproject/security/advisories/GHSA-q33w-f822-hg8x. For deployments unable to upgrade immediately, restrict work package edit permissions to fully trusted internal users only - remove contributor-level access for external collaborators or untrusted accounts, which eliminates the attacker's ability to inject the malicious data-controller payload. As an additional compensating control, review and harden the deployment's Content Security Policy headers to restrict connect-src and frame-ancestors directives, which may partially limit the impact of Turbo Stream redirect_to actions by blocking attacker-controlled cross-origin destinations; however, CSP alone does not prevent the controller from mounting or fetching the attachment. Neither workaround substitutes for the patch, as the underlying sanitizer flaw remains exploitable by any user who retains edit access.
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
OpenProject's frontend stack combines Stimulus.js (a lightweight JavaScript framework that auto-mounts controllers based on data-controller DOM attributes) with Turbo Streams (a Rails-based protocol for server-driven DOM updates via HTML fragments). The vulnerable sanitizer permits <macro> HTML elements with arbitrary data-* attributes via a :data allowlist wildcard instead of an explicit allowlist of safe attribute names. Because Stimulus.js scans the entire DOM for data-controller attributes and mounts matching controllers automatically, injecting data-controller="poll-for-changes" into a sanitized work package description is sufficient to invoke a built-in controller. That controller fetches an attacker-uploaded attachment URL and passes its content to renderStreamMessage(), which processes arbitrary Turbo Stream actions including redirect_to. The root cause is CWE-79 (Improper Neutralization of Input During Web Page Generation), specifically an overly permissive sanitizer allowlist enabling persistent script-equivalent behavior without <script> tags. Affected products are identified by CPE cpe:2.3:a:opf:openproject:*:*:*:*:*:*:*:* covering all versions prior to the patched releases.
Know when Openproject 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:N/S:C/C:L/I:L/A:N
UI:R assigned because victims must navigate to the work package to trigger the payload, contra the official UI:N; all other metrics align with the provided vector.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
OpenProject is open-source, web-based project management software. Prior to 17.3.3 and 17.4.1, the HTML sanitizer grants <macro> elements unrestricted data-* attributes via :data wildcard. An attacker injects data-controller="poll-for-changes" into a work package description, causing Stimulus.js to mount a controller that fetches an attacker-uploaded attachment and passes it to renderStreamMessage(). This executes arbitrary Turbo Stream actions - including redirect_to - in every victim's authenticated browser session, redirecting them to an attacker-controlled server. This vulnerability is fixed in 17.3.3 and 17.4.1.
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.
More in Openproject
View allA SQL injection vulnerability in the activities API in OpenProject before 8.3.2 allows a remote attacker to execute arbi
OpenProject is web-based project management software. Rated high severity (CVSS 7.5), this vulnerability is remotely exp
OpenProject is open source project management software. Rated medium severity (CVSS 6.5), this vulnerability is remotely
Authenticated remote code execution affects the official openproject/openproject Docker image, which ships with a hardco
Cross-project folder hijacking in OpenProject before 17.3.3 and 17.4.1 lets a project-admin abuse an insecure direct obj
SQL injection in OpenProject's baseline-comparison (timestamps) functionality lets an authenticated, low-privileged user
OpenProject has a CVSS 9.9 command injection vulnerability allowing authenticated users to execute OS commands on the pr
Remote code execution in OpenProject before 17.3.3 and 17.4.1 arises from cache store poisoning, allowing an attacker wi
OpenProject, a web-based project management platform, contains a critical SQL injection vulnerability in versions prior
OpenProject (before 16.6.4) has a local file read vulnerability through SVG-based ImageMagick exploitation in the PDF ex
OpenProject's Repositories module contains a stored cross-site scripting (XSS) vulnerability that occurs when displaying
Token decryption in OpenProject 17.0 allows authenticated attackers to intercept and decrypt 24-hour authentication toke
EUVD-2026-39871
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB