CVE-2026-23625

8.7 HIGH

📋 TL;DR

OpenProject versions 16.3.0 through 16.6.4 have a stored cross-site scripting vulnerability in the Roadmap view that allows attackers to inject malicious HTML/JavaScript via subproject names. This affects all users of affected OpenProject installations, potentially compromising user sessions and data. The vulnerability is mitigated by proper content security headers that were missing due to a configuration change.

💻 Affected Systems

Products:
  • OpenProject
Versions: 16.3.0 through 16.6.4
Operating Systems: All
Default Config Vulnerable: ⚠️ Yes
Notes: Only affects installations where Roadmap view is accessible and subprojects with user-controlled names exist.

📦 What is this software?

⚠️ Risk & Real-World Impact

🔴

Worst Case

Attackers could steal session cookies, perform actions as authenticated users, redirect to malicious sites, or install malware on user systems through client-side attacks.

🟠

Likely Case

Session hijacking, credential theft, and unauthorized actions performed in the context of authenticated users who view the Roadmap.

🟢

If Mitigated

With proper X-Content-Type-Options header, modern browsers will block script execution, preventing most exploitation attempts.

🌐 Internet-Facing: HIGH
🏢 Internal Only: MEDIUM

🎯 Exploit Status

Public PoC: ✅ No
Weaponized: UNKNOWN
Unauthenticated Exploit: ✅ No
Complexity: LOW

Exploitation requires ability to create/modify subproject names and for victims to view the Roadmap. The vulnerability is stored XSS, making it persistent.

🛠️ Fix & Mitigation

✅ Official Fix

Patch Version: 16.6.5 or 17.0.0

Vendor Advisory: https://github.com/opf/openproject/security/advisories/GHSA-cvpq-cc56-gwxx

Restart Required: Yes

Instructions:

1. Backup your OpenProject installation and database. 2. Upgrade to OpenProject 16.6.5 or 17.0.0 using your package manager or manual installation. 3. Restart the OpenProject service. 4. Verify the X-Content-Type-Options: nosniff header is present in responses.

🔧 Temporary Workarounds

Add X-Content-Type-Options Header via Proxy

all

Configure your web server or reverse proxy to add X-Content-Type-Options: nosniff header to all OpenProject responses.

# For nginx: add 'add_header X-Content-Type-Options nosniff;' to server block
# For Apache: add 'Header set X-Content-Type-Options nosniff' to config

🧯 If You Can't Patch

  • Restrict access to Roadmap view to trusted users only
  • Audit and sanitize all subproject names for HTML/script content

🔍 How to Verify

Check if Vulnerable:

Check if OpenProject version is between 16.3.0 and 16.6.4 inclusive, and verify Roadmap view renders subproject names without HTML escaping.

Check Version:

Check OpenProject admin interface or run: openproject run bundle exec rails runner 'puts OpenProject::VERSION.to_s'

Verify Fix Applied:

Verify version is 16.6.5 or higher, and check HTTP responses contain X-Content-Type-Options: nosniff header.

📡 Detection & Monitoring

Log Indicators:

  • Unusual subproject name creation/modification containing HTML/script tags
  • Multiple failed authentication attempts following Roadmap view access

Network Indicators:

  • HTTP requests to external domains from OpenProject Roadmap pages
  • Unexpected JavaScript execution in Roadmap context

SIEM Query:

source="openproject" AND (event="project_update" AND name=~"<.*>") OR (event="page_view" AND path="/roadmap" AND referer=null)

🔗 References

📤 Share & Export