
Apache OpenMeetings 9.1.0 - 高 - リモート - IDOR - LOGIN カレンダー保存が予定を上書きし、公開ルームを閉鎖する
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · openmeetings-calendar-save-idor
クラス: IDOR 到達範囲: リモート
Apache OpenMeetings 9.1.0 (9773c59e) - Apache Software Foundation
LOGIN 権限を持つ任意のユーザーが、別の予定の id を指定し owner を省略して POST /services/calendar/ を実行できます。保存時の述語は永続化された owner を読み込みません。その後 CalendarMapper、続いて RoomMapper が、紐付くルームの closed / ispublic / name を書き込みます。登録ユーザーが他人の会議を上書きし、公開カンファレンスルームを閉鎖できてしまいます。
| ID | CVE 未割当 |
| クラス | IDOR |
| 到達範囲 | リモート(認証済み 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 |
| 製品 | Apache OpenMeetings |
| 影響を受けるバージョン | 9.1.0 (9773c59e1af327bf988018e661f456ae9997c29f) |
| 認証 | LOGIN(デフォルトの自己登録で発行可能) |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:18150 のみ。apache/openmeetings:min-9.1.0 に Temurin 21 を追加。 |
タグ 9.1.0 を固定し、9773c59e1af327bf988018e661f456ae9997c29f(2026-07-14)を確認しました。最新の GA です。Java 21。master ではありません。
登録する(ウィザード allowFrontendRegister=true)か、任意の LOGIN パスワードを保持します。POST /openmeetings/services/user/login で SID が発行されます。予定の id は連番です。公開ルーム id 2 は標準のカンファレンスルームです。
| メソッド | シンク | 権限 |
|---|---|---|
POST /services/calendar/?sid= フォーム appointment JSON、owner 省略、被害者の id | CalendarWebService.save 述語(CalendarWebService.java:310-329) | 完全性(ラボ実証済み): タイトル、時刻、メンバーを上書き。ラボではタイトルが OPENMEETINGS-CALENDAR-SAVE-WITNESS になり、owner が 2→3 に変化。 |
同じ保存。room.closed=true | RoomMapper.get が管理対象エンティティに書き込み(RoomMapper.java:62-92)、その後 dao.update | 完全性 + 可用性(ラボ実証済み): 公開カンファレンスルームが closed=true、isPublic=false として永続化。SOAP GET /room/2 がその状態を返却。 |
保存後に攻撃者が GET でタイトル/範囲を取得 | レスポンス DTO は書き込み後の行 | 偵察(ラボ実証済み): 証跡タイトル。owner 窃取後、被害者の範囲は空。 |
ラボ実証済み vs 推測: 保存の HTTP 200、タイトル、owner 窃取、ルーム閉鎖はラボで実証済み。同じマッパー上の capacity / moderated ビットは推測です。
必要条件: /openmeetings/services へのネットワーク経路。LOGIN アカウント。被害者の予定 id(連番、または自身で作成して待機)。デフォルトのオープンサインアップ。
| 領域 | 理由 |
|---|---|
DELETE /calendar/{id} | owner または SOAP/ADMIN。通常の LOGIN では他人のものを削除できない。 |
| 範囲 / next / タイトルの読み取り | owner スコープ。攻撃者は元の行をクリーンに読み取れない。 |
| 録画 MP4 | 異なる ACL(RecordingResourceReference)。 |
| SOAP 専用の userid 別リスト | Right.SOAP。デフォルトの登録ユーザーは持たない。 |
| 未認証の保存 | performCall には LOGIN 付き SID が必要。 |
9.1.0 は CVE-2026-49488(ホワイトボード fuid の OS 読み取り)を修正しました。私は REST オブジェクト id の調査を続けました。カレンダーの 削除 は a.isOwner(sd.getUserId()) をチェックします。カレンダーの 保存 はリクエスト DTO の owner、または null をチェックします。CalendarMapper.get は owner スコープなしで appointmentDao.get(dto.getId()) を読み込みます。その後 RoomMapper が dao.update の前にルーム JPA エンティティをダーティにします。
SOAP で全予約を列挙しているのが LMS 連携アカウントです。この残存物は LOGIN 対 owner です。
cd lab
./run.sh
ループバック https://127.0.0.1:18150/openmeetings。公式 docker 管理者 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]