
CVE-2024–27632 Riferimento
In Savane v3.12 e versioni precedenti, il timestamp Unix viene utilizzato come seme nel Generatore di Numeri Pseudo-Casuali (PRNG) impiegato per generare i token di protezione contro la Cross-Site Request Forgery (CSRF) (form_id). Di conseguenza, un attaccante potrebbe essere in grado di generare indipendentemente lo stesso token CSRF valido assegnato a un utente vittima, superando così i controlli CSRF e portando a un attacco CSRF riuscito. L'impatto di un attacco CSRF include l'escalation dei privilegi e il furto dell'account.
Classificazione CWE: CWE-335: Uso Incorretto dei Semi nel Generatore di Numeri Pseudo-Casuali (PRNG)
Segnalato da: Ally Petitt
Prodotto interessato: Savane
Versioni interessate: 3.12 e precedenti
Prima che venga generato il form_id, viene chiamata utils_srand(). Successivamente, il form_id generato viene creato come hash MD5 di un valore generato dal PRNG di PHP.
frontend/php/include/form.php:61
if (!$form_id)
{
utils_srand ();
$form_id = md5 (mt_rand (0, 1000000));
}
Come mostrato nel blocco di codice sottostante, utils_srand() è definita come una funzione che semina il microtime(), una funzione che restituisce il timestamp Unix moltiplicato per 1.000.000.
frontend/php/include/utils.php:969
function utils_srand ()
{
mt_srand ((int)((double)microtime () * 1000000));
}
Di conseguenza, il timestamp Unix, un valore prevedibile, viene utilizzato per generare un numero pseudo-casuale critico per la sicurezza. Il momento in cui è stato creato il token di un utente può potenzialmente essere indovinato o innescato da un attaccante per ottenere un timestamp valido che possa essere utilizzato per creare un token CSRF valido.
Questi passaggi mirano a dimostrare che conoscere il timestamp è sufficiente per generare un token valido in modo indipendente. Le strategie di attacco nel mondo reale possono richiedere ulteriore creatività per assicurarsi che venga individuato il timestamp corretto della creazione del token.
form_id.$RECORDED_UNIX_TIME con il tempo registrato ed esegui il seguente script PHP. Osserva che il valore generato corrisponde al form_id restituito dal server al momento della prima visita della pagina web.<?php
mt_srand ((int)((double)$RECORDED_UNIX_TIME* 1000000));
echo md5 (mt_rand (0, 1000000));
?>
Aggiornate a Savane versione 3.13 o superiore. La patch è disponibile qui.