Время прочтения: 6 мин.

В апреле 2023 года была опубликована уязвимость CVE-2023-32784 KeePass, которая позволяла злоумышленнику получить данные мастер-пароля к базе .kdbx путём чтения дампов памяти системы. По версии автора, уязвимость связана со способом обработки данных в памяти фреймвoрка .NET, а значит, может быть воспроизведена на операционных системах Windows, Linux и MacOS, работающих на x86/x64 и ARM64 архитектурах.

В списке изменений релиза 2.54 от 03.06.2023 указано устранение данного эксплойта (Improved process memory protection of secure edit controls (CVE-2023-32784)). Поэтому попробую воспроизвести на предыдущей версии, а заодно и проверю «работу над ошибками» автора.

Подготовка

Для эксперимента понадобится:

— Установить KeePass версии 2.53.1 или старше

— Установить SDK.NET (компонент для командной строки фреймворка, на котором написано/работает ПО)

— Скачать код эксплойта с GIT

Итак, когда всё скачано, установлено и разархивировано, самое время определить нашу цель.

Их 3:

— Файл подкачки ОС «pagefile.sys«

— Файл гибернации ОС «hiberfil.sys«

— Прямой дамп памяти приложения из ОЗУ «KeePass.DMP«

На схеме ниже изображена логика работы моих целей:

Как видно из схемы, самый «чистый» способ атаки — это дамп памяти приложения, так как «hiberfil.sys« хранит данные из ОЗУ всей системы для развёртки из гибернационного режима ОС, а «pagefile.sys« может быть слишком фрагментирован, так как является буфером оперативной памяти и может не содержать ряд данных, которые будут нужны.

Дамп памяти – это «снимок» состояния памяти процесса, содержащий полную информацию об исполняемых процедурах и других параметрах ядра системы, в данном случае для обработки конкретного приложения.

Реализация

1. Открываю приложение KeePass и создаю новую базу (Файл -> Создать… /Ctrl + N).

2. Задаю мастер-пароль, сохраняю базу и выхожу. Делаю тестовое открытие и блокирую базу. Свой пароль говорить я не буду. Если всё пройдёт «хорошо», то узнаете в процессе.

3. Делаю дамп памяти приложения. Открываю Диспетчер задач (Win+R -> taskmgr.exe -> Enter). В списке процессов нахожу KeePass и в контекстном меню выбираю «Создать файл дампа памяти». Путь по умолчанию

«C:\Users\<user_name>\AppData\Local\Temp\KeePass.DMP».

4. Переношу файл дампа в каталог с программой (у меня «C:\keepasspassworddumpermain«)

5. Открываю командную строку (Win+R -> cmd -> Enter). Указываю рабочий каталог cd C:\keepass-password-dumper-main

6. Пишу команду dotnet run KeePass.DMP, нажимаю Enterи ждём 2-3 секунды)

Получаю следующее:

1: *

2: e, N, c, d, f, g, C, :, \, #, J, n, V, A, ., -,

3-20: stPasswordForNTA23

Итоги

Сразу скажу, что хвост правильный. Со вторым символом получили набор, в котором первый символ тоже корректный. Не знаю, то ли они выставлены по вероятности, то ли просто так совпадает, но на 4х прогонах первая буква из второго разряда была «е», то есть корректная. Так как в качестве пароля используется текст, то не сложно догадаться по смыслу, что первый символ — это либо «T«, либо «t«. Если бы пароль был сгенерирован с высоким уровнем защиты, в сухом остатке всё равно бы получили весь набор без двух первых символов, которые можно было бы без особых проблем забрутфорсить. Разработчик заботливо реализовал в KeePass поддержку командной строки. Следовательно, очень упростил работу с ПО как рядовому пользователю, так и злоумышленнику, ведь все описанные выше этапы можно автоматизировать и собрать «отличный инструмент» добычи баз с подобранными ключами.

Вот простой пример использования командной строки для проверки пароля:

Выбираю каталог: cd C:\Program Files\KeePass Password Safe 2

Запускаю базу с ключом: KeePass.exe «C:\<путь_к_базе>\test_base.kdbx» -pw:TestPasswordForNTA23

Умея правильно извлекать коды ответов из памяти, подбор валидных двух первых символов много времени не займёт. «Упаковав всё в песочницу», это можно проворачивать без ведома пользователя. Задача в данной публикации была проверить воспроизводимость эксплойта, а не доведение его до идеала. Но мысли бывает не остановить)

Осталось проверить исправленный релиз, чтобы самому быть спокойным, ведь я являюсь активным пользователем данного ПО со времён института (с 2006 года.). Удаляю версию 2.53.1 со всеми следами, ставлю 2.54 и повторяю все этапы, описанные выше. Пароль прежний.

Получаю:

Оценка уязвимости по CVSS

Для тех, кто любит цифры – ниже приведены результаты оценки уязвимости по международному стандарту CVSS:

Надо понимать, что в рамках эксперимента я имел полный доступ к операционной системе, в отличие от реальной атаки, которая, скорее всего, будет выполняться пакетно, через вредоносный файл по сети, а, следовательно, снижать уровень своей сетевой защиты нужно обдумано.

Выводы

Главный вывод, который напрашивается сам собой, — это то, что защита никогда не бывает избыточной. А то, что в этом году версии 2.xx уже исполнилось 16 лет, и только сейчас «была найдена» эта уязвимость, говорит лишь о беспечности автора ПО и о том, что эта дыра «юзалась» заинтересованными лицами уже не один год. И только сейчас «белый хакер» поделился «находкой».

Защита памяти методами шифрования входит в золотой набор разработчика ещё до этапа тестирования программ, чувствительных к перехвату критических данных. Подобная ситуация — скорее исключение из правил в современном мире, чем закономерность.

Автору понадобилось без малого месяц, чтобы выпустить заплатку с дополнительным ворохом апдейтов, хотя подобные уязвимости закрываются оперативно отдельной заплаткой, без допов, которые можно зарелизить позже.

Думаю, не лишним будет как обычным пользователям, так и руководителям отделов кибербезопасности в организациях проверить установленные версии KeePass, так как у ПО нет автонаката апдейтов и устанавливать обновление придётся руками.

Делитесь комментариями получилось ли у вас получить свой пароль этим методом, или вы входите в 14% людей, которые ставят моментально самые новые версии, как только они появляются в доступе?

Стенд тестирования: OS MS Windows 11 Home SLRU (x64 22H2)