Анализ уязвимостей драйверов

Содержание

Слайд 2

Драйверы часто встречаются в

Антивирусах – доступ к файловой системе, перехват системных функций
Межсетевых

Драйверы часто встречаются в Антивирусах – доступ к файловой системе, перехват системных
экранах – низкоуровневый доступ к сетевому интерфейсу, перехват пакетов
ПО для виртуализации – низкоуровневый доступ к аппаратному обеспечению
Эмуляторах - низкоуровневый доступ к аппаратному обеспечению
Криптосистемах - низкоуровневый доступ к аппаратному обеспечению

Слайд 3

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

GUI

NTDLL.DLL

I/O manager

Driver

Kernel space

User space

Режим ядра

Пользовательский режим

NtDeviceIoControlFile

Kernel32.dll

DeviceIoControl

Взаимодействие GUI NTDLL.DLL I/O manager Driver Kernel space User space Режим ядра

Слайд 4

Функция DeviceIoControl

Параметры
hDevice – описатель устройства
dwIoControlCode - управляющий код ввода-вывода
lpInBuffer – указатель на

Функция DeviceIoControl Параметры hDevice – описатель устройства dwIoControlCode - управляющий код ввода-вывода
буфер с входными данными
nInBufferSize - размер входного буфера в байтах
lpOutBuffer - указатель на буфер с выходными данными
nOutBufferSize - размер выходного буфера в байтах
lpBytesReturned - количество байт, скопированных в выходной буфер
lpOverlapped - указатель на структуру OVERLAPPED

Слайд 5

Информация закодированная в dwIoControlCode

Метод передачи данных – способ передачи входных данных
Идентификатор функции

Информация закодированная в dwIoControlCode Метод передачи данных – способ передачи входных данных
– идентификатор функции будущей запущенной драйвером
Доступ к устройству – права доступа к устройству
Тип устройства – тип устройства

Слайд 6

Методы передачи входных данных

METHOD_BUFFERED
METHOD_IN_DIRECT
METHOD_OUT_DIRECT
METHOD_NEITHER

Методы передачи входных данных METHOD_BUFFERED METHOD_IN_DIRECT METHOD_OUT_DIRECT METHOD_NEITHER

Слайд 7

Метод: METHOD_BUFFERED

Проверка входных параметров функциями ProbeForRead, ProbeForWrite
I/O manager выделяет память в пространстве

Метод: METHOD_BUFFERED Проверка входных параметров функциями ProbeForRead, ProbeForWrite I/O manager выделяет память
ядра
Объём – максимальный из длин входных и выходных данных
Копирует данные входного буфера в выделенную память

Слайд 8

Метод: METHOD_IN_DIRECT, METHOD_OUT_DIRECT

Проверка входных параметров функциями ProbeForWrite, ProbeForRead
I/O manager выделяет память в

Метод: METHOD_IN_DIRECT, METHOD_OUT_DIRECT Проверка входных параметров функциями ProbeForWrite, ProbeForRead I/O manager выделяет
пространстве ядра
Объём – длина входного буфера
Копирует данные входного буфера в выделенную память
I/O manager создаёт MDL для доступа к входному/выходному буферу

Слайд 9

Метод: METHOD_NEITHER

I/O manager передаёт указатели на данные без какой-либо проверки
Отсутствуют проверки ProbeForRead,

Метод: METHOD_NEITHER I/O manager передаёт указатели на данные без какой-либо проверки Отсутствуют
ProbeForWrite
Все проверки достоверности данных должны выполняться в коде драйвера
Потенциально небезопасный метод

Слайд 10

Функции ProbeForRead, ProbeForWrite

Параметры:
Address –указатель на буфер памяти пользовательского режима
Length – длина в

Функции ProbeForRead, ProbeForWrite Параметры: Address –указатель на буфер памяти пользовательского режима Length
байтах
Alignment – выравнивание буфера в байтах
Проверяют диапазон (Address+Length) на нахождение в пользовательском адресном пространстве
Проверяют адрес на соответствие выравниванию
Проверяют аттрибут чтения/записи

Слайд 11

Обход функций ProbeForRead, ProbeForWrite

При длине равной нулю, не вызывает исключения, и не

Обход функций ProbeForRead, ProbeForWrite При длине равной нулю, не вызывает исключения, и
выполняет никаких проверок
Обход всех проверок при длине равной нулю описан только в блоге Microsoft Security Research and Defense, ms08-025 уязвимости win32k.sys http://blogs.technet.com/srd/archive/2008/04/09/ms08-025-win32k-vulnerabilities.aspx
Отсутствие данной информации в msdn!!!

Слайд 12

Типичные уязвимости

METHOD_NEITHER
Arbitrary kernel memory write
NULL pointer dereference
METHOD_BUFFERED
Buffer overflows
NULL pointer dereference
METHOD_IN_DIRECT, METHOD_OUT_DIRECT
Buffer overflows
NULL

Типичные уязвимости METHOD_NEITHER Arbitrary kernel memory write NULL pointer dereference METHOD_BUFFERED Buffer
pointer dereference

Слайд 13

Методология поиска уязвимостей

Fuzzing тестирование без предварительной информации о коде драйвера
Fuzzing+мониторинг информация о

Методология поиска уязвимостей Fuzzing тестирование без предварительной информации о коде драйвера Fuzzing+мониторинг
коде драйвера восстанавливается в процессе тестирования
Ручной анализ тестирование на основе предварительного изучения кода драйвера (дизассемблирование, отладка)

Слайд 14

Fuzzing

Перебор входных параметров DeviceIoControl:
dwIoControlCode - DWORD
lpInBuffer – PVOID
nInBufferSize - DWORD
lpOutBuffer – PVOID
nOutBufferSize

Fuzzing Перебор входных параметров DeviceIoControl: dwIoControlCode - DWORD lpInBuffer – PVOID nInBufferSize
- DWORD

Слайд 15

Fuzzing

ioctl fuzzer

NTDLL.DLL

I/O manager

Driver

Kernel space

User space

Режим ядра

Пользовательский режим

#1 DeviceIoControl
#2 DeviceIoControl
#N DeviceIoControl

CreateFile
(\\.\device)

NtDeviceIoControlFile

Kernel32.dll

Fuzzing ioctl fuzzer NTDLL.DLL I/O manager Driver Kernel space User space Режим

Слайд 16

5 минут работы ioctl fuzzer’a

5 минут работы ioctl fuzzer’a

Слайд 17

Fuzzing: Тестовые наборы

dwIoControlCode - полный перебор
lpInBuffer – NULL, invalid kernel space address
nInBufferSize

Fuzzing: Тестовые наборы dwIoControlCode - полный перебор lpInBuffer – NULL, invalid kernel
– 0, 0 – 0x1000, 0x80000000
lpOutBuffer – NULL, invalid kernel space address
nOutBufferSize - 0, 0 – 0x1000, 0x80000000

Слайд 18

Fuzzing: Плюсы и минусы

Плюсы
Лёгкий в реализации(40 строк C кода)
Неплохие результаты
Минусы
Пропуск уязвимостей, зависящих

Fuzzing: Плюсы и минусы Плюсы Лёгкий в реализации(40 строк C кода) Неплохие
от определённых значений в буфере или от определённой длины

Слайд 19

Fuzzing+мониторинг

Отслеживание прохода для определённого тестового набора данных(Code coverage)
Протоколирование состояний контекста(Data flow)
Протоколирование “падений”
Генерация

Fuzzing+мониторинг Отслеживание прохода для определённого тестового набора данных(Code coverage) Протоколирование состояний контекста(Data
N+1 тестового набора данных

Слайд 20

Windows Kernel

Fuzzing+мониторинг

ioctl fuzzer

Driver

#1 DeviceIoControl

Kernel Debugger

Plugin

1.Log
2.Log
N.log

Code coverage ,
Context state

N+1 testcase

Tracing

Kernel space

User space

#(N+1) DeviceIoControl

Windows Kernel Fuzzing+мониторинг ioctl fuzzer Driver #1 DeviceIoControl Kernel Debugger Plugin 1.Log

Слайд 21

Fuzzing+мониторинг: Плюсы и минусы

Плюсы
Покрытие кода для конкретного тестового набора
Протоколирование найденной уязвимости
Минусы
Сложность реализации

Fuzzing+мониторинг: Плюсы и минусы Плюсы Покрытие кода для конкретного тестового набора Протоколирование

Слайд 22

Ручной анализ

Локализация IOCTL обработчика
Анализ обрабатываемых IOCTL значений
Формирование тестовых наборов
Анализ обработки входных значений

Human
brain

Kernel
Debugger

Windows

Ручной анализ Локализация IOCTL обработчика Анализ обрабатываемых IOCTL значений Формирование тестовых наборов
kernel

Driver

Tracing

By-hand
Analyze

Слайд 23

Ручной анализ: Плюсы и минусы

Плюсы
Нахождение наибольшего количества уязвимостей
Лучший в комбинации с fuzzing

Ручной анализ: Плюсы и минусы Плюсы Нахождение наибольшего количества уязвимостей Лучший в
подходом
Минусы
Трудозатратный, требует больших временных ресурсов

Слайд 24

Статистика протестированных продуктов

Всего в исследовании участвовали 40 продуктов: антивирусы, межсетевые экраны,

Статистика протестированных продуктов Всего в исследовании участвовали 40 продуктов: антивирусы, межсетевые экраны,
виртуальные машины, эмуляторы, криптосистемы.

(22 продукта)

(18 продуктов)

Слайд 25

Количество обнаруженных уязвимостей

Полная
компрометация
системы

Отказ в
обслуживании

Количество обнаруженных уязвимостей Полная компрометация системы Отказ в обслуживании

Слайд 26

Сравнение методов поиска уязвимостей

Сравнение методов поиска уязвимостей

Слайд 27

Пути решения

IoCreateDeviceSecure – безопасное создание устройства(Microsoft, Dr. Web)
PsGetCurrentProcessId – проверка идентификатора процесса(Eset)
KeGetPreviousMode

Пути решения IoCreateDeviceSecure – безопасное создание устройства(Microsoft, Dr. Web) PsGetCurrentProcessId – проверка
– проверка из какого адресного пространства пришёл вызов(Kaspersky)
Hook NtCreateFile, NtDeviceIoControlFile – перехват функций взаимодействия(Tall Emu)

Слайд 28

Выводы

Тестирование драйверов в большинстве компаний не проводится
Большое количество уязвимостей, которые можно быстро

Выводы Тестирование драйверов в большинстве компаний не проводится Большое количество уязвимостей, которые
обнаружить и исправить
Исправление такого типа уязвимостей в некоторых случаях занимает более 150(!!!) дней

Слайд 29

Welcome!

http://www.securitylab.ru/lab/

Welcome! http://www.securitylab.ru/lab/

Слайд 30

Будущие исследования

Полные результаты исследования и детальная информация по методам поиска уязвимостей будут

Будущие исследования Полные результаты исследования и детальная информация по методам поиска уязвимостей
опубликованы на сайте компании Positive Technologies в разделе "Аналитика" www.ptsecurity.ru/analytics.asp
Race condition уязвимости : скрытые опасности METHOD_NEITHER, METHOD_BUFFERED
Доработка методов автоматического поиска уязвимостей, публикация исходных кодов ioctl fuzzer’a

Слайд 31

Никита Тараканов [email protected]

Вопросы?

Никита Тараканов ntarakanov@ptsecurity.com Вопросы?

Слайд 32

PT Research Team

Раздел "Лаборатория" www.securitylab.ru/lab на портале SecurityLab публикует уязвимости, обнаруженные в

PT Research Team Раздел "Лаборатория" www.securitylab.ru/lab на портале SecurityLab публикует уязвимости, обнаруженные
программном и аппаратном обеспечении. Реализацию этой задачи осуществляют эксперты компании Positive Technologies, входящие в состав Positive Technologies Research Team
Имя файла: Анализ-уязвимостей-драйверов.pptx
Количество просмотров: 37
Количество скачиваний: 0