Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as low-privileged user
-
DeliverySet malicious payload in record name field
-
ExploitPayload stored unsanitized, rendered in MRU panel
-
ExecutionAdmin views record, JavaScript executes in their session
-
ImpactSteal session cookie, escalate to full admin control
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 | Requires a valid low-privileged authenticated OpenCATS account (before v0.12.0) that can create or rename a Candidate, Company, Contact, Job Order, or List; the attacker places an HTML/JavaScript payload in that name/title field, which lib/MRU.php's getFormatted() stores unsanitized and renders unescaped in the 'Recent' (MRU) navigation panel shown on nearly every page. Exploitation is LIMITED by three factors: (1) an authenticated account is required (PR:L), so this is not remote-unauthenticated; (2) a second user must actually view the poisoned record for the script to fire (UI:P), making it a stored/second-order trigger; (3) meaningful escalation depends on the viewing user being privileged (e.g. a Site Administrator) for session theft to yield full administrative control. The payload must also fit within the MRU item length limit (MRU_ITEM_LENGTH), as shown by the vendor's test harness. |
| Impact | This is a genuine but moderate-priority issue, not a drop-everything emergency, and the signals are internally consistent. The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:L/UI:P) describes a network-reachable, low-complexity stored XSS that requires a low-privileged authenticated account (PR:L) and passive victim interaction (UI:P) - someone must view the poisoned 'Recent' panel. The vendor-supplied score of 6.3 (Medium) is driven by the subsequent-system impact (SC:H/SI:H) rather than direct impact (VC:N/VI:N/VA:N), reflecting that the real damage is session/cookie theft and privilege escalation in the victim's browser context rather than a direct compromise of the vulnerable component itself. The vuln.today decision label is 'this_month', consistent with a patchable authenticated flaw that is not under active exploitation. No EPSS score was provided and there is no KEV listing, so there is no evidence of in-the-wild exploitation. No standalone exploit/PoC reference is present - only the fix commit, the release, and a VulnCheck advisory - so the realistic risk is targeted abuse by an insider or a compromised low-privilege account rather than widespread opportunistic attacks. The escalation path is real and well-evidenced by source code (the fix wraps dataItemText in Template::escapeHtml), so defenders with multi-user OpenCATS instances should patch within a normal maintenance window. |
| Exploit ScenarioDerived | A low-privileged authenticated OpenCATS user creates or renames a Candidate, Company, Contact, Job Order, or List so its name contains a JavaScript payload (e.g. an svg/onload handler). Because the name is stored unsanitized and later rendered unescaped in the 'Recent' (MRU) navigation panel shown on nearly every page, the script executes in the browser of any other user - including a Site Administrator - who views that record, enabling session/cookie theft and takeover of the admin account. No public exploit identified at time of analysis, though the fix commit and VulnCheck advisory describe the mechanism precisely. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 22, 2026
Stored cross-site scripting in OpenCATS before 0.12.0 lets a low-privileged authenticated user plant HTML/JavaScript in the name or title field of a Candidate, Company, Contact, Job Order, or List, which lib/MRU.php's getFormatted() stores unsanitized and renders unescaped in the 'Recent' (MRU) navigation panel present on nearly every page. The script fires only when another user opens or views the poisoned record, so exploitation is a second-order trigger limited by the need for a valid account (PR:L) and by victim interaction (UI:P); meaningful privilege escalation depends on the viewer holding elevated rights such as Site Administrator, in which case session/cookie theft could yield administrative control. Impact is assessed as moderate (CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N, scope changed) and no public exploit code or active exploitation was identified at time of analysis; the vendor has released 0.12.0 with the escaping fix.
RemediationAI
Upgrade to OpenCATS 0.12.0 (https://github.com/opencats/OpenCATS/releases/tag/v0.12.0), which contains the vendor-released fix for this issue. If an immediate full upgrade is not possible, backport the output-encoding change from commit f82e0ee3045845b90b7e111c46f30998496e38a8, which wraps the MRU item text in Template::escapeHtml($rs[$rowIndex]['dataItemText']) inside lib/MRU.php's getFormatted(); keep the existing truncation-then-escape ordering, since escaping after truncation is what the vendor's MRUTest.php asserts and cutting an escaped entity mid-sequence would corrupt display. Applying the change is low-risk because the regression tests confirm benign text, UTF-8 names, and the length boundary render identically, and the only behavior change is that stored angle brackets appear as literal text in the Recent panel. Note that the MRU_ITEM_LENGTH cap is not a mitigation and should not be treated as one, and detection ahead of patching can focus on record names/titles containing HTML or script markup that surface in the Recent navigation list; the vendor reference is https://www.vulncheck.com/advisories/opencats-before-stored-xss-via-mru-navigation-panel.
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
OpenCATS is a PHP-based open-source applicant tracking system, and the flaw is a classic CWE-79 stored/second-order XSS rooted in output encoding rather than input validation. The MRU class in lib/MRU.php builds the 'Recent' items list shown across the application; getFormatted() concatenated the raw dataItemText value directly into an anchor element (<a href="..." style="text-decoration: none;">dataItemText</a>) without HTML-escaping it, so any markup stored in a record name/title was interpreted by the browser of every user viewing the panel. The upstream fix in commit f82e0ee3045845b90b7e111c46f30998496e38a8 wraps the value with Template::escapeHtml() at render time, and the accompanying MRUTest.php (built on an AuthorizationTestCase) asserts that '<svg/onload=alert()>' becomes '<svg/onload=alert()>', that benign UTF-8 text such as 'Jane Müller' survives unchanged, and that truncation to MRU_ITEM_LENGTH happens before escaping so the escaped output is not cut mid-entity. That length cap constrains payload size but, per the vendor tests, is not a defense; the CPE cpe:2.3:a:opencats:opencats:*:*:*:*:*:*:*:* covers all releases prior to 0.12.0. Scope is changed in the assessed vector because the injected script executes in the victim's session context rather than the attacker's.
Know when Opencats 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
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:N/VA:N/SC:H/SI:H/SA:N
Low-privileged account can inject (PR:L); a victim must render the MRU panel (UI:R); the script runs in the victim's browser context, changing scope (S:C) with limited confidentiality/integrity impact via session theft.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
DescriptionCVE.org
OpenCATS before 0.12.0 contains a stored cross-site scripting vulnerability that allows a low-privileged authenticated user to inject HTML/JavaScript payloads by setting a Candidate, Company, Contact, Job Order, or List name/title field, which is stored unsanitized and later rendered unescaped in the 'Recent' (MRU) navigation panel displayed on nearly every page via lib/MRU.php's getFormatted() function. Attackers can exploit this by crafting a malicious record name that executes arbitrary JavaScript in the session of any other user, including Site Administrators, who views the record, enabling session/cookie theft and privilege escalation to full administrative control.
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.
Privilege escalation occurs when an attacker leverages flaws in access control mechanisms to gain permissions beyond what they were originally granted.
Remote code execution in OpenCATS installer allows unauthenticated attackers to inject and execute arbitrary PHP code by
OpenCATS v0.9.6 was discovered to contain a remote code execution (RCE) vulnerability via the getDataGridPager's ajax fu
OpenCATS through 0.9.6 allows remote attackers to execute arbitrary code by uploading an executable file via lib/FileUti
OpenCATS through 0.9.5-3 unsafely deserializes index.php?m=activity requests, leading to remote code execution. Rated cr
OpenCATS 0.9.4 contains a remote code execution vulnerability that allows unauthenticated attackers to execute arbitrary
SQL injection in OpenCATS through 0.9.7.4 allows authenticated users to extract arbitrary database contents by injecting
lib/DocumentToText.php in OpenCats before 0.9.4-3 has XXE that allows remote users to read files on the underlying opera
OpenCATS v0.9.6 was discovered to contain a SQL injection vulnerability via the importID parameter in the Import viewerr
OpenCATS v0.9.6 was discovered to contain a SQL injection vulnerability via the tag_id variable in the Tag deletion func
OpenCATS v0.9.6 was discovered to contain a SQL injection vulnerability via the entriesPerPage variable. Rated medium se
OpenCATS v0.9.6 was discovered to contain a SQL injection vulnerability via the tag_id variable in the Tag update functi
Improper neutralization of input during web page generation allows an unauthenticated attacker to submit malicious Javas
EUVD-2026-108259
GHSA-7q62-4fwp-9cr6
NVD
CVE.org
EPSS
VulDB
Exploit-DB