Беззащитная защита. Часть 2: Уязвимости в драйверах режима

advertisement
eSage lab
Беззащитная защита?
Уязвимости в драйверах режима ядра
Олексюк Дмитрий
dmitry@esagelab.ru
www.esagelab.ru
eSage lab
Типы уязвимостей
• Уязвимости в реализации
– При обработке IOCTL запросов
– При обработке control flow данных
– При обработке данных из общесистемных
ресурсов
• Уязвимости в архитектуре
www.esagelab.ru
eSage lab
Взаимодействие с драйвером
•
•
•
•
Диспетчер ввода-вывода
LPC
Named Pipes
Более сложные механизмы
www.esagelab.ru
eSage lab
Диспетчер ввода-вывода
• Создание устройства
– \Device\MyControlDevice
• Создание символьной ссылки
– \\.\MyControlDevice
• Регистрация IRP обработчиков
–
–
–
–
IRP_MJ_CREATE
IRP_MJ_CLOSE
IRP_MJ_READ/ IRP_MJ_WRITE
IRP_MJ_DEVICE_CONTROL
www.esagelab.ru
eSage lab
Диспетчер ввода-вывода
www.esagelab.ru
eSage lab
I/O Control Code
• Device Type (16-31 биты)
• Access (14-16 биты)
– FILE_READ_ACCESS
– FILE_WITE_ACCESS
– FILE_ANY_ACCESS
• Function (2-14 биты)
• Method (0-2 биты)
www.esagelab.ru
eSage lab
Методы ввода-вывода
• METHOD_BUFFERED
– Проверка указателей выполняется диспетчером
– Данные копируются в не подкачиваемый пул
– Самый безопасный но достаточно ресурсоёмкий
• METHOD_IN_DIRECT (METHOD_OUT_DIRECT)
– Проверка указателей выполняется диспетчером
– Для входных (выходных) данных создаётся MDL
• METHOD_NEITHER
– Указатели передаются драйверу «as is»
– Самый быстрый но нуждающийся в дополнительных
проверках безопасности
www.esagelab.ru
eSage lab
Уязвимости в реализации
• Неверная проверка указателей
• Неверная проверка размера данных
• Неверная проверка формата данных
www.esagelab.ru
eSage lab
Проверка указателей
• User Mode адреса
– MM_HIGHEST_USER_ADDRESS
– MmUserProbeAddress
– ProbeForRead() и ProbeForWrite()
• Kernel Mode адреса
– MmIsAddressValid()
www.esagelab.ru
eSage lab
Другие уязвимости в реализации
• Выход за границу буфера при обработке
строк
– При вызове strlen, strcpy, итд.
• Запись по неверному Kernel Mode адресу
– Как результат уязвимости в архитектуре
• Некорректные дескрипторы
– NtClose() -> INVALID_KERNEL_HANDLE
• Double-fetch уязвимости
– Пример: уязвимость MS08-061 в win32k.sys
www.esagelab.ru
eSage lab
Уязвимость типа double-fetch
case IOCTL_PROCESS_DATA:
{
if (stack->Parameters.DeviceIoControl.InputBufferLength == sizeof(REQUEST_BUFFER))
{
PREQUEST_BUFFER Buff = (PREQUEST_BUFFER)Irp->AssociatedIrp.SystemBuffer;
UCHAR Data[BUFFER_SIZE];
if (Buff->Size <= sizeof(Data))
{
BOOLEAN bOk = FALSE;
__try
{
ProbeForRead(Buff->Data, Buff->Size, 1);
bOk = TRUE;
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
// ProbeForRead вызвала исключение
}
if (bOk)
{
RtlCopyMemory(Data, Buff->Data, Buff->Size);
// обработка полученых данных
}
}
}
break;
}
www.esagelab.ru
eSage lab
Ошибки при парсинге PE-файлов
в антируткитах
1. Поиск ядра в записях списка загруженных
системных модулей
2. Копирование оригинального файла
3. Модификация копии ядра
4. Подмена пути в LDR_DATA_TABLE_ENTRY
www.esagelab.ru
eSage lab
Протестированные утилиты
• Rootkit Unhooker 4.6.520.1010
– Абсолютно корректная работа
• Safe’n’Sec Rootkit Detector 1.0.0.1
– BSoD
• GMER 1.0.14.14116
– Аварийное завершение процесса gmer.exe
• IceSword 1.2.2.0
– Завершение процесса с ошибкой
www.esagelab.ru
eSage lab
Уязвимость MS08-025
• Call Stack
– win32k!NtUserMessageCall(…, lParam=Buffer,
xParam=StringSize, …)
– win32k!NtUserfnOUTSTRING()
– nt!ProbeForWrite()
• Возможность обнуления произвольного байта
в Kernel Mode памяти
www.esagelab.ru
eSage lab
Системы безопасности и
уязвимости в архитектуре
• Необходимо препятствовать получению
дескриптора устройства со стороны
потенциально злонамеренного кода
– Фильтрация IRM_MJ_CREATE
– Перехват NtCreateFile/NtOpenFile
– Препятствие копированию дескриптора
• Перехват NtDuplicateHandle
• Препятствие открытию процесса
www.esagelab.ru
eSage lab
Типы уязвимостей по методу
эксплуатации
•
•
•
•
Перезапись памяти
Обнуление памяти
Переполнение пула
Переполнение стека
www.esagelab.ru
eSage lab
Эксплуатация перезаписи памяти
• Модификация IDT
• Модификация GDT
• Эксплуатация методом перезаписи адреса
обработчика системного вызова в
KiServiceTable не надёжна
www.esagelab.ru
eSage lab
Шлюз прерывания
•
•
•
•
•
Offset High и Offset Low
Segment Selector
P (Present)
DPL (Descriptor Privileges Level)
D (16/32 bit)
www.esagelab.ru
eSage lab
Шлюз вызова
• Type (1100b – 32-bit call gate)
• Parameters Count
www.esagelab.ru
eSage lab
HalDispatchTable и уязвимости
обнуления памяти
• Call Stack
– nt!NtQueryInternalProfile()
–nt!KeQueryInternalProfile()
–hal!HalQuerySystemInformation()
www.esagelab.ru
eSage lab
Эксплуатация уязвимости
обнуления памяти
1. Поиск адреса HalDispatchTable и др.
функций
2. Выделение памяти по 0x00000000
3. Затирание нулём указателя на
HalQuerySystemInformation
4. Вызов NtQueryInternalProfile
5. Замена указателя
HalQuerySystemInformation на заглушку
www.esagelab.ru
eSage lab
Классические уязвимости
• Переполнение Пула
– Сводится к эксплуатации уязвимости
перезаписи памяти
• Переполнение стека
– Нет необходимости копирования шеллкода
на стек
– Нет проверки целостности стека
– Эксплуатировать очень легко 
www.esagelab.ru
eSage lab
Неэксплуатируемые уязвимости
• Чтение по некорректному адресу памяти
• Ошибки связанные с некорректными
дескрипторами
• Ошибки связанные с внезапным
завершением процесса
www.esagelab.ru
eSage lab
Payload
• Снятие перехватов
• Запуск произвольного кода в Ring 0
• Повышение привилегий
www.esagelab.ru
eSage lab
Повышение привилегий
1. Получение указателя на EPROCESS
системного процесса
2. Получение указателя на EPROCESS
целевого процесса
3. Копирование значение поля AccessToken
www.esagelab.ru
eSage lab
www.esagelab.ru
eSage lab
IOCTL Fuzzer
• Фаззинг IOCTL запросов с любыми методами
ввода-вывода
• Логирование информации о запросах
(включая данные) в файл или окно консоли
• Фильтрация IOCTL запросов
–
–
–
–
По имени устройства
По имени драйвера
По имени процесса
По I/O Control Code
www.esagelab.ru
eSage lab
www.esagelab.ru
eSage lab
Уязвимые продукты
•
•
•
•
•
•
•
•
Kaspersky Internet Security (kl1.sys)
Defence Wall (dwall.sys)
Avira Premium Security (avgntflt.sys)
BitDefender Total Security 2009 (bdfndisf.sys)
ZoneAlarm Security Suite (srescan.sys)
Panda Global Protection 2009 (APPFLT.SYS)
Internet Security 2009 (fsdfw.sys)
И другие…
www.esagelab.ru
Download