
Riferimento CVE-2024–27630
In Savane v3.12 e versioni precedenti, la mancanza di validazione del parametro file_id durante l'eliminazione di un file da /bugs/index.php porta a una vulnerabilità Insecure Direct Object Reference (IDOR) che consente a un amministratore autenticato di un gruppo con un bug tracker di eliminare arbitrariamente gli allegati file di qualsiasi bug tracker, causando l'indisponibilità di questi file. Poiché gli ID dei file incrementano a ogni nuovo caricamento, è possibile creare uno script che elimini iterativamente tutti gli allegati file sul server tramite file_id.
Classificazione CWE: CWE-639: Authorization Bypass Through User-Controlled Key
Segnalato da: Ally Petitt
Prodotto interessato: Savane
Versioni interessate: 3.12 e precedenti
La funzione responsabile dell'eliminazione degli allegati file nei bug tracker è trackers_data_delete_file(), definita nel blocco di codice seguente.
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]
);
La funzione inizia con una query SQL per verificare che il gruppo del bug ID specificato in item_id sia il gruppo di cui l'attaccante fa parte, noto come $group_id. La funzione non verifica se anche file_id appartiene al gruppo, il che significa che finché item_id corrisponde a un bug valido nel gruppo dell'attaccante, quest'ultimo può modificare file_id per puntare a qualsiasi file nella directory di upload /var/lib/savane/trackers_attachments.
Inoltre, questa funzione è accessibile solo agli amministratori del bug tracker.
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;
Questi passaggi dimostrano l'eliminazione di un file non autorizzato; tuttavia, si noti che un attaccante potrebbe automatizzare l'eliminazione di tutti i file tramite il loro ID, poiché questi sono prevedibili.
40231 è stato caricato dalla vittima:root@60ae93fe131f:/var/lib/savane/trackers_attachments# ls
40226 40227 40230 40231
Visitare la homepage del gruppo di cui l'attaccante è amministratore. Quindi, andare su Bugs > Browse e annotare un Item ID valido nella colonna più a sinistra della tabella. Questo ID verrà utilizzato nel passaggio successivo.
Come attaccante, effettuare una richiesta GET al percorso /bugs/index.php?func=delete_file&item_id=<ATTACKER_ITEM_ID>&item_file_id=<FILE_ID_TO_DELETE>.
Nel mio caso, la richiesta era simile a http://172.17.0.2:7890/bugs/index.php?func=delete_file&item_id=50697&item_file_id=40231.
Verificare che il file della vittima (da un gruppo su cui l'attaccante non ha privilegi) sia stato eliminato. Ad esempio:
root@60ae93fe131f:/var/lib/savane/trackers_attachments# ls
40226 40227 40230
Aggiornare a Savane versione 3.13 o successiva. La patch è disponibile qui.