Solução
Um dos motivos do porque é preferível integrar com uma plataforma de pagamentos, ao invés de fazer seu próprio sistema de pagamentos, é justamente pela segurança. Só que essa integração deve ser feita com todo o cuidado do mundo, pois é uma coisa sensível e que qualquer erro pode acabar causando algum prejuízo.
Note que nesse exercício existe um fluxo no pagamento do usuário:
- O usuário inicia uma nova transação na aplicação.
- O usuário é redirecionado para a plataforma de pagamentos.
- A plataforma dispara um webhook para informar que o pagamento foi confirmado.
- A aplicação recebe a requisição e atualiza o estado da transação para “pago”.
No ponto 4, o que garante que foi mesmo a plataforma de pagamentos que disparou essa requisição? Não foi previsto no design qualquer tipo de proteção para garantir isso.
Por isso, um atacante poderia meramente disparar
manualmente uma requisição para o endpoint
POST /transactions/{id}/update-fictional-pay-status
e alterar uma transação para paga mesmo não tendo pagado por
ela.
Engana-se quem acha que meramente usar uma URL “grande e aleatória” nesse endpoint poderia mostrar alguma segurança. De fato um atacante não conseguiria adivinhar a URL usando scans ou coisa semelhante.
Mas na segurança é importante pensar também na ameaça interna: Quem garante que um funcionário da empresa não vaze a informação da existência desse endpoint (propositalmente ou não)?
Essa tentativa de “proteger” algo com base na falta de informações sobre como esse algo funciona, é conhecido como “segurança por obscuridade”. Isso é uma péssima ideia. Sempre assuma que o atacante tem, ou pode ter, informações internas de como o sistema funciona. E trabalhe a partir desta hipótese.
Para evitar essa vulnerabilidade, seria importante que fosse validado que é realmente a plataforma de pagamentos que está disparando essa requisição. Por exemplo por meio de tokens de segurança e por validar o IP de origem da requisição.
Preferencialmente, seria interessante usar algum tipo de criptografia assimétrica na comunicação com a plataforma de pagamentos. Mas depende da plataforma que tenha esse recurso implementado.