
CVE-2024–27630 Referencia
En Savane v3.12 y anteriores, la falta de validación del parámetro file_id al eliminar un archivo de /bugs/index.php conduce a una vulnerabilidad de Referencia Directa a Objetos Insegura (IDOR) que puede hacer que un administrador autenticado de un grupo con un rastreador de errores elimine arbitrariamente archivos adjuntos de cualquier rastreador de errores, lo que provoca una falta de disponibilidad de estos archivos. Dado que los IDs de archivo se incrementan con cada nueva subida, es posible crear un script que elimine iterativamente todos los archivos adjuntos en el servidor mediante file_id.
Clasificación CWE: CWE-639: Omisión de Autorización a través de Clave Controlada por el Usuario
Reportado por: Ally Petitt
Producto Afectado: Savane
Versiones Afectadas: 3.12 y anteriores
La función responsable de eliminar archivos adjuntos en los rastreadores de errores es trackers_data_delete_file(), que se define en el bloque de código a continuación.
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 función comienza con una consulta SQL para verificar que el grupo al que pertenece el ID de error especificado en item_id es el grupo del que el atacante forma parte, conocido como $group_id. La función no comprueba si file_id también es parte del grupo, lo que significa que mientras item_id corresponda a un error válido en el grupo del atacante, este puede modificar file_id para que apunte a cualquier archivo dentro del directorio de subida /var/lib/savane/trackers_attachments.
Adicionalmente, esta función solo es accesible para administradores del rastreador de errores.
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;
Estos pasos demuestran la eliminación de un archivo no autorizado; sin embargo, tenga en cuenta que un atacante podría automatizar la eliminación de todos los archivos por su ID, ya que son predecibles.
40231 fue subido por la víctima:root@60ae93fe131f:/var/lib/savane/trackers_attachments# ls
40226 40227 40230 40231
Visite la página principal del grupo del cual el atacante es administrador. Luego, visite Bugs > Browse y observe un ID de elemento válido en la columna más a la izquierda de la tabla. Este ID se usará en el siguiente paso.
Como atacante, haga una solicitud GET a la ruta /bugs/index.php?func=delete_file&item_id=<ATTACKER_ITEM_ID>&item_file_id=<FILE_ID_TO_DELETE>.
En mi caso, esto se ve como http://172.17.0.2:7890/bugs/index.php?func=delete_file&item_id=50697&item_file_id=40231.
Verifique que el archivo de la víctima (de un grupo sobre el cual el atacante no tiene privilegios) ha sido eliminado. Por ejemplo:
root@60ae93fe131f:/var/lib/savane/trackers_attachments# ls
40226 40227 40230
Actualice a Savane versión 3.13 o superior. El parche se puede encontrar aquí.