TRAN CONG DANH - SVTT - Mentor: LUU VAN LAN - CVE-2018-7600 - Día de inicio: 26/06/2024.
Tabla de contenidos:
- Resumen del CVE
- Requisitos previos
- Análisis del CVE
- Mitigación
Resumen del CVE
- Un atacante podría llamar a una solicitud Ajax de la API de Formularios de Drupal que contenga la función call_user_func auto do
- Drupal anterior a 7.58, 8.x anterior a 8.3.9, 8.4.x anterior a 8.4.6 y 8.5.x anterior a 8.5.1
Requisitos previos
Análisis del CVE
- Encontramos que las claves que usan call_user_func son #pre_render, #post_render, #access_callback, #submit, #lazy_builder, #validate

- La tarea ahora es encontrar qué parámetro enviado por el usuario tiene un render, puede cambiar la clave y recibir la clave #post_render para invocarla.

- Cuando se redimensiona la imagen, el servidor llama a la API de Drupal

- La función &$array incluida aquí es la matriz de elementos predeterminados al enviarla; probemos a depurar sin código:

- Supongamos que modificas el valor de mail al subir:


- Al llamar al método getValue($array, $parents), el proceso es el siguiente:
$ref impide las referencias a $array.
Primer bucle: $ref referencia a $array['a'].
Segundo bucle: $ref referencia a $array['a']['b'].
Tercer bucle: $ref referencia a $array['a']['b']['c'].
Como resultado final, $ref quedará referenciado al valor 42.
$array = [
'a' => [
'b' => [
'c' => 42
]
]
];
$parents = ['a', 'b', 'c'];
- Después de recibir el valor $form de la función getValue. $form se convertirá en un argumento para la función Render

- La definición de call_user_func

- El resultado cuando uso el archivo de exploit:

Mitigación
- Parche
** Los desarrolladores de Drupal han publicado un parche que añade una clase RequestSanitizer con un método stripDangerousValues para eliminar todos los elementos de entrada de la matriz cuyas claves comiencen con “#”. Este método limpia la entrada en $_GET, $_POST y $_COOKIES.
** Drupal 8.6.5
/core/lib/Drupal/Core/DrupalKernel.php
/core/lib/Drupal/Core/Security/RequestSanitizer.php
** La función stripDangerousValues verifica todos los parámetros de entrada uno a uno; los primeros elementos de la matriz de entrada tienen un valor que comienza con “#” y los valores que no están en la lista blanca se eliminan.