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:

  1. O usuário inicia uma nova transação na aplicação.
  2. O usuário é redirecionado para a plataforma de pagamentos.
  3. A plataforma dispara um webhook para informar que o pagamento foi confirmado.
  4. 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.