
CVE-2024–27632 Referência
No Savane v3.12 e anteriores, o timestamp Unix é usado como semente no Gerador de Números Pseudo-Aleatórios (PRNG) usado para gerar tokens de proteção contra Cross-Site Request Forgery (CSRF) (form_id). Como resultado, um atacante pode ser capaz de gerar independentemente o mesmo token CSRF válido que foi atribuído a um usuário vítima, passando assim pelas verificações CSRF e levando a um ataque CSRF bem-sucedido. O impacto de um ataque CSRF inclui escalada de privilégios e tomada de conta.
Classificação CWE: CWE-335: Uso Incorreto de Sementes em Gerador de Números Pseudo-Aleatórios (PRNG)
Relatado Por: Ally Petitt
Produto Afetado: Savane
Versões Afetadas: 3.12 e anteriores
Antes do form_id ser gerado, utils_srand() é chamado. Em seguida, o form_id gerado é criado como um hash MD5 de um valor gerado pelo PRNG do PHP.
frontend/php/include/form.php:61
if (!$form_id)
{
utils_srand ();
$form_id = md5 (mt_rand (0, 1000000));
}
Conforme mostrado no bloco de código abaixo, utils_srand() é definido como uma função que semeia microtime(), uma função que retorna o timestamp Unix, multiplicado por 1.000.000.
frontend/php/include/utils.php:969
function utils_srand ()
{
mt_srand ((int)((double)microtime () * 1000000));
}
Como resultado, o timestamp Unix, um valor previsível, é usado para gerar um número pseudo-aleatório crítico para a segurança. O momento em que o token de um usuário foi criado pode potencialmente ser adivinhado ou disparado por um atacante a fim de obter um timestamp válido que eles possam usar para criar um token CSRF válido.
Estas etapas visam demonstrar que conhecer o timestamp é suficiente para gerar um token válido de forma independente. Estratégias de ataque do mundo real podem envolver criatividade adicional para garantir que o timestamp correto da criação do token esteja sendo deduzido.
form_id.$RECORDED_UNIX_TIME pela hora que foi registrada e execute o seguinte script PHP. Observe que o valor gerado corresponde ao form_id que o servidor retornou ao visitar a página inicialmente.<?php
mt_srand ((int)((double)$RECORDED_UNIX_TIME* 1000000));
echo md5 (mt_rand (0, 1000000));
?>
Atualize para a versão 3.13 ou superior do Savane. O patch pode ser encontrado aqui.