
Joomla 6.1.3 - 高 - リモート - ACL - GET /api/v1/users/levels が閲覧レベルを漏洩する
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · joomla-levels-api
解説記事: https://abraxaslabs.tech/research/joomla-levels-api
分類: 権限の取り残し 到達範囲: リモート
Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters
管理者の Users -> Viewing Access Levels は、com_users に対する core.admin を要求します(LevelController::allowSave および削除)。Groups ウェブサービスもすでに同様です(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) |
| 認証 | Manager(グループ 6)用の API トークンで、core.login.api と com_users の manage/create/edit を持つもの。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、タイトル 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 / 作成 | 完全性 | 推測。同じストア。 |
| API からユーザーグループを変更する | POST /api/index.php/v1/users/groups | 該当なし | ラボ実証で クローズ。HTTP 403(GroupsController の core.admin) |
| 管理者画面で Users -> Viewing Access Levels を開く | GET /administrator/index.php?option=com_users&view=levels | 該当なし | ラボ実証で クローズ。HTTP 403 |
| UI からレベルを保存する | POST ... task=level.save | 該当なし | ラボ実証で クローズ。HTTP 403(LevelController::allowSave は core.admin を要求) |
標準の Manager(core.login.api なし)で API にアクセスする | Bearer トークン / X-Joomla-Token | 該当なし | 推測でクローズ。デフォルトの core.login.api は Super User(グループ 8)のみ。このラボではまずグループ 6 に付与している。 |
| Super User / インストーラ RCE | 該当なし | 該当なし | クローズ。Manager は Manager のまま。 |
joomla/joomla-cms 6.1.3 を 2026-07/08 の JSST の波の後に固定しました。Groups API はすでに core.admin を要求しています。ビューレベルは依然として 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 を参照してください。ループバックラボ専用です。保証はありません。