OpenEMR
CVE-2026-46518
HIGH
Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconRegister or log in to patient portal
-
DeliverySend PUT api/patient/:num with HTML payload in name/address
-
ExploitPayload stored in patient_data, audit review bypassed
-
InstallClinician opens prescription multi-print view
-
C2multiprintcss_header() renders payload unencoded
-
ExecuteScript executes in clinician's authenticated session
-
ImpactExfiltrate CSRF/session and act as clinician
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 (1) an authenticated patient portal account on the target OpenEMR instance (PR:L) with permission to call the PUT api/patient/:num REST endpoint, (2) the OpenEMR patient portal and REST API to be enabled and reachable by the attacker, and (3) a clinician to subsequently open the prescription CSS/HTML multi-print view for the attacker-controlled patient record (UI:R) so multiprintcss_header() renders the unsanitized name/address. Limiting factors: exploitation is not automatable (SSVC Automatable:no) because it depends on a clinician action against a specific patient; instances that do not expose the patient portal externally, that disable self-registration, or that do not use the prescription multi-print feature are substantially less exposed. |
| Impact | Signals are mixed but coherent. CVSS 8.7 (AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N) reflects a network-reachable stored XSS that needs only a low-privileged portal account and a clinician opening the prescription print view, with scope change because execution moves from the portal trust zone into the clinician UI. EPSS 0.03% (9th percentile) and SSVC Exploitation:poc / Automatable:no / Technical Impact:partial indicate this is unlikely to be sprayed at scale - exploitation needs an existing patient relationship and a clinician interaction. There is no public exploit identified at time of analysis and the issue is not in CISA KEV. Net assessment: not a 'drop everything' emergency for mass exploitation, but a high-priority patch for any OpenEMR instance exposing the patient portal externally, because successful exploitation cleanly hijacks a clinician session in a regulated PHI environment. UI:R is real (a clinician must open the multi-print view), which is the main mitigating factor. |
| Exploit ScenarioDerived | A registered patient portal user (or attacker who self-registers, where permitted) calls PUT api/patient/:num with a name or address field containing a script payload such as an event-handler-bearing image tag, bypassing the normal audit-review queue. Later, a clinician opens the prescription CSS/HTML multi-print view for that patient; the payload executes in the clinician's authenticated OpenEMR session and exfiltrates the CSRF token and session cookie, or issues authenticated requests (create users, modify records) on the clinician's behalf. SSVC marks exploitation as POC and no public exploit is identified at time of analysis. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv3 – Jun 11, 2026
Stored cross-site scripting in OpenEMR before 8.0.0.1 lets an authenticated patient portal user inject HTML/JavaScript into demographic fields via the PUT api/patient/:num endpoint, which fires later in a clinician's authenticated session when the prescription CSS/HTML multi-print feature renders the patient name and address without output encoding. Because the payload executes inside the main OpenEMR UI under the clinician's session, the attacker crosses the patient-to-clinician trust boundary and can steal CSRF tokens, exfiltrate session data, and perform privileged actions as the clinician. SSVC currently rates exploitation as POC, no public exploit identified at time of analysis, and EPSS is 0.03% (9th percentile), but the cross-tenant trust crossing in a healthcare app makes the issue material for any internet-exposed deployment.
Earlier versions of this analysis (2)
Stored cross-site scripting in OpenEMR prior to 8.0.0.1 lets an authenticated patient portal user inject arbitrary JavaScript that executes inside a clinician's authenticated session when the prescription CSS/HTML multi-print feature renders patient demographics. SSVC classifies exploitation as POC with partial technical impact, and no public exploit code has been identified at time of analysis; EPSS is very low (0.03%) consistent with a targeted, authenticated cross-tenant attack rather than mass exploitation.
Stored cross-site scripting in OpenEMR prior to version 8.0.0.1 allows portal patients to inject persistent JavaScript that executes in an authenticated clinician's browser session, crossing the patient-to-clinician trust boundary. The flaw resides in the prescription multi-print feature where patient demographic fields render without output encoding, and the PUT api/patient/:num endpoint lets portal users write attacker-controlled HTML directly into patient_data, bypassing the intended audit review workflow. No public exploit identified at time of analysis, though the vendor advisory (GHSA-4gh4-q39r-45wf) documents the issue and CVSS 7.7 reflects the cross-scope impact.
RemediationAI
Vendor-released patch: upgrade OpenEMR to 8.0.0.1 or later, as described in advisory https://github.com/openemr/openemr/security/advisories/GHSA-4gh4-q39r-45wf. If immediate upgrade is not possible, disable or restrict the patient portal's PUT api/patient/:num endpoint at the reverse proxy / API gateway so portal users cannot directly write demographics (side effect: portal-initiated demographic self-updates will stop working until the patched audit-review workflow is restored), and avoid using the prescription CSS/HTML multi-print feature for patients whose demographics were edited via the portal during the exposure window. Audit existing patient_data name and address fields for HTML/JavaScript content and sanitize stored values before any clinician next opens the multi-print view; enforcing a strict Content-Security-Policy that disallows inline script on the main OpenEMR UI will further reduce blast radius but may break legitimate inline-script usage in older themes.
Affects your stack
Find out whether the stacks and servers you run are on an affected version.
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
OpenEMR is a widely deployed open-source electronic health records and practice management web application written in PHP. The root cause is classic CWE-79 (Improper Neutralization of Input During Web Page Generation) in the multiprintcss_header() function, which concatenates patient demographic strings (name, address) directly into HTML output without HTML-entity encoding. The injection path bypasses OpenEMR's audit-review workflow that normally gates portal-supplied changes to patient_data: the PUT api/patient/:num REST endpoint writes attacker-controlled values straight into the demographics table, so when a clinician later opens the prescription multi-print CSS/HTML view, the stored payload renders into the parent OpenEMR origin. The CPE cpe:2.3:a:openemr:openemr:*:*:*:*:*:*:*:* covers all OpenEMR versions prior to the fixed 8.0.0.1 release.
Know when Openemr 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:R/S:C/C:H/I:H/A:N
Network-reachable stored XSS exploitable by a low-privileged portal user (PR:L); requires clinician to open multi-print view (UI:R); scope changes to clinician UI with high C/I, no availability impact.
Primary rating from NVD.
CVSS VectorNVD
Lifecycle Timeline
3DescriptionNVD
OpenEMR is a free and open source electronic health records and medical practice management application. Prior to version 8.0.0.1, a stored cross-site scripting vulnerability in the prescription CSS/HTML multi-print feature allows a patient portal user to execute arbitrary JavaScript in a clinician's browser session. Patient demographic fields (name, address) are rendered without output encoding in multiprintcss_header(), and portal patients can write attacker-controlled HTML directly into patient_data by calling the PUT api/patient/:num endpoint, which bypasses the intended audit review workflow. Because the XSS fires in the clinician's authenticated session on the main OpenEMR interface, the attacker can access CSRF tokens, session data, and perform actions as the clinician - crossing the patient-to-clinician trust boundary. This issue has been patched in version 8.0.0.1.
Executive ViewAI
OpenEMR versions prior to 8.0.0.1 contain a stored cross-site scripting vulnerability in the patient portal that enables patient users to inject malicious code executing in clinician sessions. This crosses the trust boundary between patients and clinical staff, creating exposure to account compromise, unauthorized prescriptions, and unauthorized access to patient records. Healthcare organizations operating any version of OpenEMR must implement immediate controls or evaluate upgrade paths.
No vendor-released patch identified at time of analysis. Implement interim controls: (1) restrict or disable prescription multi-print rendering from patient portal; (2) apply strict output encoding to patient name and address fields in all clinical staff-facing views; (3) implement audit logging and alerting for demographic field modifications from patient portal; (4) deploy server-side render of prescription previews without JavaScript execution capability; (5) use XSS detection signatures to identify payloads in patient demographic fields; (6) establish session isolation and anomaly detection for clinician account activity to catch unauthorized clinical actions post-compromise.
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.
Cross-Site Request Forgery exploits the automatic credential inclusion behavior of web browsers.
Affected Products (CPE)NVD
An authenticated SQL injection vulnerability exists in OpenEMR ≤ 4.1.1 Patch 14 that allows a low-privileged attacker to
Unauthenticated token disclosure in OpenEMR before 8.0.0. CVSS 10.0. PoC and patch available.
Path traversal in OpenEMR 7.0.4 disposeDocument() allows file access. PoC available.
Path traversal in OpenEMR electronic health records before fix allows authenticated users to read arbitrary files on the
SQL injection in OpenEMR electronic health records before fix. Authenticated users can execute arbitrary SQL through the
OpenEMR 7.0.2 is vulnerable to SQL Injection via \openemr\library\classes\Pharmacy.class.php, \controllers\C_Pharmacy.cl
An issue in OpenEMR 7.0.2 allows a remote attacker to escalate privileges viaa crafted POST request using the noteid par
Information disclosure in OpenEMR 5.0.2 to before 8.0.0 exposes sensitive data. PoC and patch available.
Remote code execution in OpenEMR through 8.2.0 lets an authenticated administrator poison the document category tree so
interface/fax/fax_dispatch.php in OpenEMR 4.1.0 allows remote authenticated users to execute arbitrary commands via shel
interface/globals.php in OpenEMR 2.x, 3.x, and 4.x before 4.2.0 patch 2 allows remote attackers to bypass authentication
Authentication bypass vulnerability in portal/account/register.php in versions of OpenEMR before 5.0.1.4 allows a remote
NVD
CVE.org
EPSS
Vulnrichment
GitHub
VulDB
Exploit-DB