Беззащитная защита?
Типы уязвимостей
Взаимодействие с драйвером
Диспетчер ввода-вывода
Диспетчер ввода-вывода
I/O Control Code
Методы ввода-вывода
Уязвимости в реализации
Проверка указателей
Другие уязвимости в реализации
Уязвимость типа double-fetch
Ошибки при парсинге PE-файлов в антируткитах
Протестированные утилиты
Уязвимость MS08-025
Системы безопасности и уязвимости в архитектуре
Типы уязвимостей по методу эксплуатации
Эксплуатация перезаписи памяти
Шлюз прерывания
Шлюз вызова
HalDispatchTable и уязвимости обнуления памяти
Эксплуатация уязвимости обнуления памяти
Классические уязвимости
Неэксплуатируемые уязвимости
Payload
Повышение привилегий
IOCTL Fuzzer
Уязвимые продукты
118.50K
Categories: internetinternet programmingprogramming

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

1. Беззащитная защита?

eSage lab
Беззащитная защита?
Уязвимости в драйверах режима ядра
Олексюк Дмитрий
[email protected]
www.esagelab.ru

2. Типы уязвимостей

eSage lab
Типы уязвимостей
• Уязвимости в реализации
– При обработке IOCTL запросов
– При обработке control flow данных
– При обработке данных из общесистемных
ресурсов
• Уязвимости в архитектуре
www.esagelab.ru

3. Взаимодействие с драйвером

eSage lab
Взаимодействие с драйвером
Диспетчер ввода-вывода
LPC
Named Pipes
Более сложные механизмы
www.esagelab.ru

4. Диспетчер ввода-вывода

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

5. Диспетчер ввода-вывода

eSage lab
Диспетчер ввода-вывода
www.esagelab.ru

6. I/O Control Code

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

7. Методы ввода-вывода

eSage lab
Методы ввода-вывода
• METHOD_BUFFERED
– Проверка указателей выполняется диспетчером
– Данные копируются в не подкачиваемый пул
– Самый безопасный но достаточно ресурсоёмкий
• METHOD_IN_DIRECT (METHOD_OUT_DIRECT)
– Проверка указателей выполняется диспетчером
– Для входных (выходных) данных создаётся MDL
• METHOD_NEITHER
– Указатели передаются драйверу «as is»
– Самый быстрый но нуждающийся в дополнительных
проверках безопасности
www.esagelab.ru

8. Уязвимости в реализации

eSage lab
Уязвимости в реализации
• Неверная проверка указателей
• Неверная проверка размера данных
• Неверная проверка формата данных
www.esagelab.ru

9. Проверка указателей

eSage lab
Проверка указателей
• User Mode адреса
– MM_HIGHEST_USER_ADDRESS
– MmUserProbeAddress
– ProbeForRead() и ProbeForWrite()
• Kernel Mode адреса
– MmIsAddressValid()
www.esagelab.ru

10. Другие уязвимости в реализации

eSage lab
Другие уязвимости в реализации
• Выход за границу буфера при обработке
строк
– При вызове strlen, strcpy, итд.
• Запись по неверному Kernel Mode адресу
– Как результат уязвимости в архитектуре
• Некорректные дескрипторы
– NtClose() -> INVALID_KERNEL_HANDLE
• Double-fetch уязвимости
– Пример: уязвимость MS08-061 в win32k.sys
www.esagelab.ru

11. Уязвимость типа double-fetch

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

12. Ошибки при парсинге PE-файлов в антируткитах

eSage lab
Ошибки при парсинге PE-файлов
в антируткитах
1. Поиск ядра в записях списка загруженных
системных модулей
2. Копирование оригинального файла
3. Модификация копии ядра
4. Подмена пути в LDR_DATA_TABLE_ENTRY
www.esagelab.ru

13. Протестированные утилиты

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

14. Уязвимость MS08-025

eSage lab
Уязвимость MS08-025
• Call Stack
– win32k!NtUserMessageCall(…, lParam=Buffer,
xParam=StringSize, …)
– win32k!NtUserfnOUTSTRING()
– nt!ProbeForWrite()
• Возможность обнуления произвольного байта
в Kernel Mode памяти
www.esagelab.ru

15. Системы безопасности и уязвимости в архитектуре

eSage lab
Системы безопасности и
уязвимости в архитектуре
• Необходимо препятствовать получению
дескриптора устройства со стороны
потенциально злонамеренного кода
– Фильтрация IRM_MJ_CREATE
– Перехват NtCreateFile/NtOpenFile
– Препятствие копированию дескриптора
• Перехват NtDuplicateHandle
• Препятствие открытию процесса
www.esagelab.ru

16. Типы уязвимостей по методу эксплуатации

eSage lab
Типы уязвимостей по методу
эксплуатации
Перезапись памяти
Обнуление памяти
Переполнение пула
Переполнение стека
www.esagelab.ru

17. Эксплуатация перезаписи памяти

eSage lab
Эксплуатация перезаписи памяти
• Модификация IDT
• Модификация GDT
• Эксплуатация методом перезаписи адреса
обработчика системного вызова в
KiServiceTable не надёжна
www.esagelab.ru

18. Шлюз прерывания

eSage lab
Шлюз прерывания
Offset High и Offset Low
Segment Selector
P (Present)
DPL (Descriptor Privileges Level)
D (16/32 bit)
www.esagelab.ru

19. Шлюз вызова

eSage lab
Шлюз вызова
• Type (1100b – 32-bit call gate)
• Parameters Count
www.esagelab.ru

20. HalDispatchTable и уязвимости обнуления памяти

eSage lab
HalDispatchTable и уязвимости
обнуления памяти
• Call Stack
– nt!NtQueryInternalProfile()
–nt!KeQueryInternalProfile()
–hal!HalQuerySystemInformation()
www.esagelab.ru

21. Эксплуатация уязвимости обнуления памяти

eSage lab
Эксплуатация уязвимости
обнуления памяти
1. Поиск адреса HalDispatchTable и др.
функций
2. Выделение памяти по 0x00000000
3. Затирание нулём указателя на
HalQuerySystemInformation
4. Вызов NtQueryInternalProfile
5. Замена указателя
HalQuerySystemInformation на заглушку
www.esagelab.ru

22. Классические уязвимости

eSage lab
Классические уязвимости
• Переполнение Пула
– Сводится к эксплуатации уязвимости
перезаписи памяти
• Переполнение стека
– Нет необходимости копирования шеллкода
на стек
– Нет проверки целостности стека
– Эксплуатировать очень легко
www.esagelab.ru

23. Неэксплуатируемые уязвимости

eSage lab
Неэксплуатируемые уязвимости
• Чтение по некорректному адресу памяти
• Ошибки связанные с некорректными
дескрипторами
• Ошибки связанные с внезапным
завершением процесса
www.esagelab.ru

24. Payload

eSage lab
Payload
• Снятие перехватов
• Запуск произвольного кода в Ring 0
• Повышение привилегий
www.esagelab.ru

25. Повышение привилегий

eSage lab
Повышение привилегий
1. Получение указателя на EPROCESS
системного процесса
2. Получение указателя на EPROCESS
целевого процесса
3. Копирование значение поля AccessToken
www.esagelab.ru

26.

eSage lab
www.esagelab.ru

27. IOCTL Fuzzer

eSage lab
IOCTL Fuzzer
• Фаззинг IOCTL запросов с любыми методами
ввода-вывода
• Логирование информации о запросах
(включая данные) в файл или окно консоли
• Фильтрация IOCTL запросов




По имени устройства
По имени драйвера
По имени процесса
По I/O Control Code
www.esagelab.ru

28.

eSage lab
www.esagelab.ru

29. Уязвимые продукты

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
English     Русский Rules