
CVE-2024-29296 - Enumerazione degli utenti su Portainer CE - 2.19.4
È stata trovata una vulnerabilità di enumerazione degli utenti in Portainer CE 2.19.4. Il problema si verifica durante il processo di autenticazione dell'utente, dove una differenza nei tempi di risposta potrebbe consentire a un utente remoto non autenticato di determinare se un nome utente è valido o meno.
Questa vulnerabilità è stata corretta con il problema #11736 di Portainer, distribuito con le versioni Portainer CE 2.19.5 e 2.20.2.
Ho scoperto questa vulnerabilità mentre tentavo di eseguire un attacco di password spray sulla pagina di login di un'istanza di Portainer. Ho inviato più richieste con nomi utente e password variabili al modulo di login dell'applicazione Portainer.
Indipendentemente dall'esistenza dell'utente, se la combinazione nome utente + password non è corretta, il backend dell'applicazione Portainer risponde con lo stesso codice di stato HTTP. Ciò è conforme al miglior approccio per prevenire - o ostacolare - i tentativi di enumerare utenti validi.
Tuttavia, osservando i risultati del mio password spray, ho notato che i tentativi di login per alcuni nomi utente richiedono costantemente un certo tempo medio, mentre i tentativi di login per altri nomi utente richiedono costantemente un tempo medio sensibilmente maggiore.
Il sistema deve verificare la validità della password per gli utenti esistenti, ma non ha bisogno di farlo se il nome utente non è valido. Pertanto, ho supposto che il notevole cambiamento nel tempo medio dei tentativi di login fosse correlato a questo. Ho quindi proceduto a installare una copia locale di Portainer CE 2.19.4 e ho provato a replicare il comportamento, ottenendo lo stesso risultato.
Questo è il formato della richiesta che ho inviato. I campi nome utente e password sono stati selezionati per inserire i payload.

Questi erano gli utenti che ho inserito nel campo nome utente. Per questo test, solo gli utenti "admin" e "felipe" erano validi. Tutti gli altri nomi utente nell'elenco non corrispondevano a utenti esistenti.

E queste erano le password che ho inserito nel campo password.

È stata inviata una richiesta al server per ogni coppia unica nome utente-password. I risultati sono mostrati di seguito.

Quando un nome utente corrisponde a un utente esistente, i tentativi di login richiedono costantemente e sensibilmente più tempo rispetto ai tentativi di login per utenti inesistenti.
Ciò significa che il sistema di Portainer in quella versione è suscettibile all'enumerazione degli utenti validi - osservando il tempo che il backend impiega per rispondere ai tentativi di login, un attaccante è in grado di enumerare gli utenti dell'applicazione.