keepass_dumper.py
Port Python di vdohney/keepass-password-dumper
(CVE-2023-32784) — tutto il merito dell'implementazione originale in C# e della
tecnica sottostante va a vdohney.
Lo script analizza un dump di memoria di un processo alla ricerca delle stringhe di rendering residue che
il SecureTextBoxEx di KeePass 2.x lascia dietro di sé mentre l'utente digita la
password principale, e recupera ogni carattere di quella password tranne il
primo. Opzionalmente, esegue poi un brute-force sul primo carattere sconosciuto
contro un file KDBX utilizzando keepassxc-cli.
Versioni interessate
- Vulnerabili: KeePass 2.53.1 e precedenti (Windows e Linux).
- Corrette: KeePass 2.54 e successive.
- KeePassXC, KeePass 1.x e Strongbox non sono interessati.
Il difetto risiede nel controllo personalizzato SecureTextBoxEx: per ogni carattere
digitato, .NET mantiene una stringa residua in memoria gestita della forma
●a, ●●s, ●●●s, … dalla quale ogni carattere della password successivo al primo
può essere recuperato.
Prerequisiti e limitazioni dell'attacco
- Richiede un artefatto di memoria del processo KeePass: un dump di processo, il
file di paging/swap, un file di ibernazione, un crash dump del kernel o una cattura
completa della RAM. Non è necessaria alcuna esecuzione di codice sul sistema target.
- Funziona sia che l'area di lavoro sia bloccata o sbloccata, e anche dopo che il
processo KeePass è terminato (purché le pagine di memoria sopravvivano da qualche parte).
- Il primissimo carattere della password non è recuperabile dalla fuga di dati.
- La fuga di dati cattura in modo affidabile i caratteri ASCII stampabili; i caratteri non ASCII
sono meno affidabili.
- Più password principali inserite nella stessa sessione possono produrre
stringhe residue sovrapposte e ridurre la precisione.
Mitigazione
Se hai utilizzato KeePass ≤ 2.53.1, considera la password principale compromessa:
- Aggiorna KeePass alla 2.54 o successiva.
- Cambia la password principale (e ruota qualsiasi segreto di alto valore archiviato nel
database che sia stato inserito mentre era in uso la vecchia password principale).
- Elimina gli artefatti di memoria che potrebbero ancora contenere le stringhe residue:
- elimina i crash dump (ad es.
C:\Windows\memory.dmp),
- disabilita/azzera l'ibernazione (
powercfg /h off su Windows),
- elimina o sovrascrivi il pagefile / swapfile,
- sovrascrivi lo spazio libero su disco (ad es.
cipher /w: su Windows) così che i
residui non possano essere estratti da settori precedentemente allocati,
- riavvia — oppure, per scenari ad alta sicurezza, reinstalla il sistema operativo.
Requisiti
- Python 3.10+ (solo libreria standard — nessun pacchetto di terze parti)
keepassxc-cli nel $PATH (necessario solo per --kdbx)
Installazione
Su Debian / Ubuntu, installa la CLI di KeePassXC se prevedi di eseguire il brute-force:
sudo apt install keepassxc
Utilizzo
# Recupera i caratteri candidati e stampali
python3 keepass_dumper.py memory.dmp
# Salva l'elenco dei candidati generato in un file
python3 keepass_dumper.py memory.dmp -p candidates.txt
# Recupera ed esegui il brute-force sul primo carattere mancante contro un KDBX
python3 keepass_dumper.py memory.dmp --kdbx db.kdbx
Esegui python3 keepass_dumper.py --help per l'elenco completo delle opzioni.
Differenze rispetto all'originale
- Filtro di scansione più restrittivo (ASCII stampabile di default) per ridurre i falsi positivi.
- Charset ordinato per priorità (lettere → cifre → punteggiatura comune → resto)
così che i candidati più probabili vengano provati per primi.
- Lettore di dump basato su mmap, barra di avanzamento su riga singola, output più silenzioso.