
Оригинальный PoC для CVE-2023-32784
Уязвимости присвоен идентификатор CVE-2023-32784, и она исправлена в KeePass 2.54. Ещё раз спасибо Доминику Райхлю за быструю реакцию и креативное исправление!
Уточнение: пароль должен быть введён с клавиатуры, а не скопирован из буфера обмена (см. разделы «Как это работает»).
Во-первых, обновитесь до KeePass 2.54 или выше.
Во-вторых, если вы давно пользуетесь KeePass, ваш мастер-пароль (и, возможно, другие пароли) может находиться в файле подкачки (pagefile/swapfile), файле гибернации и аварийных дампах (crash dump). В зависимости от уровня вашей паранойи, вы можете рассмотреть следующие шаги для решения проблемы:
C:\Windows\memory.dmp, но могут быть и другие)/w в Windows)Либо просто перезапишите ваш жёсткий диск и выполните чистую установку ОС.
Неполный список продуктов, которые не затронуты (пожалуйста, создайте pull request или issue для добавления других). Эмпирическое правило: если это не оригинальное приложение KeePass 2.X, написанное на .NET, скорее всего, оно не затронуто.
KeePass Master Password Dumper — это простой инструмент типа proof-of-concept, предназначенный для извлечения мастер-пароля из памяти KeePass. За исключением первого символа пароля, он в основном способен восстановить пароль в открытом виде. Для этого не требуется выполнение кода на целевой системе — достаточно дампа памяти. Неважно, откуда взята память — это может быть дамп процесса, файл подкачки (pagefile.sys), файл гибернации (hiberfil.sys), различные аварийные дампы или дамп ОЗУ всей системы. Неважно, заблокировано рабочее пространство или нет. Также можно извлечь пароль из ОЗУ после того, как KeePass больше не запущен, хотя вероятность успеха снижается со временем, прошедшим с этого момента.
Протестировано с KeePass 2.53.1 на Windows (английская версия) и KeePass 2.47 на Debian (пакет keepass2). Должно работать и в версии для macOS. К сожалению, включение опции Enter master key on secure desktop не помогает предотвратить атаку. PoC может иметь проблемы с базами данных, созданными более старыми версиями KeePass, но мне не удалось воспроизвести эту проблему (см. issue #4).
Результат был подтверждён Домиником Райхлем, автором KeePass, здесь. Я ценю быстрый ответ Доминика. Надеюсь, вскоре это будет исправлено!
git clone https://github.com/vdohney/keepass-password-dumper или скачайте его с GitHubcd keepass-password-dumperdotnet run PATH_TO_DUMPСамый простой способ протестировать это в Windows — создать дамп процесса в диспетчере задач, щёлкнув правой кнопкой мыши по процессу KeePass и выбрав «Create dump file».

dotnet run PATH_TO_DUMP PATH_TO_PWDLIST, чтобы сгенерировать список всех возможных паролей, начиная со второго символа.Зависит от вашей модели угроз. Если ваш компьютер уже заражён вредоносным ПО, работающим в фоне с правами вашего пользователя, эта находка не сильно ухудшит ваше положение. Однако вредоносному ПО может быть проще оставаться незаметным и обходить антивирус, поскольку, в отличие от KeeTheft или KeeFarce, не требуются внедрение в процесс или другой тип выполнения кода.
Если у вас есть разумные подозрения, что кто-то может получить доступ к вашему компьютеру и провести криминалистический анализ, это может быть плохо. В худшем случае мастер-пароль будет восстановлен, даже если KeePass заблокирован или вообще не запущен.
Если вы используете полное шифрование диска с надёжным паролем и ваша система чиста, вам не о чем беспокоиться. Никто не сможет украсть ваши пароли удалённо через интернет, используя только эту находку.
KeePass 2.X использует специально разработанное текстовое поле для ввода пароля — SecureTextBoxEx. Это текстовое поле используется не только для ввода мастер-пароля, но и в других местах KeePass, например в полях редактирования пароля (так что атаку можно также использовать для восстановления их содержимого).
Используемый здесь недостаток заключается в том, что для каждого введённого символа в памяти создаётся остаточная строка. Из-за того, как работает .NET, от неё почти невозможно избавиться после её создания. Например, при вводе «Password» будут созданы следующие остаточные строки: •a, ••s, •••s, ••••w, •••••o, ••••••r, •••••••d. Приложение POC ищет в дампе эти шаблоны и предлагает вероятный символ пароля для каждой позиции в пароле.
Надёжность этой атаки может зависеть от того, как был введён пароль и сколько паролей было введено за сеанс. Тем не менее я обнаружил, что даже если за сеанс было введено несколько паролей или были опечатки, способ выделения этих строк средой CLR .NET означает, что они, скорее всего, будут аккуратно упорядочены в памяти. Так, если были введены три разных пароля, вы, вероятно, получите по три кандидата для каждой позиции символа в этом порядке, что позволяет восстановить все три пароля.
Это быстрый POC, так что он, вероятно, не очень надёжен и устойчив. Пожалуйста, создайте pull request, если найдёте проблему, и исправьте её.
Допустимые символы пароля сейчас жёстко заданы следующим образом: ^[\x20-\x7E]+$ (все печатные символы ASCII и пробел).
Спасибо adridlug за добавление возможности автоматической генерации списка паролей и ynuwenhof за рефакторинг кода.
Я ещё ни одну из них не проверял.