
Referencia CVE-2024–27632
En Savane v3.12 y anteriores, la marca de tiempo Unix se utiliza como semilla en el Generador de Números Pseudoaleatorios (PRNG) empleado para generar tokens de protección contra Falsificación de Solicitudes entre Sitios (CSRF) (form_id). Como resultado, un atacante podría generar de forma independiente el mismo token CSRF válido que se asignó a un usuario víctima, evitando así las comprobaciones CSRF y dando lugar a un ataque CSRF exitoso. El impacto de un ataque CSRF incluye escalada de privilegios y toma de control de la cuenta.
Clasificación CWE: CWE-335: Uso Incorrecto de Semillas en el Generador de Números Pseudoaleatorios (PRNG)
Reportado por: Ally Petitt
Producto Afectado: Savane
Versiones Afectadas: 3.12 y anteriores
Antes de que se genere form_id, se llama a utils_srand(). Luego, el form_id generado se crea como un hash MD5 de un valor generado por el PRNG de PHP.
frontend/php/include/form.php:61
if (!$form_id)
{
utils_srand ();
$form_id = md5 (mt_rand (0, 1000000));
}
Como se muestra en el bloque de código a continuación, utils_srand() se define como una función que siembra la función microtime(), la cual devuelve la marca de tiempo Unix multiplicada por 1.000.000.
frontend/php/include/utils.php:969
function utils_srand ()
{
mt_srand ((int)((double)microtime () * 1000000));
}
En consecuencia, la marca de tiempo Unix, un valor predecible, se utiliza para generar un número pseudoaleatorio crítico para la seguridad. El momento en que se creó el token de un usuario puede ser potencialmente adivinado o provocado por un atacante para obtener una marca de tiempo válida que pueda usar para elaborar un token CSRF válido.
Estos pasos tienen como objetivo demostrar que conocer la marca de tiempo es suficiente para generar un token válido de forma independiente. Las estrategias de ataque en el mundo real pueden implicar creatividad adicional para asegurar que se está deduciendo la marca de tiempo correcta de la creación del token.
form_id.$RECORDED_UNIX_TIME con la hora que registró y ejecute el siguiente script PHP. Observe que el valor generado coincide con el form_id que el servidor devolvió al visitar inicialmente la página web.<?php
mt_srand ((int)((double)$RECORDED_UNIX_TIME* 1000000));
echo md5 (mt_rand (0, 1000000));
?>
Actualice a la versión 3.13 o superior de Savane. El parche se puede encontrar aquí.