
CVE-2024–27632 Référence
Dans Savane v3.12 et versions antérieures, le timestamp Unix est utilisé comme germe dans le générateur de nombres pseudo-aléatoires (PRNG) utilisé pour générer les jetons de protection contre les failles de type Cross-Site Request Forgery (CSRF) (form_id). Par conséquent, un attaquant peut être en mesure de générer indépendamment le même jeton CSRF valide qui a été attribué à un utilisateur victime, contournant ainsi les vérifications CSRF et menant à une attaque CSRF réussie. L'impact d'une attaque CSRF inclut l'escalade de privilèges et la prise de contrôle du compte.
Classification CWE : CWE-335 : Utilisation incorrecte des germes dans le générateur de nombres pseudo-aléatoires (PRNG)
Signalé par : Ally Petitt
Produit concerné : Savane
Versions concernées : 3.12 et antérieures
Avant que form_id ne soit généré, utils_srand() est appelé. Ensuite, le form_id généré est créé comme un hachage MD5 d'une valeur générée par le PRNG de PHP.
frontend/php/include/form.php:61
if (!$form_id)
{
utils_srand ();
$form_id = md5 (mt_rand (0, 1000000));
}
Comme le montre le bloc de code ci-dessous, utils_srand() est définie comme une fonction qui utilise comme germe microtime(), une fonction qui renvoie le timestamp Unix, multiplié par 1 000 000.
frontend/php/include/utils.php:969
function utils_srand ()
{
mt_srand ((int)((double)microtime () * 1000000));
}
Par conséquent, le timestamp Unix, une valeur prévisible, est utilisé pour générer un nombre pseudo-aléatoire critique pour la sécurité. Le moment où le jeton d'un utilisateur a été créé peut potentiellement être deviné ou déclenché par un attaquant afin d'obtenir un timestamp valide qu'il peut utiliser pour créer un jeton CSRF valide.
Ces étapes visent à démontrer que connaître le timestamp suffit pour générer un jeton valide de manière indépendante. Les stratégies d'attaque réelles peuvent impliquer une créativité supplémentaire pour s'assurer que le timestamp correct de la création du jeton est déduit.
form_id.$RECORDED_UNIX_TIME par l'heure enregistrée et exécutez le script PHP suivant. Observez que la valeur générée correspond au form_id que le serveur a renvoyé lors de la première visite de la page Web.<?php
mt_srand ((int)((double)$RECORDED_UNIX_TIME* 1000000));
echo md5 (mt_rand (0, 1000000));
?>
Mettez à niveau vers Savane version 3.13 ou supérieure. Le correctif se trouve ici.