Atribuição em massa
Quando o servidor copia todos os campos do pedido para o modelo, um campo extra (role) muda o que não devia.
Para salvar um formulário, é tentador copiar o corpo do pedido direto para o objeto guardado, de uma vez:
Object.assign(account, body); // copia TODA chave do body
O formulário mostra só displayName e plot, então o programador assume que o corpo só traz esses campos. Mas o corpo é controlado pelo cliente: nada impede mandar um campo a mais, como role. Se o objeto tem um campo role, o merge o sobrescreve, e o usuário vira admin por conta própria. Isso é atribuição em massa (mass assignment): ligar o pedido inteiro no modelo sem filtrar.
PATCH /api/profile {"displayName":"Ana","role":"admin"}
O conserto é uma lista de permissão dos campos que o usuário pode mudar, e nunca aceitar os campos sensíveis (role, is_admin, balance) por essas rotas. Frameworks dão nome a isso: "strong parameters" no Rails, fields/exclude em serializers do Django REST. Em Python, o erro gêmeo é user.__dict__.update(request.json).