/

CVE-2026-115573

Severity:

HIGH RISK

(8.1)

Missing Authorization (CWE-862) in OpenEMR Controller

CVE-2026-115573

Received

Vulnerability type

Category:

Broken Access Control

CWE:

CWE-862

Impact:

Unauthorized access to administrative functions and sensitive patient data

Severity:

HIGH RISK

(8.1)

CVSS version:

3.1

Catch this CVE while code is being written

Detect vulnerable code directly in pull requests, so CVEs are fixed before merge.

Summary

OpenEMR's controller dispatcher can allow authenticated users to invoke controllers that are missing from its access-control map, without enforcing the expected permissions. A low-privilege user may therefore access administrative actions, including changing insurance-routing settings or viewing patient information.

OpenEMR's controller dispatcher can allow authenticated users to invoke controllers that are missing from its access-control map, without enforcing the expected permissions. A low-privilege user may therefore access administrative actions, including changing insurance-routing settings or viewing patient information.

Affected context

The issue affects OpenEMR's controller dispatch and authorization checks in library/classes/Controller.class.php. When a controller is not represented in CONTROLLER_ACL_MAP, the ACL check returns without enforcing a permission requirement. This can expose actions intended to be reached only through permission-gated routes, including insurance-partner and patient-finder actions.

The issue affects OpenEMR's controller dispatch and authorization checks in library/classes/Controller.class.php. When a controller is not represented in CONTROLLER_ACL_MAP, the ACL check returns without enforcing a permission requirement. This can expose actions intended to be reached only through permission-gated routes, including insurance-partner and patient-finder actions.

Exploit preconditions

  • Attack surface: OpenEMR controller dispatch
  • Required access: An authenticated account with low privileges
  • Trigger point: Direct invocation of an action on a controller missing from CONTROLLER_ACL_MAP
  • Why exploitation is possible: The authorization check fails open for unmapped controllers instead of denying access or requiring an explicit permission
  • Attack surface: OpenEMR controller dispatch
  • Required access: An authenticated account with low privileges
  • Trigger point: Direct invocation of an action on a controller missing from CONTROLLER_ACL_MAP
  • Why exploitation is possible: The authorization check fails open for unmapped controllers instead of denying access or requiring an explicit permission

Why this happens

The dispatcher does not require every controller to have an explicit authorization policy. When an entry is absent from CONTROLLER_ACL_MAP, checkControllerAcl() returns without enforcing access control, allowing the action to proceed. This is a missing authorization flaw mapped to CWE-862: Missing Authorization.

The dispatcher does not require every controller to have an explicit authorization policy. When an entry is absent from CONTROLLER_ACL_MAP, checkControllerAcl() returns without enforcing access control, allowing the action to proceed. This is a missing authorization flaw mapped to CWE-862: Missing Authorization.

Potential impact

  • An unauthorized user could create or alter insurance-routing hosts and credentials.
  • An unauthorized user could enumerate patient names, dates of birth, and identifiers.
  • Other administrative controller actions could be exposed if they rely on routes with ACL checks but are reachable through the dispatcher.
  • Changes to insurance-routing settings could disrupt or redirect related workflows.
  • An unauthorized user could create or alter insurance-routing hosts and credentials.
  • An unauthorized user could enumerate patient names, dates of birth, and identifiers.
  • Other administrative controller actions could be exposed if they rely on routes with ACL checks but are reachable through the dispatcher.
  • Changes to insurance-routing settings could disrupt or redirect related workflows.

General mitigation guidance

Defensive patterns for this class of issue include:

  • Denying access by default when a controller or action has no explicit authorization policy.
  • Applying authorization checks consistently at the action or controller boundary, not only through selected routes.
  • Maintaining a complete, centrally enforced mapping between controller actions and required permissions.
  • Limiting accounts to the minimum privileges needed and reviewing sensitive actions for appropriate role checks.
  • Treating direct controller dispatch as an untrusted entry point and validating authorization before performing sensitive operations.

Defensive patterns for this class of issue include:

  • Denying access by default when a controller or action has no explicit authorization policy.
  • Applying authorization checks consistently at the action or controller boundary, not only through selected routes.
  • Maintaining a complete, centrally enforced mapping between controller actions and required permissions.
  • Limiting accounts to the minimum privileges needed and reviewing sensitive actions for appropriate role checks.
  • Treating direct controller dispatch as an untrusted entry point and validating authorization before performing sensitive operations.

How teams detect issues like this

  • Use static analysis or targeted searches to identify dispatch paths where missing ACL entries result in an allow or early return.
  • Review all controller actions that modify configuration, access patient data, or perform administrative operations, and verify each has an explicit permission check.
  • Test authorization behavior for direct action invocation as well as normal UI or route-based access.
  • Enforce CI or policy checks that flag newly added controllers or actions without corresponding authorization rules.
  • Review access logs for low-privilege accounts invoking sensitive controller actions.
  • Use static analysis or targeted searches to identify dispatch paths where missing ACL entries result in an allow or early return.
  • Review all controller actions that modify configuration, access patient data, or perform administrative operations, and verify each has an explicit permission check.
  • Test authorization behavior for direct action invocation as well as normal UI or route-based access.
  • Enforce CI or policy checks that flag newly added controllers or actions without corresponding authorization rules.
  • Review access logs for low-privilege accounts invoking sensitive controller actions.

Sources

SourceLink
github.comgithub.com/openemr/openemr/commit/64f8491d850b2e22ed4fceb14fa67e27fef62cd1
github.comgithub.com/openemr/openemr/pull/13565
github.comgithub.com/openemr/openemr/releases/tag/v8_3_0
github.comgithub.com/openemr/openemr/security/advisories/GHSA-9rj4-fxmj-c4r7

Frequently asked

questions

It concerns controller actions that can be dispatched without the expected ACL enforcement when their controllers are missing from the access-control map. The described examples include insurance-routing changes and patient information enumeration.

Yes. The described scenario involves an authenticated low-privilege user, though the exact exposure depends on the deployment's account and network controls.

Deny access by default and require an explicit authorization policy for every controller action, with checks enforced before sensitive work is performed.

Keep authorization rules complete and centralized, test direct dispatch paths, and use automated checks to detect unmapped controllers or actions.

It concerns controller actions that can be dispatched without the expected ACL enforcement when their controllers are missing from the access-control map. The described examples include insurance-routing changes and patient information enumeration.

Yes. The described scenario involves an authenticated low-privilege user, though the exact exposure depends on the deployment's account and network controls.

Deny access by default and require an explicit authorization policy for every controller action, with checks enforced before sensitive work is performed.

Keep authorization rules complete and centralized, test direct dispatch paths, and use automated checks to detect unmapped controllers or actions.

Find out what's already
exploitable in your codebase.