
Joomla 6.1.3 - 高 - リモート - ACL - GET /api/v1/users/levels が閲覧レベルを漏洩する
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · joomla-levels-api
クラス: 権限の取り残し 到達範囲: リモート
Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters
管理者ユーザー -> 表示アクセスレベルの閲覧には com_users に対する core.admin が必要です(LevelController::allowSave および delete)。Groups webservice はすでに同様の処理を行っています(GroupsController、6.1.1)。LevelsController には allowAdd、allowEdit、delete のオーバーライドがないため、ApiController は core.manage と core.create を通過させてしまいます。
core.admin を持たずに core.login.api を付与された Manager クラスの API トークンは、UI が禁じている表示アクセスレベルを作成できます。
| ID | CVE 未採番 |
| クラス | 権限の取り残し / 認可バイパス |
| 到達範囲 | リモート(core.login.api を持つ API トークン) |
| CWE | CWE-863 |
| CVSS | Medium: 6.1 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:N |
| 製品 | Joomla CMS |
| 影響を受けるバージョン | 6.1.3 (0f2d4de4729eb951e0878fec98c7990da07915b2) |
| 認証 | core.login.api と com_users の manage/create/edit を持つ Manager(グループ 6)用の API トークン。core.admin はなし。デフォルトの core.login.api は Super User のみ。 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
非 Super User の API トークンを使用して、どのグループがどのページを閲覧できるかを変更します。この取り残しだけでは Super User になることはできません。これはコンテンツの可視性の制御であり、サイトの乗っ取りではありません。
| 権限 | メソッド / パス | 種類 | ラボで実証済みか推測か |
|---|---|---|---|
| 表示アクセスレベルの作成 | POST /api/index.php/v1/users/levels JSON title、rules(グループ ID) | 完全性 | ラボで実証済み。HTTP 200、#__viewlevels id=7、title poc-level-JOOMLA-LEVELS-API-WITNESS |
| 既存レベルの編集(グループリスト / タイトル) | PATCH /api/index.php/v1/users/levels/{id} | 完全性 | 推測。同じコントローラー、allowEdit なし。ラボでは作成のみ。 |
| レベルの削除 | DELETE /api/index.php/v1/users/levels/{id} | 完全性 / ACL 行の可用性 | 推測。同じオーバーライドの欠落。ラボでは DELETE を実行せず。 |
| 会員限定の記事、モジュール、メニュー項目の公開 | rules に Public / Guest / Registered を含む新規またはパッチ適用済みレベル | 偵察(コンテンツの可視性) | #__viewlevels.rules からの推測。ラボでは行を挿入したが、稼働中の記事の ACL を変更してはいない。 |
| Registered からページを隠す、または攻撃者のグループを Special レベルに追加する | 同じ PATCH / create | 完全性 | 推測。同じストア。 |
| API からのユーザーグループの変更 | POST /api/index.php/v1/users/groups | n/a | ラボで実証済み クローズ。HTTP 403(GroupsController core.admin) |
| 管理者画面でユーザー -> 表示アクセスレベルを開く | GET /administrator/index.php?option=com_users&view=levels | n/a | ラボで実証済み クローズ。HTTP 403 |
| UI からのレベルの保存 | POST ... task=level.save | n/a | ラボで実証済み クローズ。HTTP 403(LevelController::allowSave は core.admin を要求) |
標準の Manager(core.login.api なし)で API にアクセス | Bearer トークン / X-Joomla-Token | n/a | 推測でクローズ。デフォルトの core.login.api は Super User(グループ 8)のみ。このラボではまずグループ 6 に付与している。 |
| Super User / インストーラー RCE | n/a | n/a | クローズ。Manager は Manager のまま。 |
2026-07/08 の JSST の波の後、joomla/joomla-cms 6.1.3 を固定しました。Groups API はすでに core.admin を要求しています。View levels は依然として ApiController(core.manage と core.create / core.edit / core.delete)をすり抜けます。LevelsController の唯一の追加ロジックは rules の PATCH JSON デコードです。
修正済みの Groups の兄弟分:
public function allowAdd($data = [])
{
return $this->app->getIdentity()->authorise('core.admin', $this->option);
}
管理者 UI:
protected function allowSave($data, $key = 'id')
{
return $this->app->getIdentity()->authorise('core.admin', $this->option)
&& parent::allowSave($data, $key);
}
すでに記録済みの誤った道: Groups API をまだオープンとみなすこと(403 です); まず core.login.api を付与せずに標準の Manager として API にアクセスすること(デフォルトは Super User のみ、CVE-2026-71574 / 72531 / 48904 と同じセットアップ); UI の 403 をすべてと読むこと(取り残しは API です)。お芝居: リバースシェル。オラクルは API 200 と Groups 403 と UI 403 です。
同じ固定での取り残し: menu items API、media override、articles catid。
python3 joomla-levels-api-Abraxas-Labs.py
または
cd lab
./run.sh
対象は http://127.0.0.1:19520 のみ。イメージは joomla:6.1.3-php8.3-apache と mariadb:11.4。
SUCCESS joomla-levels-api api-http=200 level-id=7 groups-api=403 ui-view=403 ui-save=403 JOOMLA-LEVELS-API-WITNESS
GroupsController の core.admin の allowAdd / allowEdit / delete を LevelsController にコピーします。管理者 UI のゲートは維持します。
0f2d4de4729eb951e0878fec98c7990da07915b2)LevelsController.phpcore.admin (6.1.1) · CVE-2026-71574GNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。