
مرجع CVE-2024–27630
في Savane v3.12 والإصدارات السابقة له، يؤدي نقص التحقق من المعامل file_id عند حذف ملف من /bugs/index.php إلى ثغرة مرجع كائن مباشر غير آمن (IDOR) يمكن أن تسمح لمسؤول مُصادَق عليه لمجموعة تحتوي على متتبع أخطاء بحذف الملفات المرفقة لأي متتبع أخطاء بشكل تعسفي، مما يؤدي إلى عدم توافر هذه الملفات. نظرًا لأن معرّفات الملفات تتزايد مع كل رفع جديد، فمن الممكن إنشاء سكريبت يقوم بحذف جميع الملفات المرفقة على الخادم بشكل تكراري عبر file_id.
تصنيف CWE: CWE-639: تجاوز التفويض عبر مفتاح يتحكم فيه المستخدم
المُبلِغ: 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) صالحًا في العمود الموجود في أقصى اليسار من الجدول. سيُستخدم هذا المعرّف في الخطوة التالية.
بصفة المهاجم، أرسل طلب 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 أو أحدث. يمكن العثور على التصحيح هنا.