Savane v3.12 以前では、クロスサイトリクエストフォージェリ (CSRF) 保護トークン (form_id) の生成に使用される擬似乱数生成器 (PRNG) のシードとして Unix タイムスタンプが使用されています。その結果、攻撃者が被害ユーザーに割り当てられたものと同じ有効な 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() は、Unix タイムスタンプを返す関数である を 1,000,000 倍してシードする関数として定義されています。
microtime()frontend/php/include/utils.php:969
function utils_srand ()
{
mt_srand ((int)((double)microtime () * 1000000));
}
その結果、予測可能な値である Unix タイムスタンプが、セキュリティ上重要な擬似乱数の生成に使用されます。ユーザーのトークンが作成された時刻は、攻撃者によって推測または誘発される可能性があり、有効な CSRF トークンを作成するために使用できる有効なタイムスタンプを取得する可能性があります。
これらの手順は、タイムスタンプを知っていれば、有効なトークンを独立して生成するのに十分であることを示すことを目的としています。実際の攻撃戦略では、トークン作成の正しいタイムスタンプを推測していることを確認するために、追加の創意工夫が必要になる場合があります。
form_id を生成する Savane の Web ページにアクセスします。$RECORDED_UNIX_TIME を記録した時刻に置き換えて、次の PHP スクリプトを実行します。生成された値が、最初に Web ページにアクセスしたときにサーバーが返した form_id と一致することを確認します。<?php
mt_srand ((int)((double)$RECORDED_UNIX_TIME* 1000000));
echo md5 (mt_rand (0, 1000000));
?>
Savane バージョン 3.13 以降にアップグレードしてください。パッチは こちら にあります。