Executando verificação de segurança...
25

Postmortem: endpoint "/api/v1/recovery" retornava token sensível que conseguia burlar o fluxo de alteração de senha

É com muito orgulho que venho aqui publicar o segundo Postmortem do TabNews (caso tenha curiosidade este foi o primeiro), onde o orgulho obviamente não está na falha em sí, mas está em conhecer cada vez mais pessoas interessadas em proteger esse pedaço de internet que estamos construindo juntos e também por conta da transparência que temos com todos 🤝

Então desta vez eu gostaria de dar destaque para o Fabrício, que na descrição do seu perfil no GitHub diz o seguinte:

Olá todos, chamo-me Fabrício, tenho 16 anos e, no momento, curso o 2 ano do ensino médio. Sou um novato na programação, mas busco me aprimorar a cada dia.

E nesta segunda-feira o Fabrício descobriu uma falha de segurança no endpoint responsável pela Recuperação de Senha, onde na verdade você não recupera a sua senha atual, você apenas consegue definir uma nova. Então vou descrever abaixo o que aconteceu, começando pelo resumo, depois a sequência dos fatos e por fim entender se a falha foi explorada.

Resumo

O endpoint /api/v1/recovery, ao ser utilizado para iniciar o fluxo de uma recuperação de senha, retornava também o próprio token que deveria ser utilizado para conseguir definir uma nova senha, sendo que o comportamento esperado era este token ser apenas visível dentro do email que era enviado ao usuário.

Este token poderia ser gerado ao utilizar o username da conta (que é um dado público), onde apesar disto, um login com sucesso requer um dado privado, que é o email da pessoa.

Sequência dos fatos

  1. Às 8:29 AM do dia 28 de Novembro de 2022, Fabrício nos reportou de forma privada pelo email [email protected] os passos para reproduzir esta falha de segurança.
  2. Às 9:00 AM do mesmo dia retornamos o email informado que iniciamos uma investigação do nosso lado para confirmar a falha.
  3. Em paralelo a isto, o acesso ao endpoint /api/v1/recovery foi barrado globalmente na Cloudflare como medida emergencial.
  4. Às 9:19 AM aplicamos a correção no Ambiente de Produção e agora o token não é mais retornado.
  5. Às 11:17 AM Fabrício confirmou que a falha não poderia mais ser explorada.

Por fim, nada no sistema de autenticação ou autorização foi impactado e em paralelo a isto, iremos implementarmos autenticação de 2 fatores. O Tiago Dinis (coffee-is-power) já fez uma proposta neste PR.

A falha foi explorada?

Uma característica do fluxo de Recuperação de Senha me faz acreditar que há uma baixa probabilidade desta falha ter sido explorada, que é o fato de que, ao concluir com sucesso o fluxo com a alteração da senha, todas as sessões do usuário são invalidadas, deslogando imediatamente qualquer cliente que possa estar conectado ao TabNews. Então como ponto de referência, a conta filipedeschamps, que é a conta com todas as credenciais administrativas, em nenhum momento teve suas sessões invalidadas por este tipo de evento.

Mas isto não é a prova que a falha não possa ter sido explorada e você pode ter sido afetado. Caso você acredite que este seja o caso, você deve resetar sua senha e invalidar todas as sessões ativas utilizando este link: https://www.tabnews.com.br/cadastro/recuperar

Agradecimento extra

Gostaria de agradecer especialmente o FelipeBarso que se uniu nesta batalha num ponto que ainda gostaríamos de explorar um pouco mais antes de tornarmos a informação pública, até por envolver uma solução terceirizada e que pode afetar outros projetos da comunidade open source 🤝

Conclusão

Uma coisa que sinto falta nas empresas brasileiras é justamente a criação de documentos como este, sendo transparentes (na medida do possível) e explicando de forma pública o que aconteceu e o que foi feito, mas entendo que não há incentivo ou benefício algum na percepção da empresa... e concordo, pois isto muitas vezes vai mais mais assustar todo mundo e atrapalhar do que ajudar. De qualquer forma, o TabNews é diferente, acessado por pessoas diferentes, e não somente vamos nos tornar o pedaço de internet com a maior quantidade de conteúdos em português com valor concreto para quem trabalha com programação ou tecnologia, como também teremos o repositório open source com a maior carga e fluxo de conhecimento sobre programação da "vida real", expondo o lado bom e ruim, tudo de forma respeitosamente transparente com quem participa.

E seguindo a Lei de Linus: "Dado olhos suficientes, todos os bugs são superficiais" e este evento foi mais uma prova disto. Então peço que você que está lendo isto continue a proteger o TabNews, da forma que for possível para você. E se você trabalha com segurança da informação, tanto em red team quanto blue team, sua ajuda para tentar cavucar a API do TabNews e o código fonte será extremamente valioso para toda a comunidade e teremos um orgulho eterno de reportar publicamente os seus achados 🤝

Um grande abraço a todos!

Carregando publicação patrocinada...
2

Muito bom saber o carinho que o pessoal está dando para o projeto, fico muito feliz em saber que daqui um tempo, essa aba do meu navegador, provavelmente, se tornará o meu google. Parabéns ao Fabrício, que mesmo sendo novo, conseguiu notar esse retorno na requisição.

2

É muito legal ver como a comunidade tem encontrado os problemas e reportado de acordo. Fiquei impressionado pela idade do Fabrício.

Tão legal quanto isso é que estamos atingindo outras bibliotecas. Já vi issues e PRs feitos por pessoas do TabNews em bibliotecas que são utilizadas no projeto 😁

1

Bom, em idade, eu posso me gabar por ter 14 anos. Aparentemente muito novo, porém desde meus 10 anos estou programando. Convem saber um pouco mais sobre como consegui aprender tudo oq eu sei tão cedo.

Começo de tudo

  • Bom, no começo eu aprendi o Node.js para criação de bots no Discord, porém, acabei gostando tanto da programação em JavaScript que eu me dediquei a aprender tudo que há na linguagem da web e como fazer e usar vários módulos / packages da npm. Logo após, fui atrás de aprender novas linguagens, atualmente já sei, .py, .cs (não o gosto mais sei), .js, .sh, .java, .rb, .lua, .ts como linguagens principais, tirando o php, html e css. Após eu aprender fui atrás de me profissionalizar, atualmente estou procurando pessoas para compras e etc. ( Não sinto vontade alguma de trabalhar em algo fixo. )

Projetos

Atualmente, como meu maior projeto temos a FIreray que ainda será atualizada mais várias vezes, dei uma pausa para o desenvolvimento da Fsdb.js, que é o projeto de uma database muito mais simples que outras porém completa. Inspirada na Firebase e também no estilo de login simples da Mongoose. Além da criação de bancos ser hiper simples!


Obrigado por ler isso, espero ter sido útil ou ter inspirado alguém a se dedicar mais em alguma coisa, até mais.

1

Parabens ao Fabricio e ao TabNews ! Todos evoluimos com esta situação. Transparência e uma situação técnica real podendo ser analisada e estudada por todos ! Aplausos !!!

1
1
1

Eu descobri essa falha e quando fui mais a fundo para explorar me embananei todo e deixei pra outro dia quando volto pra explorar ja não retorna mais o Token, Parabéns ao Fabrício merece ficar estampado no mural do TabNews.

1

Em relação à autenticação de 2 fatores, acredito que seja interessante começar a pensar sobre https://passkeys.dev/. Que está sendo implementado pela W3C e FIDO Alliance, com o intuíto de se tornar o futuro do passwordless (mas também pode ser utilizado somente como 2FA).
Já há suporte inicial para produtos da Google, Apple e Microsoft. E também há algumas libraries indicadas para Rust, TypeScript, .NET, Go, Java, Python e Ruby.

1
1

Queria que a internet fosse mais transparente e amigável como esse post foi. Parabéns ao Fabrício, já com 16 anos demonstrando que tem um belo futuro nessa área!

1

Olha, pra ser sincero, eu com 16 anos estava gastando meu tempo em casas de Fliperama tentando fechar Robocop com 1 ficha. Parabéns a essa molecada de agora, que tem mostrado que o mundo tem salvação, e que temos aí uma geração extremamente competente e capaz. Bem, agora, deixa eu voltar aqui pro chefão de Returnal... :-)