Apache OpenMeetings 9.1.0 - Alta - Remota - IDOR - El guardado del calendario LOGIN sobrescribe la cita y cierra la sala pública
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · openmeetings-calendar-save-idor
Clase: IDOR Alcance: Remoto
Apache OpenMeetings 9.1.0 (9773c59e) - Apache Software Foundation
Cualquier usuario con LOGIN puede hacer POST /services/calendar/ con el id de otra cita y omitir owner. El predicado de guardado nunca carga el propietario persistido. CalendarMapper y luego RoomMapper escriben closed / ispublic / name en la sala adjunta. Un usuario registrado sobrescribe la reunión de otra persona y cierra una sala de conferencias pública.
| ID | aún sin CVE |
| Clase | IDOR |
| Alcance | Remoto (REST LOGIN autenticado) |
| CWE | CWE-639, CWE-284 |
| CVSS | Alto: 7.6 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:L |
| Producto | Apache OpenMeetings |
| Afectado | 9.1.0 (9773c59e1af327bf988018e661f456ae9997c29f) |
| Autenticación | LOGIN (el autorregistro por defecto lo genera) |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1:18150. apache/openmeetings:min-9.1.0 más Temurin 21. |
Fijé la etiqueta 9.1.0, peel 9773c59e1af327bf988018e661f456ae9997c29f (2026-07-14). Última GA. Java 21. No master.
Registrarse (asistente allowFrontendRegister=true) o tener cualquier contraseña LOGIN. POST /openmeetings/services/user/login genera un SID. Los ids de cita son secuenciales. El id de sala pública 2 es la sala de conferencias por defecto.
| Método | Sumidero | Privilegio |
|---|---|---|
POST /services/calendar/?sid= formulario appointment JSON, owner omitido, id de la víctima | predicado CalendarWebService.save (CalendarWebService.java:310-329) | Integridad (probado en laboratorio): sobrescribir título, horarios, miembros. Laboratorio: el título pasó a ser OPENMEETINGS-CALENDAR-SAVE-WITNESS, propietario 2→3. |
Mismo guardado; room.closed=true | RoomMapper.get escribe sobre la entidad gestionada (RoomMapper.java:62-92) y luego dao.update | Integridad + disponibilidad (probado en laboratorio): la sala de conferencias pública persistió closed=true, isPublic=false. SOAP GET /room/2 devolvió eso. |
GET del atacante de título/rango tras el guardado | el DTO de respuesta es la fila posterior a la escritura | Reconocimiento (probado en laboratorio): título testigo. Rango de la víctima vacío tras el robo del propietario. |
Probado en laboratorio vs inferido: guardado HTTP 200, título, robo de propietario, cierre de sala son de laboratorio. Los bits de capacidad / moderación en el mismo mapper son inferidos.
Requiere: ruta de red a /openmeetings/services. Una cuenta LOGIN. Un id de cita de la víctima (secuencial, o crear una y esperar). Registro abierto por defecto.
| Superficie | Por qué |
|---|---|
DELETE /calendar/{id} | propietario o SOAP/ADMIN. Un LOGIN normal no puede borrar las de otros. |
| Lecturas de rango / next / título | limitadas al propietario. El atacante no obtiene una lectura limpia de la fila original. |
| Grabación MP4 | ACL distinta (RecordingResourceReference). |
| Listado por userid solo SOAP | Right.SOAP. Los usuarios registrados por defecto no lo tienen. |
| Guardado no autenticado | performCall necesita un SID con LOGIN. |
9.1.0 cerró CVE-2026-49488 (lectura de OS de fuid en la pizarra). Seguí buscando ids de objetos REST. El borrado de calendario comprueba a.isOwner(sd.getUserId()). El guardado de calendario comprueba el propietario del DTO de la petición, o null. CalendarMapper.get carga appointmentDao.get(dto.getId()) sin ámbito de propietario. RoomMapper luego ensucia la entidad JPA de la sala antes de dao.update.
La cuenta de integración del LMS aparece en el listado SOAP de cada cita. Este residuo es LOGIN frente a propietario.
cd lab
./run.sh
Loopback https://127.0.0.1:18150/openmeetings. Administrador oficial de docker om_admin / 1Q2w3e4r5t^y. TLS autofirmado. Testigo de la última línea:
SUCCESS OPENMEETINGS-CALENDAR-SAVE-WITNESS
Cargar la cita persistida antes de guardar. Requerir a.isOwner(caller) a menos que sea SOAP/ADMIN. No aplicar las escrituras de RoomMapper a una sala que el llamador no puede moderar. Tratar el propietario omitido como "mantener el propietario persistido", no como "el llamador se convierte en propietario".
Abraxas Labs - https://abraxaslabs.tech - https://github.com/abraxas - https://x.com/abraxas_null - [email protected]
Proveedor: [email protected]