Modelagem de ameaças baseada em funcionalidades
Um portal de estudantes ganha uma nova funcionalidade de upload. Os estudantes podem enviar tarefas, e os professores podem deixar feedback.
Isso parece pequeno o suficiente para construir. Um formulário, um campo de arquivo, um botão de envio, uma página para o professor.
Também é pequeno o suficiente para modelar as ameaças de forma adequada.
A modelagem de ameaças baseada em funcionalidades pega uma funcionalidade e a percorre do início ao fim. A cada etapa, você pergunta o que pode dar errado e o que o código precisa verificar.
Percorra a funcionalidade
Comece com a história normal:
- Um estudante faz login.
- O estudante envia um arquivo.
- O servidor o armazena.
- Um professor abre o envio.
- O professor deixa um feedback.
- O estudante lê o feedback.
Essa lista é o mapa. Você não precisa de um diagrama sofisticado para começar.
Agora marque os pontos em que um valor cruza um limite de confiança:
| Etapa | Valor que cruza o limite | O que perguntar |
|---|---|---|
| Upload | Nome, tipo e tamanho do arquivo | O servidor verificou o próprio arquivo? |
| Armazenamento | Caminho e metadados | Um estudante pode sobrescrever o arquivo de outro? |
| Visão do professor | Id do envio | Esse professor está de fato atribuído a esse estudante? |
| Feedback | Texto do feedback | Ele pode virar script quando exibido? |
| Visão do estudante | Id do feedback | Um estudante pode ler o feedback de outro estudante? |
Agora a funcionalidade tem forma. Você consegue ver onde as decisões de segurança se encaixam.
Comece pela história, depois adicione as ameaças
Se você começa pelos nomes das ameaças, o exercício parece abstrato.
Se você começa pela história da funcionalidade, cada ameaça tem onde se encaixar.
Depois marque os momentos em que seu aplicativo recebe algo que ele não escolheu. Esses são os pontos em que o servidor precisa fazer mais perguntas.
Transforme ameaças em verificações
Um modelo de funcionalidade não deveria terminar como uma lista de preocupações.
Para a funcionalidade de upload, uma preocupação poderia ser:
Um estudante poderia enviar algo inseguro.
Isso é verdade, mas é vago demais para servir de base. Transforme isso em uma verificação:
- Limite o tamanho do arquivo antes de armazená-lo.
- Permita apenas os tipos de arquivo esperados.
- Gere o nome do arquivo armazenado no servidor.
- Armazene os arquivos fora do diretório público do aplicativo.
- Verifique se o professor está atribuído ao estudante antes de exibir o arquivo.
Agora o modelo pode virar critérios de aceite.
Uma ameaça se torna útil quando o próximo desenvolvedor consegue transformá-la em código ou em um teste.
"Upload inseguro" é uma preocupação. "Limitar o tamanho do arquivo e gerar o nome do arquivo armazenado no servidor" é uma verificação que alguém consegue construir.
Experimente com o feedback do professor
Agora use o mesmo método por conta própria.
A funcionalidade diz: professores podem deixar feedback nos envios dos estudantes.
Responda às cinco perguntas baseadas em funcionalidade antes de continuar lendo.
- Quem envia o valor?
- Quem lê esse valor depois?
- Qual decisão importa?
- O que pode dar errado?
- O que o código deveria verificar?
Compare com suas respostas
| Pergunta | Uma resposta razoável |
|---|---|
| Quem envia o valor? | O professor envia o texto do feedback. |
| Quem lê esse valor depois? | O estudante, e possivelmente outro professor. |
| Qual decisão importa? | Só um professor atribuído pode deixar feedback. |
| O que pode dar errado? | O feedback pode conter script, ou cair no envio errado. |
| O que o código deveria verificar? | A atribuição no servidor, o tamanho do texto e a exibição segura na hora de renderizar. |
A pergunta 2 é a que carrega mais peso e recebe menos atenção. Identificar quem vai ler um valor depois é o que revela que ele será renderizado em uma página, e é isso que torna "pode conter script" uma pergunta que vale a pena fazer.
Responda só a pergunta 1 e você tem validação de entrada. Responda também a pergunta 2 e você tem segurança de saída também.
A correção exata vem mais adiante no manual. O que importa agora é o hábito: percorra a funcionalidade, marque o limite, escreva a verificação. É esse o método inteiro.
O front-end pode orientar, mas quem decide é o servidor
A página pode esconder os controles de feedback dos professores que não estão atribuídos.
Mesmo assim, a rota precisa verificar a atribuição, porque qualquer pessoa pode chamar a rota diretamente.
Quem pode escrever? A qual envio ele pertence? Quem pode ler depois? Pensar em segurança é perceber essas decisões antes que o código as responda silenciosamente por você.
Para onde isso vai a seguir
A modelagem de ameaças baseada em funcionalidades é a versão do dia a dia do STRIDE. Você pode aplicá-la dentro do planejamento, escrever as verificações no ticket e testá-las antes de a funcionalidade ir para produção.
A seguir, OWASP e bugs reais muda a linha do tempo. Em vez de perguntar o que pode dar errado antes do lançamento, ele dá nomes às coisas que já deram errado em aplicativos reais.

