keepass_dumper.py
Python-порт vdohney/keepass-password-dumper
(CVE-2023-32784) — вся заслуга за оригинальную C#-реализацию и
лежащую в основе технику принадлежит vdohney.
Скрипт сканирует дамп памяти процесса на предмет остаточных строк рендеринга, которые
SecureTextBoxEx из KeePass 2.x оставляет после себя, пока пользователь вводит
мастер-пароль, и восстанавливает каждый символ этого пароля, кроме первого.
При необходимости он затем перебирает неизвестный первый символ
по файлу KDBX с помощью keepassxc-cli.
Затронутые версии
- Уязвимые: KeePass 2.53.1 и более ранние (Windows и Linux).
- Исправленные: KeePass 2.54 и более поздние.
- KeePassXC, KeePass 1.x и Strongbox не затронуты.
Недостаток кроется в пользовательском элементе управления SecureTextBoxEx: для каждого введённого
символа .NET сохраняет в управляемой памяти остаточную строку вида
●a, ●●s, ●●●s, … из которой можно восстановить каждый символ пароля, начиная со второго.
Предварительные условия атаки и ограничения
- Требуется артефакт памяти процесса KeePass: дамп процесса,
файл подкачки/свопинга, файл гибернации, аварийный дамп ядра или полный снимок ОЗУ.
Выполнение кода на целевом хосте не требуется.
- Работает как при заблокированном, так и при разблокированном рабочем пространстве, а также даже после
завершения процесса KeePass (если страницы памяти где-то сохранились).
- Самый первый символ пароля не восстанавливается из утечки.
- Утечка надёжно захватывает печатные ASCII-символы; не-ASCII символы
менее надёжны.
- Несколько мастер-паролей, введённых в одном сеансе, могут давать
перекрывающиеся остаточные строки и снижать точность.
Меры по устранению
Если вы использовали KeePass ≤ 2.53.1, считайте мастер-пароль скомпрометированным:
- Обновите KeePass до 2.54 или новее.
- Смените мастер-пароль (и ротируйте любые ценные секреты, хранящиеся в
базе данных, которые вводились при использовании старого мастер-пароля).
- Очистите артефакты памяти, которые всё ещё могут содержать остаточные строки:
- удалите аварийные дампы (например,
C:\Windows\memory.dmp),
- отключите/очистите гибернацию (
powercfg /h off в Windows),
- удалите или затирайте файл подкачки / своп-файл,
- перезапишите свободное место на диске (например,
cipher /w: в Windows), чтобы
остатки нельзя было извлечь из ранее выделенных секторов,
- перезагрузите систему — или, для сценариев с высокими требованиями к безопасности, переустановите ОС.
Требования
- Python 3.10+ (только стандартная библиотека — сторонние пакеты не требуются)
keepassxc-cli в $PATH (нужен только для --kdbx)
Установка
В Debian / Ubuntu установите CLI KeePassXC, если планируете перебор:
sudo apt install keepassxc
Использование
# Восстановить символы-кандидаты и вывести их
python3 keepass_dumper.py memory.dmp
# Сохранить сгенерированный список кандидатов в файл
python3 keepass_dumper.py memory.dmp -p candidates.txt
# Восстановить и перебрать недостающий первый символ по KDBX
python3 keepass_dumper.py memory.dmp --kdbx db.kdbx
Выполните python3 keepass_dumper.py --help для получения полного списка опций.
Чем отличается от оригинала
- Более строгий фильтр сканирования (по умолчанию печатные ASCII) для сокращения ложных срабатываний.
- Набор символов с приоритетным порядком (буквы → цифры → распространённые знаки препинания → остальное),
чтобы наиболее вероятные кандидаты проверялись первыми.
- Чтение дампа на основе mmap, однострочный индикатор прогресса, более тихий вывод.