Apache OpenMeetings 9.1.0 - Alta - Remoto - IDOR - Il salvataggio del calendario LOGIN sovrascrive l'appuntamento e chiude la stanza pubblica
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · openmeetings-calendar-save-idor
Classe: IDOR Portata: Remota
Apache OpenMeetings 9.1.0 (9773c59e) - Apache Software Foundation
Qualsiasi utente LOGIN può eseguire POST /services/calendar/ con l'id di un altro appuntamento e omettere owner. Il predicato di salvataggio non carica mai il proprietario persistito. CalendarMapper e poi RoomMapper scrivono closed / ispublic / name sulla stanza collegata. Un utente registrato sovrascrive la riunione di qualcun altro e chiude una sala conferenze pubblica.
| ID | nessuna CVE al momento |
| Classe | IDOR |
| Portata | Remota (REST LOGIN autenticato) |
| 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 |
| Prodotto | Apache OpenMeetings |
| Affetto | 9.1.0 (9773c59e1af327bf988018e661f456ae9997c29f) |
| Auth | LOGIN (la registrazione automatica predefinita lo genera) |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1:18150. apache/openmeetings:min-9.1.0 più Temurin 21. |
Ho fissato il tag 9.1.0, peel 9773c59e1af327bf988018e661f456ae9997c29f (2026-07-14). Ultima GA. Java 21. Non master.
Registrarsi (procedura guidata allowFrontendRegister=true) o possedere qualsiasi password LOGIN. POST /openmeetings/services/user/login genera un SID. Gli id degli appuntamenti sono sequenziali. L'id della stanza pubblica 2 è la sala conferenze predefinita.
| Metodo | Sink | Privilegio |
|---|---|---|
POST /services/calendar/?sid= form appointment JSON, owner omesso, id della vittima | predicato CalendarWebService.save (CalendarWebService.java:310-329) | Integrità (dimostrato in lab): sovrascrive titolo, orari, membri. Lab: il titolo è diventato OPENMEETINGS-CALENDAR-SAVE-WITNESS, owner 2→3. |
Stesso salvataggio; room.closed=true | RoomMapper.get scrive sull'entità gestita (RoomMapper.java:62-92) poi dao.update | Integrità + disponibilità (dimostrato in lab): sala conferenze pubblica persistita con closed=true, isPublic=false. SOAP GET /room/2 ha restituito ciò. |
GET dell'attaccante su titolo/intervallo dopo il salvataggio | il DTO di risposta è la riga post-scrittura | Ricognizione (dimostrato in lab): titolo testimone. Intervallo della vittima vuoto dopo il furto dell'owner. |
Dimostrato in lab vs dedotto: salvataggio HTTP 200, titolo, furto dell'owner, chiusura della stanza sono dimostrati in lab. I bit capacity / moderated sullo stesso mapper sono dedotti.
Richiede: percorso di rete verso /openmeetings/services. Un account LOGIN. Un id di appuntamento della vittima (sequenziale, oppure crearne uno e attendere). Registrazione aperta predefinita.
| Superficie | Motivo |
|---|---|
DELETE /calendar/{id} | owner oppure SOAP/ADMIN. Un LOGIN normale non può eliminare quelli altrui. |
| Letture di intervallo / next / titolo | limitate all'owner. L'attaccante non ottiene una lettura pulita della riga originale. |
| MP4 della registrazione | ACL diversa (RecordingResourceReference). |
| list-by-userid solo SOAP | Right.SOAP. Gli utenti registrati predefiniti non lo possiedono. |
| Salvataggio non autenticato | performCall richiede un SID con LOGIN. |
La 9.1.0 ha chiuso CVE-2026-49488 (lettura OS tramite fuid della lavagna). Ho continuato a cercare id di oggetti REST. La delete del calendario verifica a.isOwner(sd.getUserId()). La save del calendario verifica l'owner del DTO della richiesta, oppure null. CalendarMapper.get carica appointmentDao.get(dto.getId()) senza ambito di owner. RoomMapper poi sporca l'entità JPA della stanza prima di dao.update.
l'account di integrazione LMS è elencato in SOAP per ogni appuntamento. Questo residuo è LOGIN vs owner.
cd lab
./run.sh
Loopback https://127.0.0.1:18150/openmeetings. Admin docker ufficiale om_admin / 1Q2w3e4r5t^y. TLS autofirmato. Ultima riga di verifica:
SUCCESS OPENMEETINGS-CALENDAR-SAVE-WITNESS
Caricare l'appuntamento persistito prima del salvataggio. Richiedere a.isOwner(caller) a meno che non si tratti di SOAP/ADMIN. Non applicare le scritture di RoomMapper a una stanza che il chiamante non può moderare. Trattare il proprietario omesso come "mantieni il proprietario persistito", non come "il chiamante diventa proprietario".
Abraxas Labs - https://abraxaslabs.tech - https://github.com/abraxas - https://x.com/abraxas_null - [email protected]
Fornitore: [email protected]