
Apache OpenMeetings 9.1.0 - उच्च - रिमोट - IDOR - LOGIN कैलेंडर सहेजना अपॉइंटमेंट को अधिलेखित करता है और सार्वजनिक कक्ष बंद करता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · openmeetings-calendar-save-idor
Class: IDOR Reach: Remote
Apache OpenMeetings 9.1.0 (9773c59e) - Apache Software Foundation
कोई भी LOGIN उपयोगकर्ता किसी अन्य अपॉइंटमेंट की id के साथ POST /services/calendar/ कर सकता है और owner को छोड़ सकता है। save predicate कभी भी persisted owner को लोड नहीं करता। इसके बाद CalendarMapper और फिर RoomMapper संलग्न room पर closed / ispublic / name लिखते हैं। एक पंजीकृत उपयोगकर्ता किसी और की मीटिंग को अधिलेखित कर देता है और एक सार्वजनिक कॉन्फ़्रेंस रूम को बंद कर देता है।
| ID | अभी तक कोई CVE नहीं |
| Class | IDOR |
| Reach | Remote (प्रमाणित LOGIN REST) |
| CWE | CWE-639, CWE-284 |
| CVSS | High: 7.6 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:L |
| Product | Apache OpenMeetings |
| Affected | 9.1.0 (9773c59e1af327bf988018e661f456ae9997c29f) |
| Auth | LOGIN (डिफ़ॉल्ट self-register इसे जारी करता है) |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1:18150। apache/openmeetings:min-9.1.0 और Temurin 21। |
मैंने टैग 9.1.0 को पिन किया, 9773c59e1af327bf988018e661f456ae9997c29f (2026-07-14) निकाला। नवीनतम GA। Java 21। master नहीं।
पंजीकरण करें (wizard allowFrontendRegister=true) या कोई भी LOGIN पासवर्ड रखें। POST /openmeetings/services/user/login एक SID जारी करता है। अपॉइंटमेंट id क्रमिक होते हैं। सार्वजनिक room id 2 स्टॉक कॉन्फ़्रेंस रूम है।
| Method | Sink | Privilege |
|---|---|---|
POST /services/calendar/?sid= form appointment JSON, owner छोड़ा गया, victim id | CalendarWebService.save predicate (CalendarWebService.java:310-329) | Integrity (lab-proven): title, times, members को अधिलेखित करें। Lab: title OPENMEETINGS-CALENDAR-SAVE-WITNESS हो गया, owner 2→3। |
वही save; room.closed=true | RoomMapper.get managed entity पर लिखता है (RoomMapper.java:62-92) फिर dao.update | Integrity + availability (lab-proven): सार्वजनिक कॉन्फ़्रेंस रूम ने closed=true, isPublic=false को persist किया। SOAP GET /room/2 ने वही लौटाया। |
save के बाद हमलावर GET title/range | response DTO post-write row है | Recon (lab-proven): witness title। owner चोरी के बाद victim range खाली। |
Lab-proven बनाम inferred: save HTTP 200, title, owner steal, room close lab हैं। उसी mapper पर capacity / moderated bits inferred हैं।
आवश्यक: /openmeetings/services तक नेटवर्क पथ। एक LOGIN खाता। एक victim appointment id (क्रमिक, या एक बनाकर प्रतीक्षा करें)। डिफ़ॉल्ट खुला साइनअप।
| Surface | क्यों |
|---|---|
DELETE /calendar/{id} | owner या SOAP/ADMIN। सामान्य LOGIN दूसरों को हटा नहीं सकता। |
| Range / next / title reads | owner-scoped। हमलावर को मूल row की साफ़ read नहीं मिलती। |
| Recording MP4 | भिन्न ACL (RecordingResourceReference)। |
| SOAP-only list-by-userid | Right.SOAP। डिफ़ॉल्ट पंजीकृत उपयोगकर्ताओं के पास यह नहीं है। |
| Unauthenticated save | performCall को LOGIN वाला SID चाहिए। |
9.1.0 ने CVE-2026-49488 (whiteboard fuid OS read) को बंद किया। मैंने REST object ids की खोज जारी रखी। Calendar delete a.isOwner(sd.getUserId()) जाँचता है। Calendar save request DTO owner, या null जाँचता है। CalendarMapper.get बिना किसी owner scope के appointmentDao.get(dto.getId()) लोड करता है। इसके बाद RoomMapper dao.update से पहले room JPA entity को dirty कर देता है।
SOAP सूची जिसमें हर अपॉइंटमेंट LMS एकीकरण खाता है। यह अवशेष LOGIN बनाम owner है।
cd lab
./run.sh
Loopback https://127.0.0.1:18150/openmeetings। आधिकारिक docker admin om_admin / 1Q2w3e4r5t^y। स्व-हस्ताक्षरित TLS। Witness अंतिम पंक्ति:
SUCCESS OPENMEETINGS-CALENDAR-SAVE-WITNESS
सहेजने से पहले सहेजी गई अपॉइंटमेंट लोड करें। SOAP/ADMIN के अलावा a.isOwner(caller) आवश्यक करें। RoomMapper के लेखन उस रूम पर न लागू करें जिसे कॉलर मॉडरेट नहीं कर सकता। छोड़े गए owner को "सहेजा गया owner बनाए रखें" मानें, न कि "कॉलर owner बन जाता है"।
Abraxas Labs - https://abraxaslabs.tech - https://github.com/abraxas - https://x.com/abraxas_null - [email protected]
विक्रेता: [email protected]