Apache OpenMeetings 9.1.0 - Élevé - À distance - IDOR - LOGIN calendar save overwrites appointment and closes public room
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · openmeetings-calendar-save-idor
Classe : IDOR Portée : Distante
Apache OpenMeetings 9.1.0 (9773c59e) - Apache Software Foundation
Tout utilisateur LOGIN peut effectuer un POST /services/calendar/ avec l'id d'un autre rendez-vous et omettre owner. Le prédicat de sauvegarde ne charge jamais le propriétaire persisté. CalendarMapper puis RoomMapper écrivent closed / ispublic / name sur la salle attachée. Un utilisateur enregistré écrase la réunion de quelqu'un d'autre et ferme une salle de conférence publique.
| ID | pas encore de CVE |
| Classe | IDOR |
| Portée | Distante (REST LOGIN authentifié) |
| CWE | CWE-639, CWE-284 |
| CVSS | Élevé : 7.6 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:L |
| Produit | Apache OpenMeetings |
| Affecté | 9.1.0 (9773c59e1af327bf988018e661f456ae9997c29f) |
| Auth | LOGIN (l'auto-inscription par défaut le génère) |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1:18150 uniquement. apache/openmeetings:min-9.1.0 plus Temurin 21. |
J'ai épinglé le tag 9.1.0, peel 9773c59e1af327bf988018e661f456ae9997c29f (2026-07-14). Dernière GA. Java 21. Pas master.
S'inscrire (assistant allowFrontendRegister=true) ou détenir n'importe quel mot de passe LOGIN. POST /openmeetings/services/user/login génère un SID. Les ids de rendez-vous sont séquentiels. L'id de salle publique 2 est la salle de conférence par défaut.
| Méthode | Point d'impact | Privilège |
|---|---|---|
POST /services/calendar/?sid= formulaire appointment JSON, owner omis, id de la victime | prédicat CalendarWebService.save (CalendarWebService.java:310-329) | Intégrité (prouvé en lab) : écrasement du titre, des horaires, des membres. Lab : le titre est devenu OPENMEETINGS-CALENDAR-SAVE-WITNESS, propriétaire 2→3. |
Même sauvegarde ; room.closed=true | RoomMapper.get écrit sur l'entité managée (RoomMapper.java:62-92) puis dao.update | Intégrité + disponibilité (prouvé en lab) : salle de conférence publique persistée closed=true, isPublic=false. SOAP GET /room/2 a renvoyé cela. |
GET attaquant du titre/plage après sauvegarde | le DTO de réponse est la ligne post-écriture | Reconnaissance (prouvé en lab) : titre témoin. Plage de la victime vide après vol du propriétaire. |
Prouvé en lab vs déduit : sauvegarde HTTP 200, titre, vol du propriétaire, fermeture de salle sont prouvés en lab. Les bits capacité / modération sur le même mapper sont déduits.
Nécessite : un chemin réseau vers /openmeetings/services. Un compte LOGIN. Un id de rendez-vous victime (séquentiel, ou en créer un et attendre). Inscription ouverte par défaut.
| Surface | Raison |
|---|---|
DELETE /calendar/{id} | propriétaire ou SOAP/ADMIN. Un LOGIN ordinaire ne peut pas supprimer ceux des autres. |
| Lectures plage / suivant / titre | limitées au propriétaire. L'attaquant n'obtient pas une lecture propre de la ligne d'origine. |
| Enregistrement MP4 | ACL différente (RecordingResourceReference). |
| Liste-par-userid réservée à SOAP | Right.SOAP. Les utilisateurs enregistrés par défaut ne l'ont pas. |
| Sauvegarde non authentifiée | performCall nécessite un SID avec LOGIN. |
9.1.0 a corrigé CVE-2026-49488 (lecture OS via fuid du tableau blanc). J'ai continué à chercher des ids d'objets REST. La suppression de calendrier vérifie a.isOwner(sd.getUserId()). La sauvegarde de calendrier vérifie le propriétaire du DTO de requête, ou null. CalendarMapper.get charge appointmentDao.get(dto.getId()) sans portée de propriétaire. RoomMapper salit ensuite l'entité JPA de salle avant dao.update.
SOAP listant chaque rendez-vous est le compte d'intégration LMS. Ce résidu est LOGIN vs propriétaire.
cd lab
./run.sh
Loopback https://127.0.0.1:18150/openmeetings. Administrateur Docker officiel om_admin / 1Q2w3e4r5t^y. TLS auto-signé. Témoin dernière ligne :
SUCCESS OPENMEETINGS-CALENDAR-SAVE-WITNESS
Charger le rendez-vous persisté avant l'enregistrement. Exiger a.isOwner(caller) sauf pour SOAP/ADMIN. Ne pas appliquer les écritures de RoomMapper à une salle que l'appelant ne peut pas modérer. Traiter le propriétaire omis comme « conserver le propriétaire persisté », et non comme « l'appelant devient propriétaire ».
Abraxas Labs - https://abraxaslabs.tech - https://github.com/abraxas - https://x.com/abraxas_null - [email protected]
Fournisseur : [email protected]