TRAN CONG DANH - SVTT - Mentor: LUU VAN LAN - CVE-2018-7600 - Date de début : 26/06/2024.
Table des matières :
- Résumé CVE
- Prérequis
- Analyse CVE
- Atténuation
Résumé CVE
- Un attaquant pourrait appeler une requête Ajax de l'API Formulaire Drupal contenant la fonction call_user_func auto do
- Drupal avant 7.58, 8.x avant 8.3.9, 8.4.x avant 8.4.6 et 8.5.x avant 8.5.1
Prérequis
Analyse CVE
- Nous trouvons que les clés utilisant call_user_func sont #pre_render, #post_render, #access_callback, #submit, #lazy_builder, #validate

- La tâche maintenant est de trouver quel paramètre soumis par l'utilisateur possède un render, peut changer la clé, et recevoir la clé #post_render, pour l'appeler.

- Lors du redimensionnement, le serveur d'images appelle l'API Drupal

- La fonction &$array incluse ici est le tableau d'éléments par défaut lors de l'envoi, essayons de déboguer sans code :

- Supposons que vous modifiiez la valeur de mail lors du téléchargement :


- Lors de l'appel de la méthode getValue($array, $parents), le processus est le suivant :
$ref interdit les références à $array.
Première boucle : $ref référence à $array['a'].
Deuxième boucle : $ref référence à $array['a']['b'].
Troisième boucle : $ref référence à $array['a']['b']['c'].
Le résultat final, $ref sera référencé à la valeur 42.
$array = [
'a' => [
'b' => [
'c' => 42
]
]
];
$parents = ['a', 'b', 'c'];
- Après avoir reçu la valeur $form de la fonction getValue. $form deviendra un argument pour la fonction Render

- La définition de call_user_func

- Le résultat lorsque j'utilise le fichier d'exploit :

Atténuation
- Correctif
** Les développeurs de Drupal ont publié un correctif, ajoutant une classe RequestSanitizer avec une méthode stripDangerousValues pour supprimer tous les éléments d'entrée du tableau dont les clés commencent par '#'. Cette méthode nettoie les entrées dans $_GET, $_POST et $_COOKIES.
** Drupal 8.6.5
/core/lib/Drupal/Core/DrupalKernel.php
/core/lib/Drupal/Core/Security/RequestSanitizer.php
** La fonction stripDangerousValues vérifie tous les paramètres d'entrée un par un, les premiers éléments du tableau d'entrée ayant une valeur commençant par '#' et les valeurs non autorisées sont supprimées.