Apache OpenMeetings 9.1.0 – Hoch – Remote – IDOR – LOGIN-Kalenderspeicherung überschreibt Termin und schließt öffentlichen Raum
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · openmeetings-calendar-save-idor
Klasse: IDOR Reichweite: Remote
Apache OpenMeetings 9.1.0 (9773c59e) - Apache Software Foundation
Jeder LOGIN-Benutzer kann POST /services/calendar/ mit der id eines anderen Termins aufrufen und owner weglassen. Das Save-Prädikat lädt niemals den persistierten Owner. CalendarMapper und dann RoomMapper schreiben closed / ispublic / name auf den angehängten Raum. Ein registrierter Benutzer überschreibt das Meeting eines anderen und schließt einen öffentlichen Konferenzraum.
| ID | noch keine CVE |
| Klasse | IDOR |
| Reichweite | Remote (authentifiziertes LOGIN-REST) |
| CWE | CWE-639, CWE-284 |
| CVSS | Hoch: 7.6 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:L |
| Produkt | Apache OpenMeetings |
| Betroffen | 9.1.0 (9773c59e1af327bf988018e661f456ae9997c29f) |
| Auth | LOGIN (die standardmäßige Selbstregistrierung erzeugt diesen) |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1:18150. apache/openmeetings:min-9.1.0 plus Temurin 21. |
Ich habe den Tag 9.1.0 gepinnt, Peel 9773c59e1af327bf988018e661f456ae9997c29f (2026-07-14). Neueste GA. Java 21. Nicht master.
Registrieren (Wizard allowFrontendRegister=true) oder ein beliebiges LOGIN-Passwort besitzen. POST /openmeetings/services/user/login erzeugt eine SID. Termin-IDs sind sequenziell. Die öffentliche Raum-ID 2 ist der Standard-Konferenzraum.
| Methode | Sink | Privileg |
|---|---|---|
POST /services/calendar/?sid= Formular appointment JSON, owner weggelassen, Opfer-id | CalendarWebService.save-Prädikat (CalendarWebService.java:310-329) | Integrität (im Lab nachgewiesen): Titel, Zeiten, Mitglieder überschreiben. Lab: Titel wurde OPENMEETINGS-CALENDAR-SAVE-WITNESS, Owner 2→3. |
Gleicher Save; room.closed=true | RoomMapper.get schreibt auf die verwaltete Entity (RoomMapper.java:62-92), dann dao.update | Integrität + Verfügbarkeit (im Lab nachgewiesen): öffentlicher Konferenzraum persistiert closed=true, isPublic=false. SOAP GET /room/2 gab das zurück. |
Angreifer-GET Titel/Bereich nach dem Save | Response-DTO ist die Zeile nach dem Schreiben | Recon (im Lab nachgewiesen): Witness-Titel. Opfer-Bereich nach Owner-Diebstahl leer. |
Im Lab nachgewiesen vs. abgeleitet: Save HTTP 200, Titel, Owner-Diebstahl, Raum-Schließung sind im Lab. Kapazitäts- / Moderations-Bits auf demselben Mapper sind abgeleitet.
Erfordert: Netzwerkpfad zu /openmeetings/services. Ein LOGIN-Konto. Eine Opfer-Termin-ID (sequenziell, oder selbst einen anlegen und warten). Standardmäßig offene Registrierung.
| Oberfläche | Warum |
|---|---|
DELETE /calendar/{id} | Owner oder SOAP/ADMIN. Normales LOGIN kann fremde nicht löschen. |
| Bereichs- / Next- / Titel-Lesevorgänge | owner-scoped. Angreifer erhält keinen sauberen Lesezugriff auf die ursprüngliche Zeile. |
| Recording-MP4 | andere ACL (RecordingResourceReference). |
| SOAP-only list-by-userid | Right.SOAP. Standardmäßig registrierte Benutzer haben das nicht. |
| Nicht authentifizierter Save | performCall benötigt eine SID mit LOGIN. |
9.1.0 schloss CVE-2026-49488 (Whiteboard-fuid-OS-Read). Ich suchte weiter nach REST-Objekt-IDs. Calendar delete prüft a.isOwner(sd.getUserId()). Calendar save prüft den Owner des Request-DTO, oder null. CalendarMapper.get lädt appointmentDao.get(dto.getId()) ohne Owner-Scope. RoomMapper macht dann die Room-JPA-Entity vor dao.update dirty.
SOAP-Auflistung aller Termine ist das LMS-Integrationskonto. Dieser Rest ist LOGIN vs. Eigentümer.
cd lab
./run.sh
Loopback https://127.0.0.1:18150/openmeetings. Offizieller Docker-Administrator om_admin / 1Q2w3e4r5t^y. Selbstsigniertes TLS. Zeuge letzte Zeile:
SUCCESS OPENMEETINGS-CALENDAR-SAVE-WITNESS
Den persistierten Termin vor dem Speichern laden. a.isOwner(caller) verlangen, außer bei SOAP/ADMIN. RoomMapper-Schreibvorgänge nicht auf einen Raum anwenden, den der Aufrufer nicht moderieren kann. Ausgelassenen Eigentümer als "persistierten Eigentümer beibehalten" behandeln, nicht als "Aufrufer wird Eigentümer".
Abraxas Labs - https://abraxaslabs.tech - https://github.com/abraxas - https://x.com/abraxas_null - [email protected]
Anbieter: [email protected]