Apache OpenMeetings 9.1.0 - Alta - Remoto - IDOR - O salvamento do calendário de LOGIN sobrescreve o compromisso e fecha a sala pública
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · openmeetings-calendar-save-idor
Classe: IDOR Alcance: Remoto
Apache OpenMeetings 9.1.0 (9773c59e) - Apache Software Foundation
Qualquer usuário LOGIN pode fazer POST /services/calendar/ com o id de outro compromisso e omitir owner. O predicado de save nunca carrega o owner persistido. CalendarMapper e depois RoomMapper gravam closed / ispublic / name na sala anexada. Um usuário registrado sobrescreve a reunião de outra pessoa e fecha uma sala de conferência pública.
| ID | ainda sem CVE |
| Classe | 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 |
| Produto | Apache OpenMeetings |
| Afetado | 9.1.0 (9773c59e1af327bf988018e661f456ae9997c29f) |
| Autenticação | LOGIN (o auto-registro padrão gera isso) |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1:18150. apache/openmeetings:min-9.1.0 mais Temurin 21. |
Fixe a tag 9.1.0, peel 9773c59e1af327bf988018e661f456ae9997c29f (2026-07-14). Última GA. Java 21. Não é master.
Registrar-se (wizard allowFrontendRegister=true) ou possuir qualquer senha LOGIN. POST /openmeetings/services/user/login gera um SID. Os ids de compromisso são sequenciais. O id de sala pública 2 é a sala de conferência padrão.
| Método | Sink | Privilégio |
|---|---|---|
POST /services/calendar/?sid= form appointment JSON, owner omitido, id da vítima | predicado CalendarWebService.save (CalendarWebService.java:310-329) | Integridade (comprovado em lab): sobrescrever título, horários, membros. Lab: título tornou-se OPENMEETINGS-CALENDAR-SAVE-WITNESS, owner 2→3. |
Mesmo save; room.closed=true | RoomMapper.get grava na entidade gerenciada (RoomMapper.java:62-92) e depois dao.update | Integridade + disponibilidade (comprovado em lab): sala de conferência pública persistida com closed=true, isPublic=false. SOAP GET /room/2 retornou isso. |
GET do atacante de título/intervalo após o save | o DTO de resposta é a linha pós-gravação | Recon (comprovado em lab): título testemunha. Intervalo da vítima vazio após roubo de owner. |
Comprovado em lab vs inferido: save HTTP 200, título, roubo de owner, fechamento de sala são de lab. Bits de capacidade / moderado no mesmo mapper são inferidos.
Requer: caminho de rede para /openmeetings/services. Uma conta LOGIN. Um id de compromisso da vítima (sequencial, ou crie um e aguarde). Cadastro aberto padrão.
| Superfície | Por quê |
|---|---|
DELETE /calendar/{id} | owner ou SOAP/ADMIN. LOGIN comum não pode excluir de outros. |
| Leituras de intervalo / next / título | escopo de owner. O atacante não obtém uma leitura limpa da linha original. |
| MP4 de gravação | ACL diferente (RecordingResourceReference). |
| list-by-userid apenas SOAP | Right.SOAP. Usuários registrados padrão não têm isso. |
| save não autenticado | performCall precisa de um SID com LOGIN. |
9.1.0 fechou CVE-2026-49488 (leitura de OS via fuid do whiteboard). Continuei caçando ids de objetos REST. O delete de calendário verifica a.isOwner(sd.getUserId()). O save de calendário verifica o owner do DTO da requisição, ou null. CalendarMapper.get carrega appointmentDao.get(dto.getId()) sem escopo de owner. RoomMapper então suja a entidade JPA da sala antes de dao.update.
A listagem SOAP de cada compromisso é a conta de integração do LMS. Esse resíduo é LOGIN vs proprietário.
cd lab
./run.sh
Loopback https://127.0.0.1:18150/openmeetings. Administrador oficial do docker om_admin / 1Q2w3e4r5t^y. TLS autoassinado. Última linha da testemunha:
SUCCESS OPENMEETINGS-CALENDAR-SAVE-WITNESS
Carregue o compromisso persistido antes de salvar. Exija a.isOwner(caller) a menos que seja SOAP/ADMIN. Não aplique gravações de RoomMapper a uma sala que o chamador não pode moderar. Trate o proprietário omitido como "manter o proprietário persistido", não como "o chamador se torna proprietário".
Abraxas Labs - https://abraxaslabs.tech - https://github.com/abraxas - https://x.com/abraxas_null - [email protected]
Vendor: [email protected]