Анализ атак перехвата DLL
Введение
В конце августа 2010 года исследователи безопасности начали публиковать подробности о классе уязвимостей, которые имели довольно широкое распространение. Уязвимость, обсуждаемая словенской охранной компанией Acros, получила широкую известность, когда исследователь безопасности и создатель Metasploit Х.Д. Мур обнаружил сотни приложений, уязвимых для вектора атаки. Атака, использующая эти уязвимости, получила название DLL Hijacking. В этой статье я расскажу об архитектурных недостатках, делающих возможным перехват DLL, о том, как определить, являются ли приложения, которые вы используете, уязвимыми, и о шагах, которые вы можете предпринять, чтобы убедиться, что вы не являетесь целью этой атаки.
Как это работает
Перехват DLL стал возможен благодаря тому, что почти все приложения Windows полагаются на библиотеки динамической компоновки (DLL) как на часть своей основной функциональности. Библиотеки DLL содержат модульные фрагменты кода, которые разработчики могут использовать в своих приложениях для выполнения различных функций. Сама Windows опирается на архитектуру того же типа и содержит множество библиотек DLL, выполняющих различные функции.
Наряду с DLL, встроенными в Windows, разработчики приложений часто создают свои собственные DLL, содержащие функции, используемые программой. После этого созданные разработчиком библиотеки DLL упаковываются и устанавливаются вместе с приложением. Проблема возникает в том, как приложения загружают библиотеки DLL. По умолчанию, когда приложение не имеет статически определенного пути к DLL, оно требует, чтобы оно выполняло процесс динамического поиска. При этом приложение сначала ищет каталог, из которого оно было выполнено, а затем ищет системный каталог, 16-разрядный системный каталог, каталог Windows, текущий каталог, а затем каталоги, перечисленные в переменной среды PATH операционной системы. При поиске по этим путям приложение будет использовать библиотеку DLL, которую найдет первой.
Зная это, давайте представим сценарий, в котором мы выполнили приложение, которое должно динамически искать требуемую DLL при загрузке. Приложение немедленно ищет путь, по которому оно было запущено, и находит совпадающую DLL. К сожалению для конечного пользователя, настоящая DLL, связанная с приложением, находится в системном каталоге Windows. DLL, которая была помещена в каталог с приложением, была изменена злоумышленником, чтобы обеспечить удаленный доступ к командной оболочке в системе. Конечно, приложение никогда не получит настоящую DLL, потому что оно уже нашло нужное соответствие. Мат, нападающий.
Выявление уязвимых приложений
Самая большая проблема с атаками с перехватом DLL заключается в том, что Microsoft не может просто выпустить универсальное исправление, которое устраняет проблему во всех уязвимых приложениях. Это связано с тем, что это просто приведет к тому, что некоторые приложения будут работать некорректно (или вообще не будут работать). В таком случае решение проблемы находится в руках двух сторон. Во-первых, компании и разработчики, создавшие уязвимые приложения, должны исправить свой код и предоставить пользователям обновления. Во-вторых, пользователи (а именно системные администраторы) должны определить, работают ли в их сетях уязвимые приложения, а также найти и установить исправления, предоставленные поставщиком.
Есть несколько способов определить, используете ли вы уязвимое приложение. Самый простой способ — проверить общедоступные ресурсы, опубликованные исследователями безопасности, которые уже проделали основную работу, и посмотреть, существует ли там ваше приложение. Вы можете найти один из таких замечательных ресурсов здесь, который содержит довольно значительный список.
Рисунок 1: Список уязвимых приложений в Exploit DB
Второй метод требует немного больше работы, но это то, что нужно делать в высокозащищенных средах. Теперь вы можете подумать, что такого рода вещи носят технический характер и обычно предназначены для исследователей безопасности высокого уровня, и, как правило, вы правы. Тем не менее, в своей безграничной мудрости Х. Д. Мур прекрасно осознавал масштабы этого вектора атаки и разработал набор для аудита, который можно использовать для поиска уязвимых приложений в системе.
Комплект называется DllHijackAuditKitv2 и доступен здесь. После загрузки убедитесь, что вы вошли в систему как системный администратор, распакуйте содержимое ZIP-файла и выполните 01_StartAudit.bat. Этот сценарий загрузит Sysinternals Process Monitor и начнет проверку системы на наличие уязвимых приложений. Запуская приложение несколько раз, я заметил, что загрузка Process Monitor чаще всего завершается сбоем, поэтому, если это происходит при запуске скрипта, вы можете вручную загрузить Process Monitor отсюда. После загрузки просто убедитесь, что Process Monitor находится в том же каталоге, что и сценарии аудита. Для выполнения первоначального сценария аудита потребуется некоторое время. В зависимости от количества приложений в системе это может занять от 15 минут до часа.
Рисунок 2. Проверка приложений, связанных с определенными расширениями файлов.
После завершения выполнения сценария аудита вы должны переключиться на приложение мониторинга процесса, созданное сценарием, и сохранить сгенерированный им отчет. Нажмите «Файл» и «Сохранить», чтобы сделать это. Убедитесь, что вы сохранили файл в формате CSV с именем Logfile.CSV в каталоге комплекта аудита.
Далее запускаем скрипт 02_Analyze.bat. Этот скрипт анализирует CSV-файл и выявляет потенциальные уязвимости. Если уязвимость обнаружена, приложение автоматически генерирует код эксплойта для проверки концепции, который можно использовать для демонстрации уязвимости.
Рисунок 3. Второй скрипт фактически пытается использовать обнаруженные потенциальные уязвимости.
После завершения в командной строке, оставленной сценарием открытой, должно быть указано, какие приложения были успешно взломаны. Для каждого эксплойтного приложения скрипт создаст подкаталог в каталоге эксплойтов. Эти подкаталоги на самом деле содержат рабочие эксплойты для уязвимых приложений. В окопах эти эксплойты будут делать неприятные вещи, такие как запуск командных оболочек и прослушивателей черного хода. Это всего лишь доказательство концептуальных эксплойтов, поэтому они запускают calc.exe, чтобы продемонстрировать, что уязвимость существует.
Имея эту информацию, вы сможете определить, используете ли вы какие-либо уязвимые приложения. На этом раннем этапе игры, если вы используете Windows, вы ОБНАРУЖИТЕ уязвимости, так как некоторые из них все еще не исправлены. Кроме того, если вы обнаружите какие-либо уязвимые приложения, вам следует проверить, существует ли исправление от поставщика приложения. Если нет, то рекомендуется связаться с поставщиком и предоставить ему код проверки концепции, чтобы он мог работать над патчем. Даже если они уже знают об уязвимости, напоминание, безусловно, не повредит и может ускорить процесс.
Предотвращение атаки
Пока вы ждете программных исправлений, вы можете сделать несколько вещей, чтобы ограничить свою подверженность атакам с перехватом DLL.
Разверните исправление CWDIllegalInDllSearch
Первоначальным ответом Microsoft на этот класс уязвимостей было предоставление модификации реестра, которая помогает смягчить атаку, изменяя принцип работы динамической загрузки DLL. Исправление следует развертывать очень осторожно, так как оно потенциально может нарушить функциональность установленных приложений, но его стоит протестировать, если вас беспокоит этот вектор атаки. Вы можете прочитать об исправлении здесь.
Блокировать исходящий SMB на периметре
Большинство организаций должны уже делать это, но если вы этого не сделаете, то сейчас самое время начать. Это также поможет предотвратить несколько других типов атак.
Удалите уязвимое программное обеспечение
Это может быть не всегда осуществимо, но если вы используете уязвимое приложение, которое легко заменить, то безопасным способом будет переключиться.
Развертывание программного обеспечения для обнаружения вторжений
В некоторых случаях вы просто не сможете должным образом смягчить атаку. В результате лучшее, на что вы можете надеяться, — это поймать злоумышленника во время постэксплуатации. Использование чего-то вроде Snort является бесплатным (за вычетом стоимости оборудования) и действительно хорошо справляется с обнаружением сигнатур действий после эксплуатации, которые могут возникнуть после того, как кто-то воспользовался уязвимой машиной.
Вывод
Появление такого большого количества уязвимостей, связанных с перехватом DLL, представляет собой интересный сценарий, потому что его нелегко исправить с помощью исправления операционной системы, и это затрагивает так много широко используемых приложений. Лучшее, что вы действительно можете сделать, это убедиться, что вы хорошо осведомлены и осведомлены о том, как работает уязвимость, как проверить, существует ли она в приложениях, работающих в вашей сети, и как предоставить правильную информацию людям, которые могут выпустить исправление для почини это. На этот раз нам всем предстоит сыграть роль исследователя уязвимостей системы безопасности.