TRAN CONG DANH - SVTT - Mentore: LUU VAN LAN - CVE-2018-7600 - Giorno di inizio: 26/06/2024.
Indice dei contenuti:
- Riepilogo CVE
- Prerequisiti
- Analisi CVE
- Mitigazione
Riepilogo CVE
- Un attaccante potrebbe chiamare una richiesta Ajax dell'API Form di Drupal contenente la funzione auto do di call_user_func
- Drupal prima di 7.58, 8.x prima di 8.3.9, 8.4.x prima di 8.4.6, e 8.5.x prima di 8.5.1
Prerequisiti
Analisi CVE
- Troviamo che le chiavi che usano call_user_func sono #pre_render, #post_render, #access_callback, #submit, #lazy_builder, #validate

- Il compito ora è trovare quale parametro inviato dall'utente ha un render, può cambiare la chiave e ricevere la chiave #post_render, per richiamarlo.

- Quando si ridimensiona l'immagine, il server chiama l'API di Drupal

- La funzione &$array inclusa qui è l'array degli elementi predefiniti quando inviati, proviamo a eseguire il debug senza codice:

- Supponiamo di modificare il valore della mail durante il caricamento:


- Quando si chiama il metodo getValue($array, $parents), il processo è il seguente:
$ref impedisce i riferimenti a $array.
Primo ciclo: $ref riferito a $array['a'].
Secondo ciclo: $ref riferito a $array['a']['b'].
Terzo ciclo: $ref riferito a $array['a']['b']['c'].
Il risultato finale, $ref sarà riferito al valore 42.
$array = [
'a' => [
'b' => [
'c' => 42
]
]
];
$parents = ['a', 'b', 'c'];
- Dopo aver ricevuto il valore $form dalla funzione getValue, $form diventerà un argomento per la funzione Render

- La definizione di call_user_func

- Il risultato quando uso il file exploit:

Mitigazione
- Patch
** Gli sviluppatori di Drupal hanno pubblicato una patch, aggiungendo una classe RequestSanitizer con un metodo stripDangerousValues per rimuovere tutti gli elementi di input dell'array le cui chiavi iniziano con "#". Questo metodo pulisce l'input in $_GET, $_POST e $_COOKIES.
** Drupal 8.6.5
/core/lib/Drupal/Core/DrupalKernel.php
/core/lib/Drupal/Core/Security/RequestSanitizer.php
** La funzione stripDangerousValues verifica uno per uno tutti i parametri di input, i primi elementi dell'array di input hanno un valore che inizia con "#" e i valori non in whitelist vengono rimossi.