OpenProject: Stored XSS on openproject.example.com through /api/v3/projects/{project}/work_packages via POST parameter "description"
OpenProject is open-source, web-based project management software. Prior to 17.3.3 and 17.4.1, the HTML sanitizer grants 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.
- Products
- Not specified
- Affected versions
- Not specified
- Fixed versions
- Not specified
- CVEs
- CVE-2026-52781
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 8 Nov 2026, 01:36 UTC · Revision 1
Source evidence
OpenProject: Stored XSS on openproject.example.com through /api/v3/projects/{project}/work_packages via POST parameter "description"
core-osv · Original sourcePublished 26 Jun 2026, 19:00 UTC
OpenProject is open-source, web-based project management software. Prior to 17.3.3 and 17.4.1, the HTML sanitizer grants 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.
osv:CVE-2026-52781
Complete source record
{
"id": "7f262c82acdf91de2fbaf7d1f4a5ad1d723d431402d197e15858b27900dfe7d5",
"url": "https://osv.dev/vulnerability/CVE-2026-52781",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "OpenProject: Stored XSS on openproject.example.com through /api/v3/projects/{project}/work_packages via POST parameter \"description\"",
"summary": "OpenProject is open-source, web-based project management software. Prior to 17.3.3 and 17.4.1, the HTML sanitizer grants 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.",
"evidence": "osv:CVE-2026-52781",
"products": [],
"severity": "medium",
"structured": {
"id": "CVE-2026-52781",
"aliases": [
"CVE-2026-52781",
"GHSA-q33w-f822-hg8x"
],
"metrics": [
{
"type": "CVSS_V3",
"score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N"
}
],
"affected": [
{
"ranges": [
{
"repo": "https://github.com/opf/openproject",
"type": "GIT",
"events": [
{
"introduced": "0"
},
{
"fixed": "5ee515c5c80c3aaf1e7527f63e4e69798aef1b29"
},
{
"introduced": "57fb3abf08b0075149e7abe7dbf5de99e07aee06"
},
{
"fixed": "8203fc2286fd48d7d72f52b3c4a2487f96fcea28"
}
],
"database_specific": {
"extracted_events": [
{
"range": [
{
"introduced": "0"
},
{
"fixed": "17.3.3"
}
],
"source": "AFFECTED_FIELD",
"strategy": "StringRangeExpression"
},
{
"range": [
{
"introduced": "17.4.0"
},
{
"fixed": "17.4.1"
}
],
"source": "AFFECTED_FIELD",
"strategy": "StringRangeExpression"
}
]
}
}
],
"versions": [
"v17.3.1",
"v17.4.0",
"v17.3.2",
"11.2.1",
"v10.5",
"v9.0.0-pre",
"v5.0.4",
"sprint/2015_04",
"sprint/2015_03",
"sprint/2015_02",
"sprint/2015_01",
"sprint/2014_18",
"sprint/2014_16",
"sprint/2014_13",
"sprint/2014_12",
"sprint/2014_11",
"sprint/2014_10",
"sprint/2014_09",
"sprint/2014_08",
"2.4.0"
],
"database_specific": {
"source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-52781.json"
}
}
],
"modified": "2026-10-28T02:30:52.484438369Z",
"provider": "osv",
"references": [
"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/52xxx/CVE-2026-52781.json",
"https://github.com/opf/openproject/security/advisories/GHSA-q33w-f822-hg8x",
"https://nvd.nist.gov/vuln/detail/CVE-2026-52781"
],
"provider_metadata": {
"cwe_ids": [
"CWE-79"
],
"cna_assigner": "GitHub_M",
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/52xxx/CVE-2026-52781.json"
}
},
"related_cves": [
{
"value": "CVE-2026-52781",
"evidence": "/id"
}
],
"security_relevant": true,
"severity_evidence": "/severity/0/score"
},
"source_id": "core-osv",
"document_id": 521403,
"published_at": "2026-06-26T19:00:10.717+00:00"
}