
PoC originale per CVE-2023-32784
La vulnerabilità è stata assegnata CVE-2023-32784 e risolta in KeePass 2.54. Grazie ancora a Dominik Reichl per la sua rapida risposta e la soluzione creativa!
Chiarimento: la password deve essere digitata su una tastiera, non copiata dagli appunti (vedi le sezioni Come funziona).
Prima di tutto, aggiorna a KeePass 2.54 o superiore.
In secondo luogo, se utilizzi KeePass da molto tempo, la tua password principale (e potenzialmente altre password) potrebbe trovarsi nel file di paging/swapfile, nel file di ibernazione e nei dump di arresto anomalo. A seconda del tuo livello di paranoia, puoi considerare questi passaggi per risolvere il problema:
C:\Windows\memory.dmp, ma potrebbero essercene altri)/w su Windows)Oppure sovrascrivi il tuo disco rigido ed esegui una nuova installazione del sistema operativo.
Elenco incompleto di prodotti che non sono interessati (per favore crea una pull request o un issue per aggiungerne altri). La regola pratica è che se non è l'app originale KeePass 2.X scritta in .NET, probabilmente non è affetta.
KeePass Master Password Dumper è un semplice strumento proof-of-concept utilizzato per estrarre la password principale dalla memoria di KeePass. A parte il primo carattere della password, è in grado di recuperare la password in chiaro. Non è richiesta l'esecuzione di codice sul sistema di destinazione, solo un dump della memoria. Non importa da dove provenga la memoria: può essere il dump del processo, il file di swap (pagefile.sys), il file di ibernazione (hiberfil.sys), vari dump di arresto anomalo o il dump della RAM dell'intero sistema. Non importa se l'area di lavoro è bloccata o meno. È anche possibile estrarre la password dalla RAM dopo che KeePass non è più in esecuzione, anche se la probabilità di successo diminuisce con il tempo trascorso.
Testato con KeePass 2.53.1 su Windows (inglese) e KeePass 2.47 su Debian (pacchetto keepass2). Dovrebbe funzionare anche per la versione macOS. Sfortunatamente, l'abilitazione dell'opzione Enter master key on secure desktop non aiuta a prevenire l'attacco. Il PoC potrebbe avere problemi con database creati da versioni precedenti di KeePass, ma non sono riuscito a riprodurlo (vedi issue #4).
La scoperta è stata confermata da Dominik Reichl, autore di KeePass, qui. Apprezzo la rapida risposta di Dominik. Si spera che venga risolto presto!
git clone https://github.com/vdohney/keepass-password-dumper o scaricalo da GitHubcd keepass-password-dumperdotnet run PATH_TO_DUMPIl modo più semplice per testarlo su Windows è creare un dump del processo nel task manager facendo clic con il pulsante destro del mouse sul processo KeePass e selezionando "Crea file di dump".

dotnet run PATH_TO_DUMP PATH_TO_PWDLIST per generare un elenco di tutte le possibili password a partire dal secondo carattere.Dipende dal tuo modello di minaccia. Se il tuo computer è già infetto da malware in esecuzione in background con i privilegi del tuo utente, questa scoperta non peggiora molto la tua situazione. Tuttavia, potrebbe essere più facile per il malware essere furtivo ed eludere l'antivirus, poiché a differenza di KeeTheft o KeeFarce, non è necessaria alcuna iniezione di processo o altro tipo di esecuzione di codice.
Se hai un sospetto ragionevole che qualcuno possa ottenere l'accesso al tuo computer e condurre un'analisi forense, questo potrebbe essere negativo. Lo scenario peggiore è che la password principale venga recuperata, nonostante KeePass sia bloccato o non in esecuzione.
Se usi la crittografia completa del disco con una password complessa e il tuo sistema è pulito, non dovresti avere problemi. Nessuno può rubare le tue password da remoto via Internet solo con questa scoperta.
KeePass 2.X utilizza una casella di testo sviluppata appositamente per l'inserimento della password, SecureTextBoxEx. Questa casella di testo non viene utilizzata solo per l'inserimento della password principale, ma anche in altri punti di KeePass, come le caselle di modifica delle password (quindi l'attacco può essere utilizzato anche per recuperarne i contenuti).
Il difetto sfruttato qui è che per ogni carattere digitato, viene creata una stringa residua in memoria. A causa del modo in cui funziona .NET, è quasi impossibile eliminarla una volta creata. Ad esempio, quando viene digitato "Password", risulteranno queste stringhe residue: •a, ••s, •••s, ••••w, •••••o, ••••••r, •••••••d. L'applicazione PoC cerca nel dump questi schemi e offre un probabile carattere della password per ogni posizione nella password.
L'affidabilità di questo attacco può essere influenzata dal modo in cui la password è stata digitata e da quante password sono state digitate per sessione. Tuttavia, ho scoperto che anche se ci sono più password per sessione o errori di battitura, il modo in cui .NET CLR alloca queste stringhe significa che probabilmente sono ordinate in memoria. Quindi, se sono state digitate tre password diverse, è probabile che si ottengano tre candidati per ogni posizione dei caratteri in quest'ordine, il che rende possibile recuperare tutte e tre le password.
È un PoC rapido, quindi probabilmente non molto affidabile e robusto. Per favore crea una pull request se trovi un problema e lo risolvi.
I caratteri consentiti per la password sono attualmente hardcoded in questo modo: ^[\x20-\x7E]+$ (tutti i caratteri ASCII stampabili e lo spazio).
Grazie a adridlug per aver aggiunto la possibilità di generare automaticamente l'elenco delle password, e a ynuwenhof per il refactoring del codice.
Non ne ho ancora verificato nessuno.