
CVE-2024-29296 - Énumération d'utilisateurs sur Portainer CE - 2.19.4
Une vulnérabilité d'énumération d'utilisateurs a été découverte dans Portainer CE 2.19.4. Ce problème survient lors du processus d'authentification des utilisateurs, où une différence dans le temps de réponse pourrait permettre à un attaquant distant non authentifié de déterminer si un nom d'utilisateur est valide ou non.
Cette vulnérabilité a été corrigée avec le problème #11736 de Portainer, qui a été livré avec les versions 2.19.5 et 2.20.2 de Portainer CE.
J'ai découvert cette vulnérabilité en tentant une attaque par pulvérisation de mots de passe sur la page de connexion d'une instance Portainer. J'ai soumis plusieurs requêtes avec des noms d'utilisateurs et mots de passe variés au formulaire de connexion de l'application Portainer.
Que l'utilisateur existe ou non, si la combinaison nom d'utilisateur + mot de passe est incorrecte, le backend de l'application Portainer répond avec le même code de statut HTTP. Cela est conforme à la meilleure approche pour empêcher – ou entraver – les tentatives d'énumération des utilisateurs valides.
Cependant, en observant les résultats de ma pulvérisation de mots de passe, j'ai remarqué que les tentatives de connexion pour certains noms d'utilisateurs prenaient systématiquement un certain temps moyen, tandis que les tentatives pour d'autres noms d'utilisateurs prenaient systématiquement un temps moyen sensiblement plus long.
Le système doit vérifier la validité du mot de passe pour les utilisateurs existants, mais n'a pas à le faire si le nom d'utilisateur est invalide en premier lieu. Par conséquent, j'ai supposé que le changement notable du temps moyen des tentatives de connexion était lié à cela. J'ai ensuite installé une copie locale de Portainer CE 2.19.4 et tenté de reproduire le comportement, avec le même résultat.
Voici le format de requête que j'ai envoyé. Les champs nom d'utilisateur et mot de passe ont été sélectionnés pour insérer les charges utiles.

Voici les utilisateurs que j'ai insérés dans le champ nom d'utilisateur. Pour ce test, seuls les utilisateurs "admin" et "felipe" étaient valides. Tous les autres noms d'utilisateurs de la liste ne correspondaient pas à des utilisateurs existants.

Et voici les mots de passe que j'ai insérés dans le champ mot de passe.

Une requête a été envoyée au serveur pour chaque paire unique nom d'utilisateur-mot de passe. Les résultats sont présentés ci-dessous.

Lorsqu'un nom d'utilisateur correspond à un utilisateur existant, les tentatives de connexion prennent systématiquement et sensiblement plus de temps par rapport aux tentatives pour des utilisateurs inexistants.
Cela signifie que le système de Portainer dans cette version est susceptible à l'énumération des utilisateurs valides – en observant le temps que prend le backend pour répondre aux tentatives de connexion, un attaquant est capable d'énumérer les utilisateurs de l'application.