ВСЁ О ЖЕЛЕЗЕ

Атаки на драйвера в Windows
Продолжая тему о повышении привилегий в локальной Win32 системе, нельзя не упомянуть о возможности использования для этих целей драйверов. Эта атака довольно нова и поэтому далеко не всем знакома, хотя по своей функциональности она не уступает ни одной другой локальной уязвимости.

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

Так или иначе, чтобы понимать суть проблемы, необходимо для начала уяснить некоторые теоретические вопросы.

Драйвера Windows

В ОС Windows драйвер - это динамически подгружаемый модуль, используемый для взаимодействия операционной системы с физическим устройством. Таким устройством может быть клавиатура, мышь, дисплей и т.д. Другими словами, если ОС (или любому другому приложению) требуется считать данные с клавиатуры, то она запрашивает их у программы, а не напрямую обращается к устройству. Такие программы предоставляют определенный набор команд и написаны под конкретную модель устройства.

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

Хочу также заметить, что понятия драйвера в Windows 9x и в Windows NT существенно отличаются, но в данном случае нас интересует второй вариант. Кроме этого, в ранних ОС Windows понятие "привилегии пользователя" отсутствовало вообще, поэтому не имеет смысла рассматривать драйвера Windows 9x.

Многие продукты из-за необходимости прямого доступа к аппаратной части поставляются со своими драйверами. Цели могут быть разными: от оптимизации работы до создания условий безопасного обмена данными с устройством. Зачастую к таким методам прибегают разработчики антивирусного ПО. Используя свои драйвера, они получают информацию о размерах файлов, дате их последней модификации и т.д.

Общение с драйвером

На самом деле ничего сложного в этой технологии нет. И при желании ты легко сможешь создать свой драйвер (правильнее будет сказать шлюз), используя который можно добиться более высокой производительности. Для общения с драйверами существует API функция DeviceIoControl:

Описание DeviceIoControl

BOOL DeviceIoControl(

HANDLE hDevice,

DWORD dwIoControlCode,

LPVOID lpInBuffer,

DWORD nInBufferSize,

LPVOID lpOutBuffer,

DWORD nOutBufferSize,

LPDWORD lpBytesReturned,

LPOVERLAPPED lpOverlapped

);

При обращении к устройству его имя следует указать согласно UNC стандарту. И если все параметры функции заполнены правильно, то после ее исполнения переменная lpOutBuffer будет хранить ответ устройства. На практике для подключения к драйверу сперва необходимо узнать его дескриптор. Его можно получить, используя функцию CreateFile.

На этом пора остановиться и взглянуть на ситуацию со стороны. Функция CreateFile создана для открытия файлов. Говоря о файлах, я имею в виду все их проявления в ОС Windows: каналы, устройства, физические диски, директории и собственно файлы. Ее параметры формируются следующим образом:

Структура CreateFile

HANDLE CreateFile(

LPCTSTR lpFileName,

DWORD dwDesiredAccess,

DWORD dwShareMode,

LPSECURITY_ATTRIBUTES lpSecurityAttributes,

DWORD dwCreationDisposition,

DWORD dwFlagsAndAttributes,

HANDLE hTemplateFile

);

Подключаясь к устройству, приложение может само устанавливать настройки безопасности при работе с файлом. Среди таких настроек можно найти и флаг, отвечающий за создание эксклюзивного доступа к устройству. Это значит, что существует возможность блокировки одновременного доступа к устройству нескольким приложениям. И эксперты Microsoft подтвердили этот факт в своей официальной документации. Также было замечено, что это необходимая возможность, помогающая повысить безопасность продукта.

Так или иначе, практически ни одно из приложений для Windows, использующих драйвера, не юзает предоставленную возможность. Как следствие, это позволяет злоумышленнику подключится к необходимому устройству.

Внедрение shellcode

Определить в таких случаях вектор атаки довольно просто. Поскольку, обращаясь к драйверу, его ответ можно получить из переменной lpOutBuffer. Но не стоит забывать, что lpOutBuffer - это только адрес, указывающий на ответ. Так как драйвер имеет системные права, он может передать ответ практически в любую область памяти. Куда именно, указывает переменная lpOutBuffer. Таким образом, злоумышленник может контролировать память и тем самым внедрить туда свой эксплойт.

Но не стоит забывать о том, что разные драйвера работают с разными данными. Это значит, что один из них может принимать в качестве аргумента lpOutBuffer число, а другой – целую структуру. Поэтому часто злоумышленник вынужден разбираться в программном коде драйвера, чтобы понять, с какими структурами он имеет дело, как они обрабатываются и сохраняются. Во всем этом придется разбираться при написании эксплойта. Дело в том, что, передавая на устройство какую-либо информацию, игнорируя все его стандарты, можно легко вызвать критическое завершение работы драйвера.

Основная проблема при эксплуатации этой уязвимости – передача управления на shellcode (опять-таки придется разбирать драйвер). А раз этого не избежать, то мы примемся за Reverse-engineering.

Пример атаки

На данный момент практически не существует эксплойтов, реализующих подобную атаку. А версии тех программ, в которых были найдены уязвимости, мне так и не удалось разыскать. Но, тем не менее, я постараюсь объяснить принцип атаки. Поскольку атаки нацелены на драйвера, то искать необходимо именно их. Это довольно легко осуществить на практике. Как пример, я покажу этот процесс для Zone Alarm.

Первое, что необходимо определить – какие процессы запускает приложение, к чему обращается и т.д. Немного покопав Process Viewer’ом, можно выйти на след библиотеки VSMON.DLL. В диспетчере задач сразу бросается в глаза то, что она имеет права системы. Нетрудно догадаться, что это сервис, и, скорее всего, именно он и общается с драйвером.

Все сомнения по поводу правильности этой теории исчезают, как только заглядываешь в панель управления. В разделе Администрирование -> Службы необходимо отыскать имя этой библиотеки, после чего в ее свойствах перейти на закладку зависимости. Можно увидеть, что она зависит от какого-то компонента vsdatant. Это и есть тот самый драйвер, использующий Zone Alarm для контролирования сетевой активности приложений.

Второй способ – использование API мониторинга. Дело в том, что для подключения к устройству (имеется в виду драйвер, а не физическое устройство) используется функция CreateFile. А поэтому, отлавливая ее вызовы для определенного приложения, можно узнать, к какому именно устройству оно подключается.

Для обращения к драйверу следует использовать UNC стандарт. Это значит, что при вызове функции CreateFile, в качестве имени файла необходимо указать \\.\vsdatant. Хочу заметить, что удаленное подключение к драйверам невозможно, поэтому атака относится исключительно к локальным.

Следующий этап для атакующего - определение поддерживаемых драйвером операций. Для этого следует воспользоваться API монитором. Его нужно направить на Zone Alarm, причем включить в настройках фильтра только функции для работы с файлами и драйверами.

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

После нескольких минут анализа собирается следующая инфа:

Появившаяся инфа

dwIoControlCode:0x8400000f,

lpInBuffer:0x17a3e3,

nInBufferSize:27,

lpOutBuffer:0x12ee06,

nOutBufferSize:4,

lpBytesReturned:4,

lpOverlapped:0

В этом случае можно предположить, что злоумышленник, используя функцию 0x8400000f, может контролировать 4 байта (переменная nOutBufferSize), передавая на драйвер какие-то данные (структуры).

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

Уже известно, что устройство обрабатывает функцию 0x8400000f, а это значит, что в IDA следует искать именно ее. Для этого нужно воспользоваться поиском (ALT + T).

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

Теперь о передаче управления на shellcode. Принципиальных отличий здесь нет, за исключением одного. На этот раз необходимо искать функции, способные управлять ходом программы. Это могут быть функции, передающие управление на подпрограмму, адрес которой находится в принимаемых данных. Но не стоит забывать о возможности переполнения буфера. Весьма возможно, что разработчик не уделял особого внимания безопасности драйвера. Многие считают это излишеством, но уверяю тебя, это не так. Драйвер, как и любая другая программа, уязвим к такого рода атакам. И возможно, атакующему удастся найти уязвимую функцию, с помощью которой он сможет контролировать работу драйвера.

Дополнительные возможности

Атака на драйвер совсем не обязательно должна преследовать цель повышения привилегий. Вполне возможно, что это просто вывод его из рабочего состояния, вызов аварийного завершения работы ОС или что-нибудь другое. Так, например, если хакер захочет, чтобы при запуске на компьютере Zone Alarm скрывалась его сетевая деятельность, он может просто программно закрыть его, используя подключение к драйверу.

Для примера я написал небольшое приложение Benzinka. Его цель перезапустить систему в случае, если на компьютере запущен брандмауэр Zone Alarm. В этом коде нет ничего особенного. Все, что он делает – это передача «особенных» данных в качестве адреса на результат.

Исходник

#include

int main( int argc, char* argv[] )

{

HANDLE hDevice;

hDevice = CreateFile( "\\\\.\\vsdatant",

0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL );

if ( hDevice == INVALID_HANDLE_VALUE ) return 0;

DeviceIoControl( hDevice, 8400000fh, 0, 0, 12345h, 4, 0, 0 );

return 0;

}

Публичные эксплойты

Насколько мне известно, сейчас доступен только один публичный эксплойт для Norton AntiVirus 2002. Кроме того, чтобы его откомпилировать, хакеру придется проявить свои знания в Assembler. Ошибок в исходном коде более чем достаточно, в придачу и shellcode придется внедрить свой. Поскольку в эксплойте он вообще отсутствует :). Также не стоит забывать, что шеллкод исполняется в драйвере, а поэтому на него накладываются еще несколько дополнительных ограничений.

Для атаки используется драйвер \\.\navap, входящий в поставку вместе с Norton AntiVirus 2002. Атака не отличается от вышеописанного приема. Разница лишь в том, что этот драйвер имеет изъяны в несколько других функциях.

Защита

Защита для пользователя – это отказ от продуктов сторонних производителей. Лично я после написания этой статьи проверил все установленные приложения на эту атаку. Как оказалось, примерно шестая часть программ уязвимы. Такая статистика должна насторожить производителей программного обеспечения.

Разработчикам могу посоветовать устанавливать эксклюзивный доступ на драйвер при подключении к нему. Добавлю еще, что следует обращать внимание на реализацию обработки пользовательских данных. Программисты, пишущие для internet, уже давно осознали это. Теперь осталось донести эту истину и до win32 программистов.

Ссылки

Документация по работе с драйверами

msdn.microsoft.com/library/en-us/devio/base/deviceiocontrol.asp

Эксплойт к Norton AntiVirus 2002

sec-labs.hack.pl/papers/win32ddc.php



Перелом шейки бедра операция стоимость

Лучший софт 2013 года скачать без регистрации

ваз 2108 самоделки