
Joomla 6.1.3 - Высокий - Удалённый - ACL - остаток API пунктов меню
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · joomla-menu-items-api
Разбор: https://abraxaslabs.tech/research/joomla-menu-items-api
Класс: Остаточные привилегии Доступ: Удалённый
Joomla CMS 6.1.3 (0f2d4de) - Open Source Matters
Интерфейс администратора для пунктов меню проверяет com_menus.menu.{id} и отклоняет menutype == main. В api/components/com_menus/src/Controller/ItemsController.php отсутствуют allowAdd / allowEdit, поэтому ApiController запрашивает только core.manage плюс core.create / core.edit для com_menus.
Пользователь с токеном, которому разрешено управлять одним меню, может выполнить POST /api/index.php/v1/menus/administrator/items в меню, доступ к которому ему запрещён в интерфейсе, включая защищённое администраторское меню main.
| ID | CVE пока нет |
| Класс | Остаточные привилегии / обход авторизации |
| Доступ | Удалённый (API-токен с core.login.api) |
| CWE | CWE-863 |
| CVSS | Высокий: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Продукт | Joomla CMS |
| Затронуто | 6.1.3 (0f2d4de4729eb951e0878fec98c7990da07915b2) |
| Аутентификация | Удалённый пользователь API с core.login.api + core.manage + core.create/core.edit для com_menus, не Super User. По умолчанию core.login.api доступен только Super User. |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Пользователь с токеном, которому разрешено создавать пункты только в меню A. Он по-прежнему не может устанавливать расширения, если у него уже нет на это разрешения. Super User из этой остаточной привилегии он не становится.
| Привилегия | Метод / путь | Тип | Доказано в лаборатории или выведено |
|---|---|---|---|
| Создать пункт в меню, доступ к которому запрещён | POST /api/index.php/v1/menus/administrator/items с menutype меню B | целостность | Доказано в лаборатории. HTTP 200, пункт 102 в staffmenu, заголовок poc-JOOMLA-MENU-ITEMS-API-WITNESS |
Разместить URL в защищённом администраторском меню main | Тот же POST с menutype=main | целостность | Доказано в лаборатории, HTTP 200. Интерфейс allowEdit возвращает false для main |
| Направить сотрудников на поддельную страницу входа или скрыть настоящий администраторский пункт | Опубликованный пункт с URL в администраторском меню | целостность / разведка | Выведено из записи. В лаборатории размещён https://example.invalid/ |
| Редактировать или удалять пункты в меню, которыми они не владеют | API PATCH / DELETE использует те же отсутствующие allow* | целостность | Выведено. В лаборатории проверено создание |
| Устанавливать расширения или стать Super User | Требуются другие ACL | н/д | Закрыто. Manager не является Super User |
Закрыто на этой фиксации: добавление/сохранение через интерфейс в staffmenu для того же пользователя (not permitted). Добавление через интерфейс в labmenu по-прежнему работает. Проверка core.admin в Groups API из 6.1.1 не затронута.
Я зафиксировал 6.1.3 после волны 2026 JSST. Администраторский ItemController уже делает всё правильно:
return $user->authorise('core.create', 'com_menus.menu.' . $menutypeID);
if ($item->menutype == 'main') {
return false;
}
return $user->authorise('core.edit', 'com_menus.menu.' . (int) $menutypeID);
Контроллер элементов API не переопределяет allowAdd / allowEdit. По умолчанию ApiController проверяет только компонент core.manage плюс core.create / core.edit. Путь canSave модели проверяет только компонент core.edit. Пакетное копирование/перемещение уже проверяет ресурс меню.
Уже зафиксированные ошибочные пути: трактовка HTTP 200 от UI как разрешения (в теле — "not permitted"); трактовка core.manage на com_menus как достаточного в UI (UI всё равно опирается на com_menus.menu.{id}); стандартный Manager без core.login.api. Театр: обратная оболочка. Оракул — API 200 на staffmenu и main плюс отказ UI на B.
Остатки того же пина: levels API, media override, articles catid.
python3 joomla-menu-items-api-Abraxas-Labs.py
или
cd lab
./run.sh
Цель — только http://127.0.0.1:19530. Образ joomla:6.1.3-php8.3-apache.
SUCCESS joomla-menu-items-api api-b-http=200 item-id=102 menutype=staffmenu api-main-http=200 ui-add-b=200 ui-save-b=200 JOOMLA-MENU-ITEMS-API-WITNESS
ui-add-b / ui-save-b возвращают HTTP 200; отказ для B — это тело ответа UI «not permitted», а не статус 403.
Скопируйте ItemController::allowAdd / allowEdit (и удаление) в контроллер API, включая блок main. Проверяйте ресурс типа меню в canSave таким же образом.
0f2d4de4729eb951e0878fec98c7990da07915b2)ItemsController.phpItemController.phpGNU Affero GPL v3.0. См. LICENSE. Только для лабораторной среды с loopback. Без гарантий.