
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
Administrator Users -> Viewing Access Levels требует core.admin на com_users (LevelController::allowSave и удаление). Веб-сервис Groups уже делает то же самое (GroupsController, 6.1.1). В LevelsController нет переопределений allowAdd, allowEdit или delete, поэтому ApiController пропускает core.manage вместе с core.create.
API-токен класса Manager, которому предоставлен core.login.api без core.admin, может создавать уровни доступа для просмотра, что запрещено в UI.
| ID | CVE пока нет |
| Класс | Остаточные привилегии / обход авторизации |
| Доступ | Удалённый (API-токен с core.login.api) |
| CWE | CWE-863 |
| CVSS | Средний: 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) |
| Аутентификация | API-токен для Manager (группа 6) с core.login.api и manage/create/edit для com_users. Без core.admin. По умолчанию core.login.api доступен только Super User. |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Использовать API-токен не-Super-User, чтобы изменить, какие группы видят какие страницы. Из-за этой остаточной привилегии они не становятся 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 |
| Изменить существующий уровень (список групп / title) | 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 | н/д | Доказано в лаборатории закрыто. 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) |
Обратиться к API со стандартным Manager (без core.login.api) | Bearer-токен / X-Joomla-Token | н/д | Выведено как закрыто. По умолчанию core.login.api доступен только Super User (группа 8). В этой лаборатории его сначала предоставили группе 6. |
| RCE через Super User / установщик | н/д | н/д | Закрыто. Manager остаётся Manager. |
Я закрепил joomla/joomla-cms 6.1.3 после волны JSST 2026-07/08. Groups API уже требует core.admin. Уровни доступа по-прежнему проходят через ApiController (core.manage плюс core.create / core.edit / core.delete). Единственная дополнительная логика в LevelsController — это JSON-декодирование rules в PATCH.
Исправленный соседний Groups:
public function allowAdd($data = [])
{
return $this->app->getIdentity()->authorise('core.admin', $this->option);
}
Интерфейс администратора:
protected function allowSave($data, $key = 'id')
{
return $this->app->getIdentity()->authorise('core.admin', $this->option)
&& parent::allowSave($data, $key);
}
Уже зафиксированные неверные шаги: считать Groups API по-прежнему открытым (там 403); обращаться к API как обычный Manager без предварительного предоставления core.login.api (по умолчанию только Super User, та же настройка, что и в CVE-2026-71574 / 72531 / 48904); воспринимать UI 403 как полную картину (остаётся API). Театр: reverse shell. Оракул — 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
Скопируйте core.admin allowAdd / allowEdit / delete из GroupsController в LevelsController. Сохраните проверку доступа для административного интерфейса.
0f2d4de4729eb951e0878fec98c7990da07915b2)LevelsController.phpcore.admin (6.1.1) · CVE-2026-71574GNU Affero GPL v3.0. См. LICENSE. Только для локальной лабораторной среды. Без гарантий.