Triagem de bugs
Uma mensagem chega no chat da equipe:
Acho que os clientes conseguem ver os pedidos uns dos outros.
Isso pode ser urgente. Pode ser um mal-entendido. Ninguém sabe ainda.
Triagem de bugs é o trabalho que acontece entre "alguém encontrou algo" e "a equipe sabe o que fazer a seguir".
Para bugs de segurança, a triagem responde a quatro perguntas:
- Conseguimos reproduzir?
- Que dano isso causa?
- Quão difícil é explorar?
- O que acontece depois?
Reproduza o bug
Uma descoberta de segurança é só uma alegação até que alguém consiga fazer acontecer de propósito.
Comece pela rota vulnerável:
app.get('/orders/:id', async (req, res) => {
const order = await db.orders.findById(req.params.id)
res.json(order)
})Agora escreva a reprodução:
# Autenticado como cliente 4102
curl -i https://app.example.com/orders/88213 \
-H "Cookie: sid=<sessão do cliente 4102>"
# Esperado: 403 ou 404
# Real: 200, com o pedido de outro clienteUma boa reprodução inclui a conta, a requisição, o resultado esperado e o resultado real.
"Muda o id e quebra" é uma anotação. O bloco acima é algo que outro desenvolvedor consegue executar.
Só teste onde você tem permissão
Execute reproduções contra sistemas que você possui, mantém ou tem permissão por escrito para testar.
A mesma requisição contra o app de outra pessoa não é triagem.
Escreva a conta, a requisição, o que deveria ter acontecido e o que realmente aconteceu. Se outro desenvolvedor conseguir seguir os passos sem precisar perguntar nada, você tem um relato útil.
Explique o impacto
Impacto é o que a pessoa que explora o bug acaba conseguindo obter ou fazer.
Para o bug do pedido, o impacto poderia ser:
Qualquer cliente autenticado consegue ler o endereço de entrega e o histórico de pedidos de outro cliente.
Essa frase é melhor do que:
IDOR em
/orders/:id.
IDOR é o nome técnico de segurança: insecure direct object reference (referência direta insegura a objeto). Significa que uma requisição inclui o id de um objeto, e o servidor não verifica se quem fez a chamada tem permissão para usar aquele objeto.
O nome ajuda engenheiros a classificar o bug. O impacto ajuda todo mundo a entender por que ele importa.
Pergunte:
- Que dado ou ação fica exposto?
- De quem é esse dado ou ação?
- Quantas pessoas podem ser afetadas?
- O que isso pode viabilizar em seguida?
A severidade começa pelo dano causado, não pela esperteza do bug.
Os nomes técnicos de segurança são úteis, mas não bastam sozinhos. "Qualquer cliente consegue ler o endereço de outro cliente" comunica o que importa para mais gente do que "IDOR".
Avalie a explorabilidade
O impacto mostra o que o bug pode causar. A explorabilidade mostra o que é preciso para causá-lo.
Para o bug do pedido, o atacante precisa de:
- uma conta normal de cliente
- um id de pedido válido ou adivinhável
- uma requisição
Isso é altamente alcançável. Um bug que exige uma conta de administrador, acesso físico, timing perfeito e um clique da vítima é diferente.
Anote as pré-condições. Elas mantêm a conversa sobre severidade concreta.
| Pré-condições | O que significa |
|---|---|
| Anônimo | Qualquer pessoa na internet pode tentar. |
| Autenticado | É preciso uma conta normal. |
| Papel privilegiado | É preciso um papel de equipe ou administrador. |
| Ação da vítima | Outra pessoa precisa clicar ou enviar algo. |
| Id adivinhável | O alvo pode ser encontrado tentando valores. |
| Janela de tempo | O bug só funciona durante um momento estreito. |
Anônimo é mais fácil de alcançar do que autenticado. Autenticado é mais fácil de alcançar do que administrador. Uma requisição é mais fácil de alcançar do que uma cadeia que depende de timing e de outra pessoa clicando em algo.
Decida o que acontece a seguir
Agora combine as peças:
| Campo | Exemplo |
|---|---|
| Reprodução | O cliente 4102 solicita o pedido 88213 e recebe o pedido de outro cliente. |
| Impacto | Qualquer cliente autenticado consegue ler o endereço de entrega e o histórico de pedidos de outro cliente. |
| Explorabilidade | Conta normal, id adivinhável, uma requisição. |
| Categoria OWASP | A01 Controle de Acesso Quebrado. |
| Próxima ação | Corrigir antes do lançamento, adicionar teste de propriedade, verificar rotas semelhantes. |
A categoria OWASP ajuda a classificar o bug. A próxima ação transforma o relato em trabalho.
Para esse bug, a correção é verificar a propriedade antes de retornar o pedido:
app.get('/orders/:id', async (req, res) => {
const order = await db.orders.findById(req.params.id)
if (!order || order.userId !== req.user.id) {
return res.status(404).json({ error: 'Order not found' })
}
res.json(order)
})O teste correspondente deve provar o caminho ruim, não só o caminho feliz.
Uma boa anotação de triagem gera trabalho de acompanhamento
Corrija esse endpoint.
Adicione um teste de regressão.
Procure o mesmo padrão em rotas próximas.
Para esse bug do pedido, a decisão deve ser direta: corrigir antes do lançamento, adicionar um teste e verificar rotas próximas em busca da mesma falta de verificação de propriedade.
Experimente
Um relato de bug chega com uma única linha: "O link de redefinição de senha continua funcionando depois que você já o usou."
Faça a triagem. Preencha os cinco campos: reprodução, impacto, explorabilidade, categoria OWASP, próxima ação.
Compare suas respostas
| Campo | Uma resposta razoável |
|---|---|
| Reprodução | Solicite uma redefinição, siga o link, defina uma senha, depois abra o mesmo link de novo. Ele ainda é aceito e permite definir outra senha. |
| Impacto | Qualquer pessoa que veja esse link, uma única vez, pode sequestrar a conta mais tarde. Links de redefinição ficam em caixas de entrada, histórico do navegador e e-mails encaminhados por muito tempo. |
| Explorabilidade | Não é preciso conta nem adivinhação. É preciso ter acesso ao link, então a dificuldade depende inteiramente de para onde esse link viajou. |
| Categoria OWASP | A07 Falhas de Autenticação. O app não consegue estabelecer com confiabilidade quem é a pessoa quando uma credencial já usada continua funcionando. |
| Próxima ação | Invalidar o token no primeiro uso e adicionar uma expiração, se ainda não houver uma. Depois, verificar se links de verificação de e-mail e de convite têm a mesma falha. |
Duas coisas valem a pena destacar.
O impacto não é "um token não é invalidado", é "alguém pode sequestrar a conta". Um campo que só repete o bug não acrescenta nada; o campo existe para dizer quem sai machucado.
E a próxima ação termina olhando para os lados. Tokens de uso único costumam ser gerados por código compartilhado, então um bug em um fluxo muito frequentemente está presente nos outros também. Uma triagem que corrige exatamente uma rota e para por aí fez só metade do trabalho.
Para onde isso vai a seguir
A triagem de bugs encerra a primeira seção. Agora você consegue perguntar o que pode dar errado, nomear bugs comuns em produção e transformar um achado em trabalho.
A seguir, o manual entra em segurança de entrada e de dados, começando por nunca confie na entrada do usuário.

