API2:2023 Broken Authentication
| Agentes Ameaça/Vetores Ataque | Falha Segurança | Impactos | 
|---|---|---|
| Específico da API : Abuso Fácil | Prevalência Comum : Deteção Fácil | Técnico Grave : Específico Negócio | 
| O mecanismo de autenticação é um alvo fácil para os atacantes, uma vez que está exposto a todos. Embora possam ser necessárias competências técnicas mais avançadas para explorar alguns problemas de autenticação, geralmente existem ferramentas de exploração disponíveis. | As conceções erradas dos engenheiros de software e de segurança sobre os limites da autenticação e a complexidade inerente da implementação tornam os problemas de autenticação prevalentes. Metodologias para detetar broken authentication estão disponíveis e são fáceis de criar. | Os atacantes podem obter controlo total das contas de outros utilizadores no sistema, ler os seus dados pessoais e realizar ações sensíveis em seu nome. Os sistemas têm pouca probabilidade de conseguir distinguir as ações dos atacantes das ações legítimas dos utilizadores. | 
A API é vulnerável?
Os endpoints e fluxos de autenticação são ativos que carecem de proteção. Além disso, 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, onde o atacante utiliza força bruta com uma lista de nomes de utilizador e palavras-passe 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.
 - Permite que os utilizadores alterem o seu endereço de email, password atual ou realizem outras operações sensíveis sem pedir a confirmação da password.
 - Não valida a autenticidade dos tokens de autenticação.
 - Aceita tokens JWT sem que estes sejam assinados/usando algoritmos fracos
  
("alg":"none") - Não valida a data de expiração dos tokens JWT.
 - Utiliza passwords em texto, não encriptadas, ou resumos fracos.
 - Utiliza chaves de encriptação fracas.
 
Além disso, um microsserviço é vulnerável se:
- Outros microsserviços podem aceder a ele sem autenticação
 - Utiliza tokens fracos ou previsíveis para impor autenticação
 
Exemplos de Cenários de Ataque
Cenário #1
Para realizar a autenticação do utilizador, o cliente tem de enviar um pedido de API como o exemplo abaixo, com as credenciais do utilizador:
POST /graphql
{
  "query":"mutation {
    login (username:\"<username>\",password:\"<password>\") {
      token
    }
   }"
}
Se as credenciais forem válidas, é devolvido um token de autenticação que deve ser fornecido em pedidos subsequentes para identificar o utilizador. A quantidade de tentativas de login está sujeita a uma limitação temporal restritiva: apenas três pedidos são permitidos por minuto.
Para efetuar login por força bruta com a conta de uma vítima, os atores maliciosos aproveitam o agrupamento de consultas GraphQL para contornar a limitação temporal restritiva de pedidos, acelerando o ataque:
POST /graphql
[
  {"query":"mutation{login(username:\"victim\",password:\"password\"){token}}"},
  {"query":"mutation{login(username:\"victim\",password:\"123456\"){token}}"},
  {"query":"mutation{login(username:\"victim\",password:\"qwerty\"){token}}"},
  ...
  {"query":"mutation{login(username:\"victim\",password:\"123\"){token}}"},
]
Cenário #2
Para atualizar o endereço de email associado à conta de um utilizador, os clientes devem enviar um pedido API como o exemplo abaixo:
PUT /account
Authorization: Bearer <token>
{ "email": "<new_email_address>" }
Devido à API não exigir que os utilizadores confirmem a sua identidade fornecendo a sua password atual, atores maliciosos que consigam colocar-se numa posição de roubar o token de autenticação podem conseguir assumir a conta da vítima ao iniciar o processo de redefinição de senha após atualizar o endereço de email da conta da vítima.
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.
 - Exija nova autenticação para operações sensíveis (e.g. alterar o endereço de email do proprietário da conta/número de telefone para autenticação de dois fatores).
 - 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. Apenas devem ser usadas para autenticação dos clientes da API.