Несмотря на то что в мире придумано много способов аутентификации и контроля доступа, именно пароль самый распространенный и одновременно наиболее уязвимый. Множество интернет-порталов и сервисов в целях безопасности запрещают пользователям создавать простые пароли, что, с одной стороны, хорошо, а с другой — просто неудобно. Если же умножить данный факт на десяток подобных сайтов, то мы получим настоящую головную боль. Для устранения пробела между человеческим фактором и безопасностью данных на помощь приходят менеджеры паролей, которые берут на себя организацию паролей пользователя. Однако при таком подходе получается, что безопасность пользователя зависит только от одного — от мастер-пароля.
WARNING
Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи.Постановка задачи
В сентябрьском номере журнала (№ 176) был краткий обзор и сравнение популярных менеджеров паролей, сегодня же подробно поговорим об их безопасности в целом. В этой статье мы критически подойдем к защите менеджеров паролей и рассмотрим несколько вариантов атаки на популярные менеджеры с целью получения мастер-пароля или возможности частичного получения данных, сохраненных в базе паролей.
В качестве экзаменуемых были выбраны пять наиболее популярных решений для ОС Windows:
- Kaspersky Password Manager 5.0.0.176;
- Sticky Password 7.0.2.27;
- 1Password 1.0.9.337;
- KeePass 2.23;
- RoboForm 7.9.2.5.
Каждый из них мы проверим на уязвимость к следующим атакам:
- атаке на мастер-пароль;
- атаке на содержимое базы паролей;
- атаке DLL Hijacking.
И по результатам проверки поставим каждому из них соответствующую оценку: плохо, удовлетворительно или хорошо.
Атака на пароли
Как известно, менеджеры паролей не сохраняют мастер-пароль где-либо на компьютере, и каждый раз при использовании менеджера пользователь должен вводить его вручную. Для перехвата таких паролей, как правило, используют кейлоггеры плюс запись движения курсора и снимки экрана, если имела место виртуальная клавиатура. Однако в нашем случае мы не будем писать сложные теневые драйверы для перехвата нажатий клавиш и снимков экранов, так как они могут поставить нашу атаку в лабораторные условия и легко детектятся антивирусами. Мы рассмотрим интересный, но не новый способ получения пароля прямо из окна ввода через вызов API SendMessage
c параметром WM_GETTEXT
. Этот способ замечателен тем, что многие антивирусы не распознают его как потенциально опасное действие, а реализуется он буквально парами строк кода, плюс для его запуска не требуется наличие прав администратора.
Кроме того, атаку через SendMessage можно применить для получения текстовых данных из любых окон приложения, поэтому, даже если мастер-пароль не поддастся, есть большая вероятность частичного или полного получения содержимого самой базы после ее открытия.
DLL Hijacking
Помимо этого, мы будет проверять уязвимость каждого менеджера к атаке DLL Hijacking, чтобы выяснить, насколько корректно каждый из них загружает динамические библиотеки. И если будет обнаружена возможность подменить загружаемую библиотеку на свою, то это будет означать, что мы сможем выполнить произвольный код в системе. И хотя данной атаке подвержено большое количество различных приложений, в случае с менеджерами паролей она имеет свой нюанс. Многие пользователи часто работают за разными компьютерами, и поэтому они запускают менеджеры паролей со съемных устройств. Если при каждом таком запуске будет происходить загрузка несанкционированной библиотеки, то фактически сам менеджер паролей превращается в опасного распространителя вирусов.
Пишем SendMessage-эксплойт
Писать для каждого менеджера паролей свой собственный эксплойт неэффективно, поэтому давай лучше напишем универсальный. Преимущества такого эксплойта заключаются в том, что с его помощью мы можем не только «выдернуть» мастер-пароль и сохраненные в самой базе пароли, но также использовать его для других приложений, в которых есть форма ввода пароля. Фактически по функционалу у нас получится простой и удобный хактул, позволяющий получать пасворды, быстро дать ответ на интересующий вопрос для любого приложения. Ну а теперь перейдем к самому кодингу.
Прежде всего нам понадобится функция, которая будет подготавливать поле memo для принятия новых данных и определять хендл главного окна под курсором, после чего будет получать хендлы дочерних окон и передавать его последующей функции для распознания содержимого окна.
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Memo1->Lines->Clear();
HWND h;
POINT Point;
GetCursorPos(&Point);
h = WindowFromPoint(Point);
EnumChildWindows(h,(WNDENUMPROC)EnmWndwsWnd,0);
}
За вывод содержимого дочерних окон будет отвечать функция EnmWndwsWnd
.
BOOL CALLBACK EnmWndwsWnd(HWND h,LPARAM lParam)
{
if (IsWindowVisible)
{
char g[255];
GetClassName(h,g,255);
std::string text;
WPARAM ln = SendMessage(h,WM_GETTEXTLENGTH,0,0);
if(ln>0)
{
char *buf = new char[ln+1];
LRESULT got = SendMessage(h,WM_GETTEXT,ln+1,(LPARAM)buf);
if((LRESULT)ln == got)
text = buf;
delete [] buf;
Form1->Memo1->Lines->Add((String)g+":"+text.c_str());
}
}
return TRUE;
}
После запуска программа, используя таймер, будет отслеживать положение курсора на экране и определять текст под ним, то есть достаточно навести на необходимое поле курсор, чтобы мгновенно узнать пароль. Кроме того, с помощью данной тулзы можно узнать текстовое содержимое всех окон в приложении. Данная функция будет полезна, чтобы мгновенно просканировать содержимое базы паролей после открытия менеджера.
Ищем уязвимости DLL Hijacking
В нашем случае для обнаружения DLL Hijacking можно использовать широко известный Procmon. Кроме Procmon, также подойдет другая известная утилита API Monitor, где в соответствующем меню настроек предварительно необходимо указать перехват функцийLoadLibrary
и LoadLibraryEx
. Если библиотека вызывалась без указания полного пути, а указывалось лишь конечное имя файла, то у нас есть все шансы найти уязвимый DLL-файл. Теперь напишем небольшой код, который будет сигнализировать о наличии уязвимости и в качестве доказательства открывать калькулятор.
#include <windows.h>
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
WinExec("calc.exe", 0);
return 1;
}
Созданная библиотека будет открывать калькулятор каждый раз, когда приложение ее загрузит, таким образом мы сможем однозначно судить о наличии DLL Hijacking.
INFO
Все описанные уязвимости в Kaspersky Password Manager и Sticky Password существовали еще три года назад. Несмотря на то что вендоры были предупреждены, как видишь, проблема осталась до сих пор.
Kaspersky Password Manager 5.0.0.176
Ну а теперь пришло время приступить непосредственно к оценке безопасности менеджеров паролей. Первым экзаменуемым у нас будет Kaspersky Password Manager. Возможно, виртуальная клавиатура смогла бы помочь ему в случае с кейлоггерами, но в нашем случае мастер-пароль был получен сразу и без каких-либо трудностей. Первый раунд не в пользу «Лаборатории Касперского».
Хакер #179. Интернет вещей — новый вектор атак
Второй раунд также оказался за нашей хак-тулзой. После ввода мастер-пароля сохраненные данные частично удалось заполучить в момент их просмотра или редактирования.
Кроме всего, KMP оказался подвержен и третьей атаке (DLL Hijacking). При старте он пытается загрузить библиотеку bthprops.cpl. Данная библиотека находится в системной директории и необходима для работы с Bluetooth-устройствами, однако KMP пытается запустить ее без указания полного пути, что и послужило причиной уязвимости. Таким же образом происходит загрузка другой библиотеки cryptsp.dll. Достаточно разместить вредоносную библиотеку, которая, к примеру, может содержать эксплойт для предыдущих двух атак, в одной директории с приложением и переименовать ее в bthprops.cpl, после чего она сможет загружаться каждый раз при запуске KMP.
Подводя итог, можно сказать, что Kaspersky Password Manager оказался далеко не на высоте. Итоговая оценка — плохо.
Sticky Password 7.0.2.27
Немногие знают, что Sticky Password является родителем Kaspersky Password Manager. Именно на его основе «Лаборатория Касперского» в свое время разработала собственный продукт. Оба менеджера обладают схожим функционалом и структурой, фактически главное их отличие — это номера версий и дизайн. Несмотря на то что последняя версия Sticky Password вышла совсем недавно, программа по-прежнему не избавилась от всех тех проблем, которыми когда-то наградила своего отпрыска. Первая и вторая атака успешно выдала мастер-пароль и частично содержимое базы паролей.
Как и в случае с Kaspersky Password Manager, третий раунд оказался не в пользу Sticky Password: был выявлен ряд уязвимостей DLL Hijacking. При запуске приложение пытается загрузить несколько динамических библиотек из собственного каталога: fitlib.dll, olepro32.dll, profapi.dll. Общий вердикт такой же, как и у Kaspersky Password Manager. Итоговая оценка — плохо.
1Password 1.0.9.337
1Password от компании Agile Bits первый тест прошел успешно и не дал так просто заполучить мастер-пароль, как в предыдущих двух случаях. Также очень порадовало наличие защитной функции Unlock on Secure Desktop
, которая блокирует любой доступ к приложению в момент ввода пароля. Единственным моментом, когда удалось заполучить мастер-пароль нашей атакой, стал лишь непосредственный момент создания базы паролей. Однако такой метод малоприменим на практике, поэтому его результат мы не учитываем. После открытия базы заполучить сохраненные данные частично стало возможно при редактировании или просмотре, как и в предыдущих случаях.
DLL Hijacking также не обошла стороной и 1Password. После открытия базы приложение пытается загрузить библиотеку midimap.dll. Несмотря на ряд уязвимостей, наличие защитной функции ввода пароля все же склонило к нейтральной точке зрения, поэтому итоговая оценка — удовлетворительно.
KeePass 2.23
Хорошо известный KeePass отлично справился с первой атакой. Как и 1Password, он имеет в своем арсенале функцию контроля доступа к приложению в момент ввода пароля. Вторую атаку KeePass также сдержал достойно. Записанные в базе данные можно получить только в момент редактирования, при этом сохраненные пароли остаются нераскрытыми. Третья атака тоже в пользу опенсорсного менеджера паролей.
Хотя Procmon и показал несколько попыток небезопасной загрузки DLL-файлов, однако сделать на их основе рабочий эксплойт не вышло. Зачет в пользу GNU-сообщества. Итоговая оценка — хорошо.
RoboForm 7.9.2.5
RoboForm тоже просто так не сдался на первой атаке и не выдал свой мастер-пароль, за что и получил плюс. Однако второй раунд был не в его пользу. Даже в режиме просмотра удалось легко заполучить почти полное содержимое форм.
Как и в предыдущем случае, Procmon указал на теоретическую возможность DLL Hijacking, однако создать рабочий эксплойт не удалось. Поэтому третий раунд за RoboForm. По заработанным очкам его можно поставить на уровне где-то между 1Password и KeePass, но я все же не стал бы пользоваться менеджером паролей, который в явном виде выводит их на монитор, поэтому, на мой взгляд, итоговая оценка «удовлетворительно» вполне заслужена.
Подводя итоги
Из всех пяти менеджеров паролей только один KeePass смог успешно противостоять всем трем атакам. Открытый код и постоянная поддержка со стороны энтузиастов сделали действительно достойный продукт. Хоть RoboForm и 1Password и не обошлись без изъянов, но оба смогли защитить свой мастер-пароль. Что касательно Sticky Password и Kaspersky Password Manager, то ни один из них не смог уберечься от атаки на мастер-пароль. Кроме этого, они также открывают лазейку в виде DLL Hijacking, поэтому применение данных менеджеров паролей на флеш-накопителях может быть использовано хакером для распространения вредоносного кода и проведения целевой инсайдерской атаки. Данным продуктам требуется действительно качественное улучшение безопасности. Подведя итоги тестирования, не будем отдавать предпочтение какому-либо одному менеджеру, так как оно вытекало бы из различных субъективно-личностных факторов, мы же просто рассматривали эти менеджеры паролей с точки зрения их безопасности.
Все упомянутые в статье программы и исходники ждут тебя на нашем диске.
Предупрежден — значит вооружен
- Для защиты своих паролей от описанной методики перехвата можно настроить на компьютере специальное ПО, которое будет производить мониторинг вызова API-функций
MARKDOWN_HASH2ab05fbef5eddf2027d7f05bdeac283dMARKDOWN_HASH
иMARKDOWN_HASH84ea011a8379b1eb533f68d1d12fe6a6MARKDOWN_HASH
c параметромMARKDOWN_HASHbed4f4e4c653f53c6abf14671add9c05MARKDOWN_HASH
. Данную возможность предоставляют некоторые антивирусы, к примеру, в бесплатном Firewall от COMODO эта функция установлена по умолчанию, в других, возможно, придется задать настройку вручную. Если происходит несанкционированный доступ к окнам приложения, проактивная защита выдаст окно с предупреждением и выбором действия. Однако этот метод не поможет, если тебе часто приходится использовать менеджер паролей с флешки или на чужом компьютере. В качестве надежного решения можно взять менеджер паролей, которой обладает защитной функцией подобно UAC и блокирует несанкционированный доступ к приложению. Такой функцией, к примеру, обладает KeePass и 1Password. - Для устранения проблемы, связанной с DLL Hijacking, на компьютере при помощи специальных утилит ограниваем доступ на запись в соответствующие директории сторонними приложениями. Как и в предыдущем пункте, эта функция может быть доступна в некоторых антивирусных решениях. Что касается защиты приложений на флешках, здесь не все так красиво, но можно использовать следующий ход конем. Сначала сконвертируем файловую систему флешки в NTFS:
convert h: /fs:ntfs /nosecurity /x
Данная система позволяет задать настройки безопасности для отдельных папок и файлов. Можно сразу создать правило только чтения для директории с уязвимым МП, однако если файл с паролями находится там же, мы не сможем редактировать его в процессе работы за чужим компьютером. Поэтому можно создать просто файлы-пустышки с уязвимыми DLL-файлами и уже для них задать настройки только чтения. 3. В качестве дополнительной меры защиты паролей в менеджере паролей можно использовать дополнительную привязку к ключевому файлу или устройству, однако надо понимать, что теперь доступ к сохраненным паролям может быть уязвим к случайному фактору, например потере ключевого файла и поломке USB-устройства.
Заключение
Пароль и безопасность для многих людей могут казаться синонимами. Но когда ставится вопрос о безопасности самих паролей, то непосредственно безопасность выходит на первое место. В конкурентной борьбе вендоры предлагают различные решения, чья надежность на первый взгляд не подлежит сомнению, однако за разрекламированными военными шифрами менеджеры паролей могут скрывать банальные уязвимости, что может сыграть с ними злую шутку. Не стоит паниковать и однозначно судить, что нельзя класть все яйца в одну корзину, однако если все же мы собрались это сделать, то сначала надо как следует проверить надежность нашей корзины.