
Referência CVE-2024–27630
No Savane v3.12 e versões anteriores, a falta de validação no parâmetro file_id ao excluir um arquivo de /bugs/index.php leva a uma vulnerabilidade de Referência Direta a Objetos Insegura (IDOR) que pode fazer com que um administrador autenticado de um grupo com um rastreador de bugs exclua arbitrariamente anexos de arquivos de qualquer rastreador de bugs, resultando na indisponibilidade desses arquivos. Como os IDs dos arquivos incrementam a cada novo upload, é possível criar um script que exclua iterativamente todos os anexos de arquivos no servidor pelo file_id.
Classificação CWE: CWE-639: Bypass de Autorização por Chave Controlada pelo Usuário
Reportado por: Ally Petitt
Produto Afetado: Savane
Versões Afetadas: 3.12 e anteriores
A função responsável por excluir anexos de arquivos nos rastreadores de bugs é trackers_data_delete_file(), que está definida no bloco de código abaixo.
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]
);
A função começa com uma consulta SQL para verificar se o grupo ao qual pertence o ID do bug especificado em item_id é o grupo do qual o atacante faz parte, conhecido como $group_id. A função não verifica se o file_id também faz parte do grupo, o que significa que, desde que o item_id corresponda a um bug válido no grupo do atacante, o atacante pode modificar o file_id para apontar para qualquer arquivo no diretório de upload /var/lib/savane/trackers_attachments.
Além disso, esta função só é acessível aos administradores do rastreador de bugs.
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;
Estas etapas demonstram a exclusão de um arquivo não autorizado; no entanto, observe que um atacante poderia automatizar a exclusão de todos os arquivos pelos seus IDs, já que eles são previsíveis.
40231 foi enviado pela vítima:root@60ae93fe131f:/var/lib/savane/trackers_attachments# ls
40226 40227 40230 40231
Visite a página inicial do grupo do qual o atacante é administrador. Em seguida, visite Bugs > Browse e observe um ID de Item válido na coluna mais à esquerda da tabela. Este ID será usado na próxima etapa.
Como atacante, faça uma requisição GET para o caminho /bugs/index.php?func=delete_file&item_id=<ATTACKER_ITEM_ID>&item_file_id=<FILE_ID_TO_DELETE>.
No meu caso, isso se parece com http://172.17.0.2:7890/bugs/index.php?func=delete_file&item_id=50697&item_file_id=40231.
Verifique se o arquivo da vítima (de um grupo sobre o qual o atacante não tem privilégios) foi excluído. Por exemplo:
root@60ae93fe131f:/var/lib/savane/trackers_attachments# ls
40226 40227 40230
Atualize para a versão 3.13 ou superior do Savane. O patch pode ser encontrado aqui.