CVE-2023-54347 Overview
CVE-2023-54347 is an authentication brute force vulnerability in OpenEMR 7.0.1, an open-source electronic health records and medical practice management application. The flaw lets unauthenticated attackers bypass rate-limiting and account lockout protections on the primary login endpoint. Attackers submit repeated POST requests containing the authUser and clearPass parameters to enumerate valid credentials at high speed. The weakness is classified under CWE-307: Improper Restriction of Excessive Authentication Attempts. Because OpenEMR stores protected health information (PHI), credential compromise carries direct regulatory and patient-privacy consequences.
Critical Impact
Unauthenticated network attackers can perform unrestricted password guessing against OpenEMR 7.0.1, leading to account takeover and exposure of patient health data.
Affected Products
- OpenEMR 7.0.1
- Deployments using cpe:2.3:a:open-emr:openemr:7.0.1
- Self-hosted instances exposing the login endpoint to untrusted networks
Discovery Timeline
- 2026-05-05 - CVE-2023-54347 published to NVD
- 2026-05-05 - Last updated in NVD database
Technical Details for CVE-2023-54347
Vulnerability Analysis
The vulnerability resides in OpenEMR's primary authentication workflow. The login handler accepts repeated submissions of the authUser (username) and clearPass (cleartext password) parameters without enforcing effective throttling, lockout, or CAPTCHA controls on failed attempts. An attacker scripts HTTP POST requests against the login endpoint and observes server responses to distinguish valid usernames and correct passwords. Because the rate-limiting mitigation can be bypassed, password spraying and dictionary attacks proceed at network speed. Successful credential discovery yields authenticated access to the OpenEMR application, which administers patient demographics, clinical notes, prescriptions, and billing data. The issue is documented in the VulnCheck Advisory on OpenEMR and a corresponding Exploit-DB entry #51413.
Root Cause
OpenEMR 7.0.1 implements authentication attempt restrictions that fail to comprehensively cover the login flow. The mitigation logic does not consistently track or block repeated failures originating from the same source or targeting the same account. This permits an attacker to send unlimited credential pairs without triggering account lockout or progressive delays.
Attack Vector
The attack is executed remotely over the network with no authentication and no user interaction. An attacker enumerates a wordlist of usernames and passwords, then issues parallel POST requests to the OpenEMR login endpoint with authUser and clearPass form fields. The application processes each request, returning observable success or failure indicators that drive the brute force loop until valid credentials are found.
No verified public proof-of-concept code is included with this advisory. Refer to the Exploit-DB entry #51413 and the GitHub OpenEMR v7.0.1 source archive for technical details on the affected authentication routine.
Detection Methods for CVE-2023-54347
Indicators of Compromise
- High volume of POST requests to the OpenEMR login endpoint from a single source IP or distributed botnet within a short time window.
- Repeated authentication failures for one or many authUser values in OpenEMR application logs.
- Successful login events immediately preceded by hundreds or thousands of failed attempts for the same account.
- Web server access logs showing requests with authUser and clearPass parameters at non-human request rates.
Detection Strategies
- Aggregate web server and OpenEMR application logs and alert on failed login thresholds per source IP, per account, and per User-Agent.
- Inspect HTTP request timing distributions for the login endpoint to surface automated tooling patterns.
- Correlate failed login bursts with subsequent successful logins to identify likely credential compromise.
Monitoring Recommendations
- Forward OpenEMR authentication and Apache or Nginx access logs to a SIEM for centralized analysis and long-term retention.
- Build dashboards tracking login success-to-failure ratios, geographic source distribution, and request rates against the login endpoint.
- Alert on logins from new geolocations, anonymizing proxies, or hosting provider ranges that do not match clinical staff patterns.
How to Mitigate CVE-2023-54347
Immediate Actions Required
- Restrict access to the OpenEMR login interface to trusted networks or VPN-only access where operationally feasible.
- Deploy a web application firewall (WAF) rule to rate-limit POST requests to the login endpoint per source IP.
- Force a password reset for any account showing anomalous login activity since deployment of OpenEMR 7.0.1.
- Enable multi-factor authentication for all OpenEMR users to reduce the impact of credential discovery.
Patch Information
No vendor patch is referenced in the available advisory data. Administrators should monitor the OpenEMR official website and the OpenEMR GitHub repository for security updates that address authentication brute force protections, and upgrade beyond version 7.0.1 when a fix is published. Until a vendor fix is available, compensating controls at the network and application layer are required.
Workarounds
- Place OpenEMR behind a reverse proxy that enforces strict request rate limiting and connection throttling on the login endpoint.
- Implement IP-based and account-based lockout using fail2ban or equivalent log-driven blocking against repeated authentication failures.
- Add CAPTCHA enforcement in front of the login form via the reverse proxy or WAF.
- Restrict the OpenEMR administrative interface to allowlisted IP ranges using firewall rules.
# Example fail2ban filter for OpenEMR login brute force
# /etc/fail2ban/filter.d/openemr-auth.conf
[Definition]
failregex = ^<HOST> .* "POST /interface/main/main_screen.php\?auth=login.* HTTP/.*" 200
ignoreregex =
# /etc/fail2ban/jail.d/openemr.conf
[openemr-auth]
enabled = true
port = http,https
filter = openemr-auth
logpath = /var/log/apache2/access.log
maxretry = 5
findtime = 300
bantime = 3600
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.


