
Joomla 6.1.3 - Высокий - Удалённый - ACL - остаток API пунктов меню
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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. UI allowEdit возвращает false для main |
| Направить сотрудников на похожую страницу входа или скрыть реальный административный пункт | Опубликованный URL-пункт в административном меню | целостность / разведка | Выведено из записи. В лаборатории размещён https://example.invalid/ |
| Редактировать или удалять пункты в меню, которыми они не владеют | API PATCH / DELETE использует те же отсутствующие allow* | целостность | Выведено. В лаборатории проверено создание |
| Устанавливать расширения или стать Super User | Требуются другие ACL | н/д | Закрыто. Manager не является Super User |
Закрыто на этой версии: добавление/сохранение через UI в staffmenu для того же пользователя (not permitted). Добавление через UI в 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 (и delete) в контроллер API, включая блок main. Проверяйте ресурс типа меню в canSave таким же образом.
0f2d4de4729eb951e0878fec98c7990da07915b2)ItemsController.phpItemController.phpGNU Affero GPL v3.0. См. LICENSE. Только лаборатория на loopback. Без гарантий.