Драйвера Windows - источник зла DigitalScream Xakep, номер #062, стр. 062-068-1 (digitalscream@real.xakep.ru) Атаки на драйвера в 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. |