在 Savane v3.12 及更早版本中,Unix 时间戳被用作伪随机数生成器 (PRNG) 的种子,该生成器用于生成跨站请求伪造 (CSRF) 保护令牌 (form_id)。因此,攻击者可能能够独立生成与被攻击用户分配的相同有效 CSRF 令牌,从而通过 CSRF 检查并导致成功的 CSRF 攻击。CSRF 攻击的影响包括权限提升和帐户接管。
CWE 分类: CWE-335:伪随机数生成器 (PRNG) 中种子的错误使用
报告者: Ally Petitt
受影响产品:Savane
受影响版本:3.12 及更早版本
在生成 form_id 之前,会调用 utils_srand()。然后,生成的 form_id 作为 PHP 的 PRNG 生成值的 MD5 哈希值创建。
frontend/php/include/form.php:61
if (!$form_id)
{
utils_srand ();
$form_id = md5 (mt_rand (0, 1000000));
}
如下面的代码块所示,utils_srand() 被定义为一个函数,它以 microtime()(返回 Unix 时间戳的函数)乘以 1,000,000 作为种子。
frontend/php/include/utils.php:969
function utils_srand ()
{
mt_srand ((int)((double)microtime () * 1000000));
}
因此,可预测的 Unix 时间戳被用于生成安全关键的伪随机数。用户令牌创建的时间可能被攻击者猜测或触发,以便获取有效的时间戳,从而构造有效的 CSRF 令牌。
这些步骤旨在证明,知道时间戳足以独立生成有效的令牌。现实中的攻击策略可能需要额外的创造性,以确保推断出令牌创建的正确时间戳。
form_id 的 Savane 网页。$RECORDED_UNIX_TIME 替换为记录的时间,然后运行以下 PHP 脚本。观察生成的值是否与首次访问网页时服务器返回的 form_id 匹配。<?php
mt_srand ((int)((double)$RECORDED_UNIX_TIME* 1000000));
echo md5 (mt_rand (0, 1000000));
?>
升级到 Savane 3.13 或更高版本。补丁可在这里找到。