Резюме:
Была обнаружена
серьезная дыра в системе безопасности во
многих драйверах Windows NT/2000. Суть состоит в
неправильном разборе символов строки
функцией отладки, которая используется в
большинстве Виндозных драйверов. Это может
вызвать переполнение внутреннего буфера,
которое в свою очередь может привести к
чему угодно, начиная от исполнения
произвольного кода и заканчивая ДОС атакой
(синий экран). Это особенно опасно, если
драйвера запущены с высокими привилегиями.
Детали:
Многие драйверы NT
потенциально уязвимы к "format string bug". Эта
проблема связана с функцией DbgPrint, которая
используется для отладочных мессаг.
Некоторые драйвера используют
дополнительные вторичные функции, вместо
того, чтобы использовать эту функцию
напрямую. Эти функции добавляют префикс к
выведенной строке, форматируют строки и
передают окончательную строку до DbgPrint. DbgPrint
дальше так же форматирует строку по своему
усмотрению. Все это выглядит примерно так:
void DebugMessage(const char * format, ...)
{
char buf[1024];
int outLen;
ULONG PrefLen;
va_list argptr;
strcpy(buf, "DriverName: ");
PrefLen = strlen(buf);
va_start( argptr, format );
outLen = _vsnprintf( buf+PrefLen, sizeof(buf)-PrefLen, format, argptr );
va_end( argptr );
DbgPrint(buf);
}
Как видно, все это похоже
практически на неуязвимый код. Но только до
тех пор, пока управление не передается DbgPrint.
Поэтому, можно сделать так:
DebugMessage("MajorFunction = %d, filename
= "%-*S\n", CurrentLocation->MajorFunction, FileObject->FileName.
Length, FileObject->FileName.Buffer);
Все драйвера, которые
используют подобную технику и сохраняют
мессаги дебага потенциально уязвимы к
форматированию поведения строки. Последние
исследования показывают, что, к сожалению,
большинство драйверов используют это.
Например, виндозный драйвер isapnp.sys
использует такую передачу.
Этот баг очень опасен,
потому что он может привести к залезанию в
память ядра. Демонстрация (ниже) работы бага
показывает, как с помощью оного и маленькой
проги можно пропатчить ядро. Эксплоит
позволяет обходить проверку системы
безопасности, что приводит к тому, что любой
юзверь может получить доступ к любому файлу,
к установке и запуску драйверов и т.д.
Демонстрация:
Для дублирования
проблемы, сделайте следующее:
- Войдите как администратор.
- Распакуйте fsedemo.zip
- Запустите install.bat,
который скопирует драйвер fse1.sys в %SystemRoot%\system32\drivers.
Зарегистрируйтесь и запустите драйвер. - Запустите fsetest.exe и
следите за его отчетами. - Войдите, как
обыкновенный юзер. - Попробуйте открыть
файлы, которые раньше могли открывать
только админы.
Не забудьте удалить
драйвер после теста! Это можно сделать,
запустив uninstall.bat.
Скачать демо можно тут: FSADemo.zip