Ir para o conteúdo

API2:2019 Broken User Authentication

Agentes Ameaça/Vetores Ataque Falha Segurança Impactos
Específico da API : Abuso 3 Prevalência 2 : Deteção 2 Técnico 3 : Específico Negócio
A autenticação em APIs é um mecanismo complexo e confuso. Engenheiros de software e segurança podem ter conceções erradas com relação ao âmbito da autenticação e como implementá-la corretamente. Por outro lado os mecanismos de autenticação são um alvo fácil para os atacantes uma vez que estão expostos publicamente. Estes dois pontos tornam o componente responsável pela autenticação potencialmente vulnerável a diferentes tipos de abuso. Podemos dividir os problemas de autenticação em duas partes: 1. Falta de mecanismos de proteção: os endpoints responsáveis pela autenticação devem ser tratados de forma diferente dos demais endpoints, implementando camadas de proteção adicionais 2. Falhas na implementação do mecanismo: este é utilizado/implementado sem considerar os vetores de ataque específicos ou baseado em casos de uso desadequados (e.g., um mecanismo de autenticação desenhado para clientes IoT pode não ser a melhor escolha para aplicações web). Os atacantes podem obter o controlo sobre as contas doutros utilizadores, aceder aos seus dados pessoais e realizar ações sensíveis em seu nome, como por exemplo transferências financeiras ou envio de mensagens pessoais.

A API é vulnerável?

Os endpoints e fluxos de autenticação são ativos que carecem de proteção. Mecanismos de recuperação de password devem ser tratados da mesma forma que os mecanismos de autenticação.

Uma API é vulnerável se: * Permite ataques de credential stuffing em que o atacante tem uma lista de nomes de utilizador e passwords válidos. * Permite ataques de força bruta a uma conta de utilizador específica, não implementando mecanismos de mitigação como captcha ou bloqueio da conta por excesso de tentativas de autenticação falhadas. * Permite a utilização de passwords fracas. * Envia informação de autenticação, tal como tokens e passwords, no URL. * Não valida a autenticidade dos tokens de autenticação. * Aceita tokens JWT sem que estes sejam assinados/usando algoritmos fracos ("alg":"none") ou não valida a sua data de expiração. * Utiliza passwords em texto, não encriptadas, ou resumos fracos. * Utiliza chaves de encriptação fracas.

Exemplos de Cenários de Ataque

Cenário #1

Ataques de Credential Stuffing utilizando listas de nomes de utilizador/ passwords conhecidas são bastante comuns. Se uma API não implementa proteções contra ameaças automatizadas ou Credential Stuffing, esta pode ser usada como oráculo para identificar se as credenciais são válidas.

Cenário #2

Um atacante inicia o fluxo de recuperação de password, enviando um pedido POST com o nome de utilizador para o endpoint /api/system/verification-codes. Um código de 6 dígitos é enviado para o telefone da vítima. Porque a API não implementa uma política de limitação do número de pedidos, com recurso a um script multi-thread que envia as combinações possíveis para o endpoint /api/system/verification-codes/{smsToken}, o atacante consegue em poucos minutos descobrir o código enviado na SMS.

Como Prevenir

  • Certifique-se de que conhece todos os fluxos de autenticação possíveis (e.g. móvel/web/deeplinks/etc.).
  • Pergunte aos engenheiros responsáveis quais os fluxos em falta/não identificados.
  • Leia sobre os mecanismos de autenticação em uso. Certifique-se que compreende quais e como são usados. OAuth não é um mecanismo de autenticação, assim como também não o são as API keys.
  • Não reinvente a roda em termos de autenticação, geração de tokens, armazenamento de passwords. Opte pela utilização de standards.
  • Endpoints para recuperação de password devem ser tratados como os endpoints de login no que diz respeito à proteção contra ataques de força bruta, limitação do número de pedidos e bloqueio de conta.
  • Utilize a OWASP Authentication Cheatsheet.
  • Sempre que possível implemente autenticação de múltiplos fatores.
  • Implemente mecanismos anti-força bruta para mitigar ataques do tipo credential stuffing, dicionário e força bruta nos endpoints de autenticação. Este mecanismo deve ter configurações mais restritivas do que para os demais endpoints da API.
  • Implemente mecanismos de bloqueio de conta / captcha para prevenir ataques de força bruta contra utilizadores específicos. Implemente verificação da qualidade/força das passwords.
  • As API keys não devem ser usadas para autenticação dos utilizadores, mas ao invés para autenticação dos clientes da API.

Referências

OWASP

Externas