В этом техническом сообщении в блоге мы рассмотрим, как диск с помощью эксплойта в выпуске Pimcore 6.2.0 позволяет злоумышленнику выполнять команды ОС, обманывая аутентифицированного администратора в использовании уязвимости внедрения команд.
Мы отсканировали Pimcore 6.2.0 и выявили несколько критических уязвимостей, включая уязвимость внедрения команд и уязвимость внедрения SQL, которые могут быть использованы для полного удаленного выполнения кода. Обе уязвимости были исправлены в Pimcore 6.2.1.
Усеченные результаты анализа доступны в нашем демонстрационном приложении RIPS. Обратите внимание, что мы ограничили результаты проблемами, описанными в этом посте, чтобы обеспечить исправление.
От Exif-данных к выполнению кода
Exiftool - это программа для Linux, которая позволяет манипулировать метаданными изображения, называемыми exif-данными . Всякий раз, когда PimCore обрабатывает изображение, выполняется команда оболочки для запуска сценария exiftool с именем файла изображения в качестве параметра. Для этого JSON-объект передается через GET-переменную, которой злоумышленник может управлять, чтобы вставить ее непосредственно в команду оболочки.
В строке 1063 downloadImageThumbnailAction()метода $configпараметр, хранящий объект JSON, принимается из HTTP-запроса, декодируется и сохраняется в $configпеременной. После проверки того, что изображение представляет собой JPEG, а сценарий exiftool установлен в строке 1068, $config['dpi']переменная внедряется в команду ОС без проверки и выполняется в строке 1070. Хотя $thumbnailFileпеременная корректно очищается путем ее передачи
Подготовка массива: ключевое слово SQL's IN
Хотя Pimcore использует подготовленные операторы по всему приложению, мы могли бы подтвердить несколько SQL-инъекций, обнаруженных нашим сканером RIPS, требующих роли внутреннего пользователя, имеющего доступ к objectsразделу. Один из этих недостатков связан с уровнем абстрактной базы данных, который не обеспечивает прямой метод безопасного встраивания массива в запрос SQL. Часто разработчики испытывают потребность позволить пользователю предоставить список или массив идентификаторов, которые должны быть удалены, обновлены или выбраны. Чтобы решить эту проблему, они используют
addCollectionsAction() может быть вызван посредством маршрутизации непосредственно. Пользовательский ввод принимается через collectionIdsпараметр в строке 924. Затем отправляется массив идентификаторов
Напротив, современные уровни абстракции базы данных создают оболочку вокруг
Создание диска с помощью эксплойта
Отсутствующий токен CSRF позволяет злоумышленнику использовать уязвимости с помощью CSRF, что приводит к использованию эксплойта, когда администратор заманивает на вредоносную страницу, внедряющую форму, которая автоматически отправляется для отправки запроса на веб-страницу, включая файлы cookie администратор, позволяющий эксплуатировать удаленное выполнение кода. Чтобы использовать внедрение SQL, более сложная атака (
Резюме
Внутренние уязвимости, описанные в этом сообщении в блоге, очерчивают дисбаланс между злоумышленниками, с одной стороны, - требующими только одну точку отказа, - и защитниками, с другой стороны, которые пропускают один недостаток в системе, приводящий к полному компромиссу. Угроза уязвимостей CSRF часто недооценивается, однако в целевых атаках, предпринимаемых решительными противниками, они представляют собой привлекательный шаг для вторжения в сеть и социальной инженерии. В этом конкретном случае мы хотели бы поблагодарить разработчиков Pimcore и с благодарностью оценить их осведомленность о безопасности благодаря их мгновенному ответу и устранению проблем.
Мы отсканировали Pimcore 6.2.0 и выявили несколько критических уязвимостей, включая уязвимость внедрения команд и уязвимость внедрения SQL, которые могут быть использованы для полного удаленного выполнения кода. Обе уязвимости были исправлены в Pimcore 6.2.1.
Усеченные результаты анализа доступны в нашем демонстрационном приложении RIPS. Обратите внимание, что мы ограничили результаты проблемами, описанными в этом посте, чтобы обеспечить исправление.
Ссылка скрыта от гостей
От Exif-данных к выполнению кода
Exiftool - это программа для Linux, которая позволяет манипулировать метаданными изображения, называемыми exif-данными . Всякий раз, когда PimCore обрабатывает изображение, выполняется команда оболочки для запуска сценария exiftool с именем файла изображения в качестве параметра. Для этого JSON-объект передается через GET-переменную, которой злоумышленник может управлять, чтобы вставить ее непосредственно в команду оболочки.
PHP:
public function downloadImageThumbnailAction(Request $request)
{
/*...*/
$config = $this->decodeJson($request->get('config'));
/*...*/
$thumbnailConfig->setFormat($config['format']);
/*...*/
$exiftool = \Pimcore\Tool\Console::getExecutable('exiftool');
if ($thumbnailConfig->getFormat() == 'JPEG' && $exiftool
&& isset($config['dpi']) && $config['dpi']) {
\Pimcore\Tool\Console::exec($exiftool .
' -overwrite_original -xresolution=' . $config['dpi'] .
' -yresolution=' . $config['dpi'] . ' -resolutionunit=inches ' .
escapeshellarg($thumbnailFile));
}
В строке 1063 downloadImageThumbnailAction()метода $configпараметр, хранящий объект JSON, принимается из HTTP-запроса, декодируется и сохраняется в $configпеременной. После проверки того, что изображение представляет собой JPEG, а сценарий exiftool установлен в строке 1068, $config['dpi']переменная внедряется в команду ОС без проверки и выполняется в строке 1070. Хотя $thumbnailFileпеременная корректно очищается путем ее передачи
Ссылка скрыта от гостей
, разработчики PimCore не применил эту функцию к кнопке dpi$config параметра.Подготовка массива: ключевое слово SQL's IN
Хотя Pimcore использует подготовленные операторы по всему приложению, мы могли бы подтвердить несколько SQL-инъекций, обнаруженных нашим сканером RIPS, требующих роли внутреннего пользователя, имеющего доступ к objectsразделу. Один из этих недостатков связан с уровнем абстрактной базы данных, который не обеспечивает прямой метод безопасного встраивания массива в запрос SQL. Часто разработчики испытывают потребность позволить пользователю предоставить список или массив идентификаторов, которые должны быть удалены, обновлены или выбраны. Чтобы решить эту проблему, они используют
Ссылка скрыта от гостей
ключевое слово SQL . Теперь мы увидим пример того, как это может пойти не так:
PHP:
public function addCollectionsAction(Request $request)
{
$this->checkPermission('objects');
$ids = $this->decodeJson($request->get('collectionIds'));
/*...*/
if ($ids) {
$db = \Pimcore\Db::get();
$query = 'select * from classificationstore_groups g,
classificationstore_collectionrelations c where colId IN ('
. implode(',', $ids)
. ') and g.id = c.groupId';
/*...*/
$groupsData = $db->fetchAll($query);
addCollectionsAction() может быть вызван посредством маршрутизации непосредственно. Пользовательский ввод принимается через collectionIdsпараметр в строке 924. Затем отправляется массив идентификаторов
Ссылка скрыта от гостей
, преобразуя массив в разделенную запятыми строку его значений. Встроенная функция
Ссылка скрыта от гостей
не выполняет ни санацию, ни проверку, и поэтому результирующая строка не должна быть встроена непосредственно в запрос SQL, что делается в строке 930, ведущей к внедрению SQL.Напротив, современные уровни абстракции базы данных создают оболочку вокруг
Ссылка скрыта от гостей
метода PDO . Они подготовят запрос SQL, содержащий столько ?заполнителей, сколько имеется значений в массиве, и передадут потенциально вредоносный массив пользователя в качестве аргумента
Ссылка скрыта от гостей
методу PDOStatementэкземпляра.Создание диска с помощью эксплойта
Отсутствующий токен CSRF позволяет злоумышленнику использовать уязвимости с помощью CSRF, что приводит к использованию эксплойта, когда администратор заманивает на вредоносную страницу, внедряющую форму, которая автоматически отправляется для отправки запроса на веб-страницу, включая файлы cookie администратор, позволяющий эксплуатировать удаленное выполнение кода. Чтобы использовать внедрение SQL, более сложная атака (
Ссылка скрыта от гостей
) позволяет извлекать данные через побочные каналы.Резюме
Внутренние уязвимости, описанные в этом сообщении в блоге, очерчивают дисбаланс между злоумышленниками, с одной стороны, - требующими только одну точку отказа, - и защитниками, с другой стороны, которые пропускают один недостаток в системе, приводящий к полному компромиссу. Угроза уязвимостей CSRF часто недооценивается, однако в целевых атаках, предпринимаемых решительными противниками, они представляют собой привлекательный шаг для вторжения в сеть и социальной инженерии. В этом конкретном случае мы хотели бы поблагодарить разработчиков Pimcore и с благодарностью оценить их осведомленность о безопасности благодаря их мгновенному ответу и устранению проблем.