
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
Для раздела «Пользователи -> Уровни доступа для просмотра» требуется core.admin на com_users (LevelController::allowSave и удаление). Веб-сервис групп уже делает то же самое (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 |
| Изменить существующий уровень (список групп / заголовок) | 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) |
| Открыть «Пользователи -> Уровни доступа для просмотра» в администраторе | 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. 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);
}
UI администратора:
protected function allowSave($data, $key = 'id')
{
return $this->app->getIdentity()->authorise('core.admin', $this->option)
&& parent::allowSave($data, $key);
}
Уже зафиксированные ошибочные пути: считать API групп всё ещё открытым (он возвращает 403); обращаться к API со стандартным Manager без предварительного предоставления core.login.api (по умолчанию только Super User, та же настройка, что в CVE-2026-71574 / 72531 / 48904); воспринимать 403 в UI как полную картину (остаточная привилегия — это API). Театр: обратная оболочка. Оракул — API 200 плюс Groups 403 плюс UI 403.
Остаточные привилегии того же тега: API пунктов меню, переопределение медиа, 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. Сохраните проверку в UI администратора.
0f2d4de4729eb951e0878fec98c7990da07915b2)LevelsController.phpcore.admin (6.1.1) · CVE-2026-71574GNU Affero GPL v3.0. См. LICENSE. Только лаборатория на loopback. Без гарантий.