В конце августа 2010 года работники в области безопасности начали выпускать подробную информацию о классе уязвимостей, имевших довольно широкий спектр последствий. Уязвимость, рассматриваемая словенской компанией безопасности Acros, получила довольно неприятную репутацию, когда исследователь безопасности и Metasploit создатель HD Moore обнаружил сотни приложений, которые были уязвимы для атак этого вектора. Атака, использующая эти уязвимости, представляла собой копию перехвата DLL. В этой статье я расскажу об архитектурных недостатках, позволяющих выполнять перехват DLL, о том, как определять уязвимость используемых приложений и о тех шагах, которые можно предпринять для предотвращения этой атаки.
Принцип работы
Перехват DLL является возможным, поскольку практически все приложения Windows в своей работе полагаются на библиотеки Dynamic Link Libraries (DLLs), как часть их основной функциональности. DLL's содержат модульные компоненты кода, которые разработчики могут использовать внутри приложения для выполнения различных функций. Сама Windows полагается на такой же тип архитектуры и содержит множество DLLs, выполняющих разнообразные функции.
Помимо DLL's файлов, интегрированных в Windows, разработчики программ часто создают собственные DLLs, содержащие функции, которые используются программой. Когда это делается, созданные разработчиком DLLs файлы пакуются и устанавливаются вместе с приложением. Проблема заключается в том, как приложение загружает DLLs. По умолчанию, когда для приложения не указан статический путь к DLL, требуемый для этого приложения, оно осуществляет процесс его динамического поиска. Выполняя эту процедуру, приложение сначала выполняет поиск в каталоге, из которого оно выполнялось, а затем выполняет поиск в системном каталоге, 16-разрядном системном каталоге, каталоге windows, в текущем каталоге, а потом в каталогах, перечисленных в переменной среды ПУТЬ операционной системы. При поиске по этим путям приложение будет использовать первый DLL, который оно найдет.
Зная это, давайте представим себе ситуацию, в которой мы выполнили приложение, требующее динамический поиск необходимого DLL файла при загрузке. Приложение немедленно выполняет поиск по пути, с которого оно было выполнено и находит подходящий DLL. К несчастью для конечного пользователя, действительный DLL файл, связанный с приложением, расположен в системном каталоге Windows. DLL-файл, помещенный в каталог с приложением, представляет собой файл, который был изменен злоумышленником и который позволяет удаленно выполнять командную оболочку в системе. Конечно, приложение никогда не получит действительный DLL файл, поскольку оно уже нашло необходимый файл. Шах и мат.
Определение уязвимых приложений
Основной проблемой с атаками перехвата DLL является то, что компания Microsoft не можно выпустить единое исправление для всех уязвимых приложений. Это невозможно потому, что это попросту может привести к некорректной работе (или полному отказу в работе) некоторых приложений. Учитывая это, исправление проблем является делом двух сторон. С одной стороны, компании и разработчики, создавшие уязвимые приложения, должны исправить свой код и предоставить пользователям обновления. С другой стороны, пользователи (в частности системные администраторы) должны определить, используются ли в их сети уязвимые приложения, и найти и установить исправления, предоставляемые поставщиками программ.
Есть пара способов определения уязвимости используемых приложений. Самым простым способом является проверка публичных ресурсов, выложенных исследователями в области безопасности, которые уже выполнили основную работу. Одним из таких полезных ресурсов является этот ресурс, содержащий довольно большой список.
Рисунок 1: Список уязвимых приложений Exploit DB
Второй способ требует больше работы, но должен выполняться в средах с высокой степенью безопасности. Вы, возможно думаете, что эти вещи чисто технические и обычно с ними работают специалисты безопасности высокого уровня, и, как правило, вы будете правы. Однако в своей безграничной мудрости HD Moore знал о величине этого вектора атак и разработал набор аудита, который может использоваться для поиска уязвимых приложений в системе.
Этот набор называется DllHijackAuditKitv2 и его можно найти здесь. После загрузки необходимо зайти в систему с правами администратора, извлечь компоненты из ZIP файла и выполнить 01_StartAudit.bat. Этот сценарий загрузит монитор Sysinternals Process Monitor и начнет проверку системы на уязвимые приложения. Запустив этот инструмент несколько раз, я обнаружил, что загрузка монитора процессов чаще оказывается неуспешной, чем успешной, поэтому если такое происходит при выполнении сценария, вы можете вручную загрузить монитор Process Monitor отсюда. После загрузки просто убедитесь, что Process Monitor расположен в том же каталоге, что и сценарии аудита. Для запуска начального сценария аудита потребуется определенное время. В зависимости от количества приложений в вашей системе может потребоваться от 15 минут до часа.
Увеличить
Рисунок 2: Аудит приложений, связанных с определенными расширениями файлов
После завершения работы сценария аудита необходимо перейти на приложение монитора процессов, которое были инициировано сценарием и сохранить сгенерированный им отчет. Для этого нажмите Файл и Сохранить. Обязательно сохраните файл в формате CSV с именем Logfile.CSV в каталоге набора аудита.
Далее запустите сценарий 02_Analyze.bat. Этот сценарий проанализирует CSV файл и определит потенциальные уязвимости. Если уязвимость будет найдена, приложение автоматически сгенерирует код средства атаки, который можно использовать для демонстрации уязвимости.
Рисунок 3: Второй сценарий автоматически пытается использовать обнаруженные уязвимости
По окончании, интерпретатор команд, оставленный открытым сценарием, должен выдать список приложений, которые были успешно использованы для атаки. Для каждого такого приложения сценарий создаст подкаталог в каталоге средств атаки. Эти подкаталоги содержат рабочие средства атаки для соответствующих приложений. В недобрых руках эти средства атаки могут делать такие ужасные вещи, как запуск командных оболочек и прослушивателей черного хода (back door listeners). Это просто примеры возможности использования средств атаки, поэтому они запускают приложение калькулятора (calc.exe), чтобы продемонстрировать существование уязвимости.
Имея такую информацию, вы можете определить наличие уязвимых приложений в вашей среде. На этом раннем этапе игры, если вы используете Windows, то вы обязательно найдете уязвимости, так как ряд исправлений еще выпущен. Помимо этого, если вы найдете уязвимые приложения, для них нужно проверить наличие исправлений у производителя. Если таковых исправлений нет, то рекомендуется связаться с производителем и предоставить ему код средства атаки, чтобы разработчик мог исправить уязвимость приложения. Даже если производители уже знают об уязвимости своих приложений, лишнее напоминание не повредит им и может ускорить процесс.
Предотвращение атак
Пока вы ждете выхода исправления приложений, есть ряд моментов, которые можно сделать для ограничения своей подверженности атакам перехвата DLL.
Установка исправления CWDIllegalInDllSearch Fix
Первой реакцией компании Microsoft на этот класс уязвимостей стал выпуск модификации системного реестра, которая позволяет снизить потенциальную опасность таких атак путем изменения принципа работы динамической загрузки DLL. Это исправление нужно устанавливать очень осторожно, поскольку оно может повлиять на работоспособность установленных приложений, но его стоит протестировать, если вы обеспокоены атаками такого типа. Информацию об этом исправлении можно посмотреть здесь.
Блокировка исходящих SMB в демилитаризованной зоне
Большинство организаций уже делает это, но если в вашей организации это еще не практикуется, самое время начать. Это также позволит предотвратить ряд других атак.
Деинсталляция уязвимых приложений
Это может быть не всегда возможным, но если у вас есть уязвимые приложения, которые можно заменить более надежными приложениями, то лучше так и сделать.
Установка программ определения вторжения
В некоторых случаях вы просто не сможете снизить потенциальный риск выполнения атак должным образом. В результате, лучшим вариантом будет поимка взломщика с поличным. Использование таких продуктов, как Snort, является бесплатным (не считая затраты на аппаратное обеспечение) и делает отличную работу для определения сигнатур активности после атак, которые могли возникать после того, как кто-либо использовал средство атаки на уязвимой машине.
Заключение
Наличие такого количества уязвимостей для перехвата DLL представляет интересный случай, так как его нелегко исправить с помощью исправлений операционной системы, и оно влияет на большое количество широко используемых приложений. Лучшей защитой в этой ситуации является знание того, как работает уязвимость, как проверять наличие уязвимых приложений в вашей сети, и как предоставлять правильную информацию тем людям, которые могут исправить проблему. В этой ситуации нам всем придется принять участие в исследовании уязвимости безопасности.