В Craft CMS, системе управления контентом на PHP, вендор подтвердил несколько уязвимостей в ветках 4.x и 5.x. Часть проблем работает без учётной записи: анонимный запрос к GraphQL (язык запросов к API) или к поиску элементов позволяет внедрить SQL-код и добраться до содержимого базы. Другие требуют входа в панель управления, зато дают обход песочницы шаблонов Twig и выполнение команд на сервере. Затронуты обе ветки, а также Commerce-mollie версий до 4.4.3.
Внедрение SQL-кода и обход песочницы Twig
Исправления вышли в версиях 4.18.9 и 5.11.2, для Commerce-mollie указана 4.4.3. Идентификатор CVE ни одной из проблем не присвоен, других сведений о Commerce-mollie в перечне нет. Случаев эксплуатации в реальных атаках вендор не приводит. Публикация технических подробностей означает, что детали стали доступны, а не то, что уязвимости уже используют. Все описанные атаки идут по сети; для анонимных веток учётные данные не нужны, для панельных достаточно обычного входа.
Анонимный доступ к базе и схеме GraphQL
Анонимный доступ к базе открывает внедрение SQL-кода в поиске элементов. Элемент в Craft - это запись, товар, файл или другая единица контента. Значение параметра с именем атрибута попадает в запрос без очистки, а драйвер базы данных отправляет несколько инструкций одним пакетом. В отчёте описан случай, когда этим способом выставлен признак администратора учётной записи с идентификатором 1; тем же способом перезаписывается хеш пароля любой учётной записи. Уровень High по классификации вендора.
Ещё один анонимный путь идёт через GraphQL. Схема GraphQL описывает, какие данные доступны какому клиенту. Если публичная схема разрешает анонимное чтение хотя бы одной секции или тома файлов, но закрывает группы пользователей, запрос подставляет своё выражение SQL в список выбираемых полей. Условие - одна запись с автором или один файл с заполненным загрузившим. В результате аноним читает адреса почты, хеши паролей и токены сессий, и ограничения схемы этому не мешают.
Выдача схеме прав на чтение групп пользователей закрывает этот путь: поля автора и загрузившего становятся обычными полями с фиксированными аргументами. Похожие проблемы среднего уровня касаются той же схемы. Переходы к предыдущей и следующей записи позволяют анонимному клиенту читать секции, исключённые из схемы. В многосайтовой установке поле localized без аргумента сайта отдаёт контент сайта, которого схема не касается. Для обеих атак нужен один запрос, учётные данные и файлы cookie не требуются.
Цепочки обхода песочницы в панели управления
Остальные проблемы требуют учётной записи панели управления, иногда самой низкой по правам. Песочница Twig не даёт шаблонам вызывать произвольный код PHP, но несколько независимых путей её обходят. Один идёт через метод, который возвращает владельцев элемента и принимает критерии от пользователя. Второй - через методы перехода к соседним элементам, где критерии очищаются не полностью. Третий - через фильтр условий поиска, который по ответам сервера восстанавливает ключ безопасности посимвольно.
Ещё один путь не связан с шаблонами: неадминистратор получает подпись своего шаблона на адресе app/render-elements и передаёт её как параметр редиректа при входе. Другой подменяет ключ безопасности CRAFT_SECURITY_KEY через фиктивные заголовки ответа API, куда удаётся вставить перевод строки. Любой из этих путей заканчивается выполнением команд операционной системы с правами процесса PHP. Отсюда доступ к ключу безопасности, базе, учётным данным окружения и любым файлам, которые читает процесс. Один из отчётов отдельно описывает слепое внедрение SQL-кода через критерии перехода, то есть чтение базы по ответам сервера без вывода данных на экран.
Регистрация, чтение файлов и обзор томов
Проблемы нижних уровней проще. Публичная регистрация позволяет занять деактивированную учётную запись и сохранить её прямые права. Если проверка почты отключена, это заканчивается захватом привилегированного аккаунта. Конечная точка app/icon-svg читает любой файл на сервере, содержимое которого распознаётся как SVG. Замена файла в браузере открывает структуру каталогов всех томов, включая недоступные пользователю, хотя сами файлы он не видит.
Обновление закрывает весь набор проблем. Ветки 4.x и 5.x получают исправления в версиях 4.18.9 и 5.11.2, Commerce-mollie в 4.4.3. Если обновление отложено, вендор называет одну обходную меру: выдать публичной схеме GraphQL права на чтение групп пользователей. Других обходных мер уведомления не приводят. В первую очередь проверки нужны установкам с анонимной схемой GraphQL, открытой регистрацией и несколькими сайтами.
Ссылки
- https://github.com/craftcms/cms/security
- https://github.com/craftcms/cms/security/advisories/GHSA-mp59-9rf5-93wr
- https://github.com/craftcms/cms/security/advisories/GHSA-xpg7-m6gm-4xfh
- https://github.com/craftcms/cms/security/advisories/GHSA-5v62-pcq7-fxj9
- https://github.com/craftcms/cms/security/advisories/GHSA-v25r-wr32-jfg7
- https://github.com/craftcms/cms/security/advisories/GHSA-qcvp-ggx3-97r6
- https://github.com/craftcms/cms/security/advisories/GHSA-9hp6-3565-gvh5
- https://github.com/craftcms/cms/security/advisories/GHSA-v4q3-2g5g-wjj6
- https://github.com/craftcms/cms/security/advisories/GHSA-qj3q-j7r4-428p
- https://github.com/craftcms/cms/security/advisories/GHSA-f6gf-r952-rxg6
- https://github.com/craftcms/cms/security/advisories/GHSA-r56r-f696-c8w9
- https://github.com/craftcms/cms/security/advisories/GHSA-hvp5-pwxx-2752
- https://github.com/craftcms/cms/security/advisories/GHSA-mjj9-pjh4-r48g