Acesso decidido por um parâmetro
Quando um parâmetro (um filtro, um nome de arquivo) escolhe o recurso, trocá-lo alcança o dado de outra pessoa.
O IDOR clássico troca um id numérico no endereço (?id=1003 vira ?id=1000). Mas a mesma falha acontece com qualquer parâmetro que escolhe o recurso, mesmo quando ele não parece um id: um filtro, um nome de time, um nome de arquivo em download.
GET /api/reports/download?file=report-team-pampa-2026q1.csv
Se o servidor confere só que você entrou, e então serve o arquivo pelo nome, trocar pampa por serra entrega o relatório do outro time. É escalonamento horizontal: você alcança o recurso de outro usuário do mesmo nível, sem virar admin. O parâmetro ser um texto (e não um número) não muda nada: ele ainda é uma referência direta a um objeto que não é seu.
O conserto é o mesmo do IDOR: amarre o recurso ao dono e cheque, a cada pedido, se o usuário tem direito àquele objeto (if report.team !== session.team: deny). Esconder, embaralhar ou usar um sufixo esquisito não resolve. Em Python, send_file(request.args["file"]) sem checar o dono é o mesmo erro (e abre path traversal se o nome não for validado).