
CVE-2024-29296 - Enumeração de usuários no Portainer CE - 2.19.4
Uma vulnerabilidade de enumeração de usuários foi encontrada no Portainer CE 2.19.4. Esse problema ocorre durante o processo de autenticação do usuário, onde uma diferença no tempo de resposta poderia permitir que um usuário remoto não autenticado determine se um nome de usuário é válido ou não.
Esta vulnerabilidade foi corrigida com o problema #11736 do Portainer, que foi disponibilizado nas versões 2.19.5 e 2.20.2 do Portainer CE.
Descobri esta vulnerabilidade enquanto tentava fazer um ataque de password spray na página de login de uma instância do Portainer. Enviei múltiplas requisições com nomes de usuário e senhas variados para o formulário de login da aplicação Portainer.
Independentemente da existência do usuário, se a combinação de nome de usuário + senha não estiver correta, o backend da aplicação Portainer responde com o mesmo código de status HTTP. Isso está de acordo com a melhor abordagem para prevenir - ou dificultar - tentativas de enumerar usuários válidos.
No entanto, observando os resultados do meu password spray, notei que as tentativas de login para alguns nomes de usuário levam consistentemente um certo tempo médio, enquanto as tentativas de login para outros nomes de usuário levam consistentemente um tempo médio visivelmente maior.
O sistema precisa verificar a validade da senha para usuários existentes, mas não precisa se o nome de usuário for inválido desde o início. Portanto, assumi que a mudança perceptível no tempo médio de tentativa de login tinha relação com isso. Então, procedi instalando uma cópia local do Portainer CE 2.19.4 e tentei replicar o comportamento, com o mesmo resultado.
Este é o formato de requisição que enviei. Os campos de nome de usuário e senha foram selecionados para inserir os payloads.

Estes foram os usuários que inseri no campo de nome de usuário. Para este teste, apenas os usuários "admin" e "felipe" eram válidos. Todos os outros nomes de usuário na lista não correspondiam a usuários existentes.

E estas foram as senhas que inseri no campo de senha.

Uma requisição foi enviada ao servidor para cada par único de nome de usuário e senha. Os resultados são mostrados abaixo.

Quando um nome de usuário corresponde a um usuário existente, as tentativas de login consistentemente e visivelmente levam uma quantidade maior de tempo em comparação com tentativas de login para usuários inexistentes.
Isso significa que o sistema do Portainer nessa versão é suscetível à enumeração de usuários válidos - observando o tempo que o backend leva para responder às tentativas de login, um invasor consegue enumerar os usuários da aplicação.