TRAN CONG DANH - SVTT - Наставник: LUU VAN LAN - CVE-2018-7600 - Дата начала: 26/06/2024.
Оглавление:
- Обзор CVE
- Необходимые условия
- Анализ CVE
- Смягчение
Обзор CVE
- Злоумышленник мог вызвать Ajax-запрос Drupal Form API, содержащий функцию call_user_func auto do
- Drupal до 7.58, 8.x до 8.3.9, 8.4.x до 8.4.6 и 8.5.x до 8.5.1
Необходимые условия
Анализ CVE
- Мы находим ключи, использующие call_user_func: #pre_render, #post_render, #access_callback, #submit, #lazy_builder, #validate

- Задача теперь — найти, какой параметр, отправленный пользователем, содержит render, может изменить ключ и получить ключ #post_render, чтобы вызвать его.

- При изменении размера изображения сервер вызывает API Drupal

- Функция &$array, включённая сюда, представляет собой массив элементов по умолчанию при отправке. Давайте попробуем отладку без кода:

- Предположим, вы изменяете значение mail при загрузке:


- При вызове метода getValue($array, $parents) процесс выглядит следующим образом:
$ref запрещает ссылки на $array.
Первый цикл: $ref ссылается на $array['a'].
Второй цикл: $ref ссылается на $array['a']['b'].
Третий цикл: $ref ссылается на $array['a']['b']['c'].
В итоге $ref будет ссылаться на значение 42.
$array = [
'a' => [
'b' => [
'c' => 42
]
]
];
$parents = ['a', 'b', 'c'];
- После получения значения $form из функции getValue, $form станет аргументом для функции Render

- Определение call_user_func

- Результат при использовании файла эксплойта:

Смягчение
- Патч
** Разработчики Drupal опубликовали патч, добавив класс RequestSanitizer с методом stripDangerousValues для удаления всех входных элементов массива, ключи которых начинаются с “#”. Этот метод очищает входные данные в $_GET, $_POST и $_COOKIES.
** Drupal 8.6.5
/core/lib/Drupal/Core/DrupalKernel.php
/core/lib/Drupal/Core/Security/RequestSanitizer.php
** Функция stripDangerousValues проверяет все входные параметры один за другим, первые элементы входного массива имеют значение, начинающееся с “#”, а значения, не входящие в белый список, удаляются.