Поделиться через


Тесты на проникновение (основы устройства)

Тесты на проникновение устройств выполняют различные виды входных атак, которые являются критически важным компонентом тестирования безопасности. Тестирование атак и проникновений может помочь выявить уязвимости в интерфейсах программного обеспечения.

Проникновение

Тесты на проникновение включают в себя две категории тестов: тесты нечеткого действия и тесты I/O Spy и I/O Attack . Тесты fuzz также были компонентом средства тестирования Exceriser пути устройства .

Тест Описание

Отключение spy ввода-вывода

Отключите spy ввода-вывода на 1 или более устройствах.

Тестовый двоичный файл: Devfund_IOSpy_DisableSupport.wsc

Метод теста: DisableIoSpy

Параметры: см. раздел Тестовые параметры основы устройства.

DQ

Отображение устройства с поддержкой Spy ввода-вывода

Отображение устройств с включенным шпионом ввода-вывода .

Тестовый двоичный файл: Devfund_IOSpy_DisplayEnabledDevices.wsc

Метод теста: DisplayIoSpyDevices

Включение spy ввода-вывода

Включите I/O Spy на одном или нескольких устройствах.

Тестовый двоичный файл: Devfund_IOSpy_EnableSupport.wsc

Метод теста: EnableIoSpy

Параметры: см. раздел Тестовые параметры основы устройства.

DQ

DFD — указывает путь к файлу данных IoSpy. Расположение по умолчанию — %SystemDrive%\DriverTest\IoSpy.

Тест API Fuzz Misc

Тесты API Fuzz Misc — это тесты, которые определяют, может ли драйвер обрабатывать различные распространенные вызовы из драйверов режима ядра.

Тесты включают в себя следующие тесты:

  • Вызывает ZwReadFile и ZwWriteFile, указывая допустимые указатели буфера данных, разную длину (включая ноль) и различные смещения байтов, включая 0, -1 и 64-разрядные смещения байтов.

  • Вызовы для отмены ввода-вывода и очистки буферов.

  • Серия вызовов запросов к каталогу с использованием общих классов сведений о файлах с допустимыми указателями буфера данных пользователя и различной длиной буфера (включая ноль).

  • Вызовы запросов каталога, аналогичные тем, которые выдаются программами, работающими под управлением виртуальной машины DOS (VDM).

  • Вызывает для получения расширенных атрибутов файла с различными размерами и длиной буфера.

  • Вызывает для создания и закрытия объектов разделов с различными атрибутами защиты страниц раздела и выделения разделов (зафиксированный раздел, раздел файла изображения).

  • Вызовы для блокировки и разблокировки файлов.

  • Вызывает для получения записей квоты для тома.

  • Проверка атрибутов файла — ряд запросов атрибутов файлов с допустимыми указателями на структуру ObjectAttributes .

    Тест атрибутов файла имеет необязательный тест нулевой длины. При получении расширенных атрибутов файла тест fuzz передает драйверу пустой запрос (нулевой длины) и недопустимый адрес буфера.

Тестовый двоичный файл: Devfund_DevicePathExerciser.dll

Метод теста: DoMiscAPITest

Параметры: см. раздел Тестовые параметры основы устройства.

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Нечеткий API Misc с проверкой запроса нулевой длины

Этот тест выполняет те же тесты, что и тест API Fuzz Misc, и на этот раз передает пустой запрос (нулевой длины) и недопустимый адрес буфера драйверу при попытке получить расширенные атрибуты файла.

Тестовый двоичный файл: Devfund_DevicePathExerciser.dll

Метод теста: DoMiscAPIWithZeroLengthTest

Параметры: см. раздел Тестовые параметры основы устройства.

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Тест нечеткого открытия и закрытия

Этот тест выполняет тысячи последовательностей создания, открытия и закрытия.

Подробные сведения об этом тесте см. в разделе Сведения о тесте нечеткого открытия и закрытия.

Тестовый двоичный файл: Devfund_DevicePathExerciser.dll

Метод теста: DoOpenCloseTest

Параметры: см. раздел Тестовые параметры основы устройства.

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Тест нечетких запросов и задания сведений о файле

Этот тест выполняет вызовы для получения и изменения сведений об объектах, файлах и томах устройств.

Во время проверки запросов и задания сведений о файле проблема нечеткого теста вызывает получение и изменение сведений об объектах, файлах и томах устройств, открытых базовыми операциями открытия и другими операциями открытия, включая операции, выполняемые тестом нечетких вложенных открытий.

Тест fuzz выполняет каждый запрос или вызов set не менее 1024 раз с допустимым буфером и различными длинами буфера и классами сведений о файле. Также отправляется один запрос каждого типа с недопустимым указателем буфера и нулевой длиной буфера.

Если вы используете параметр ChangeBufferProtectionFlags , который задает параметр защиты, тест fuzz изменяет параметры безопасности буфера в каждом запросе и вызове set.

Этот тест также выполняет тест нечетких вложенных открытий.

В этом тесте используются функции ZwQueryInformationFile, ZwSetInformationFile, ZwQueryVolumeInformationFile и ZwSetVolumeInformationFile .

Тестовый двоичный файл: Devfund_DevicePathExerciser.dll

Метод теста: DoQueryAndSetFileInformationTest

Параметры: см. раздел Тестовые параметры основы устройства.

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Нечеткий запрос и установка теста безопасности

Этот тест выдает вызовы для получения дескриптора безопасности и изменения состояния безопасности устройств.

Во время запроса и задания теста безопасности тест нечетких вызовов вызывается для получения дескриптора безопасности и изменения состояния безопасности устройств, открытых с помощью базовых открытых операций и других открытых операций, включая операции, выполняемые тестом нечетких вложенных открытий.

Тест fuzz выдает каждый запрос или вызов set не менее 1024 раз с допустимым буфером и различными длинами буферов и типами сведений о безопасности (OWNER_SECURITY_INFORMATION, GROUP_SECURITY_INFORMATION, DACL_SECURITY_INFORMATION, SACL_SECURITY_INFORMATION и без типа информации). Также отправляется один запрос каждого типа с недопустимым указателем буфера и нулевой длиной буфера.

Если вы используете параметр ChangeBufferProtectionFlags , который задает параметр защиты, тест fuzz изменяет параметры безопасности буфера в каждом запросе и вызове set.

Тестовый двоичный файл: Devfund_DevicePathExerciser.dll

Метод теста: DoQueryAndSetSecurityTest

Параметры: см . раздел Параметры теста "Основы устройства".

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Тест нечетких случайных FSCTL / Тест нечеткого случайного IOCTL

Этот тест выполняет ряд вызовов функции DeviceIoControl с кодами функций, типами устройств, методами передачи данных и требованиями к доступу, которые выбираются случайным образом из указанного диапазона значений. Вызовы включают входные и выходные буферы с допустимыми и недопустимыми указателями и длинами буфера, а также случайно созданное содержимое.

Во время случайных тестов нечеткий тест выполняет ряд вызовов функции DeviceIoControl с кодами функций, типами устройств, методами передачи данных и требованиями к доступу, выбранными случайным образом из указанного диапазона значений. Вызовы включают входные и выходные буферы с допустимыми и недопустимыми указателями и длинами буфера, а также случайно созданное содержимое.

Тест нечетких параметров выполняет случайные тесты на всех устройствах, открытых во время базовых открытых операций и дополнительных открытых тестов. Этот тест можно настроить с помощью следующих параметров:

  • Используйте MinFunctionCode и MaxFunctionCode , чтобы указать диапазон кодов функций IOCTL или FSCTL, используемых в вызовах.

  • Используйте MinDeviceType и MaxDeviceType , чтобы указать диапазон типов устройств, используемых в вызовах.

  • Используйте SeedNumber , чтобы указать начальное число для процедуры создания случайного числа.

Функция, которую тест fuzz использует для создания случайных чисел для теста, использует начальное число, начальное число для алгоритма создания случайных чисел. Чтобы воспроизвести условия теста, используйте параметр начального номера , чтобы указать начальный номер, который использовался в исходной тестовой пробной версии.

Специализированный случайный тест включается в состав случайного теста. Специализированный случайный тест использует результаты случайного теста для более подробного изучения ответов драйверов на запросы IOCTL или FSCTL. Специализированные случайные пробы тестируют области, пропущенные случайным тестом, и области, на которые драйвер не ответил должным образом на основе состояния, возвращаемого случайными тест-вызовами.

Тестовый двоичный файл: Devfund_DevicePathExerciser.dll

Методы тестирования: DoRandomIOCTLTest, DoRandomFSCTLTest

Параметры: см . раздел Параметры теста "Основы устройства".

MinInBuffer

MaxInBuffer

MinOutBuffer

MaxOutBuffer

MaxRandomCalls

MaxTailoredCalls

SeedNumber

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Тест нечетких вложенных открытий

Тест выполняет быструю серию вызовов для открытия объектов в пространстве имен устройства. В этих вызовах он передает путь, начинающийся с устройства, и включает произвольные имена и бессмыслицные строки различной длины и содержимого.

Во время относительного открытого теста (также известного как тест подоткрытого) тест нечетких значений пытается открыть объекты в пространстве имен устройства.

Во время этого теста тест нечетких параметров выполняет быструю серию вызовов для открытия объектов в пространстве имен устройств, открытых с помощью базовых операций открытия и других открытых операций. В этих вызовах тест fuzz проходит путь, который начинается с устройства и включает произвольные имена и невразумительные строки разной длины и содержимого.

Этот тест определяет, как драйвер или файловая система управляет открытыми запросами в своем пространстве имен. В частности, если драйвер не поддерживает открытые запросы в своем пространстве имен, он должен предотвратить несанкционированный доступ либо путем неудачных запросов, либо путем задания характеристики устройства FILE_DEVICE_SECURE_OPEN при использовании IoCreateDevice или IoCreateDeviceSecure для создания объекта устройства.

Дополнительные сведения о пространстве имен устройства см. в разделе Управление доступом к пространству имен устройств.

Тестовый двоичный файл: Devfund_DevicePathExerciser.dll

Метод тестирования: DoSubOpensTest

Параметры: см . раздел Параметры теста "Основы устройства".

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Нечеткий вложенный открывается с тестом потоков

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

Во время тестирования потоков тест нечетких параметров пытается открыть различные именованные потоки данных на устройстве. Тесты используют ряд произвольных имен потоков с содержимым и символами, которые могут быть допустимыми для других вариантов использования на некоторых устройствах. Этот тест определяет, может ли драйвер правильно обрабатывать запросы потока данных, особенно если драйвер экспортирует устройство, которое не поддерживает или не ожидает потоков данных.

Именованный поток данных является атрибутом объекта файла. Именованный поток данных указывается путем записи имени файла, двоеточия и имени потока данных, например "File01.txt:AccessDate", где AccessDate — это именованный поток данных, то есть атрибут файла File01.txt.

Тест "Нечеткое" записывает имена потоков, используемые в тесте.

Тестовый двоичный файл: Devfund_DevicePathExerciser.dll

Метод тестирования: DoSubOpensWithStreamsTest

Параметры: см . раздел Параметры теста "Основы устройства".

DoPoolCheck

DQ

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Тест FSCTL нечеткого Zero-Length буфера или тест IOCTL нечеткого Zero-Length буфера

Этот тест выполняет серию вызовов функции DeviceIoControl с длиной входного и (или) выходного буфера 0. Тест создает различные коды управления файловой системой, используя различные коды функций, типы устройств, методы передачи данных и требования к доступу.

Во время теста буфера Zero-Length тест нечетких данных выполняет серию вызовов функции DeviceIoControl с длиной входного и (или) выходного буфера 0. Тест создает различные коды управления вводом-выводом, используя различные коды функций, типы устройств, методы передачи данных и требования к доступу. Сведения о содержимом кодов элементов управления ввода-вывода см. в разделе Определение кодов элементов управления ввода-вывода.

Чтобы проверить обработку драйвером недопустимых указателей буфера, указатели буфера в этих вызовах пользовательского режима указывают адреса с высоким уровнем в виртуальном адресном пространстве ядра, например 0xFFFFFC00).

Тест нечетких четверок выполняет тест буфера Zero-Length на всех устройствах, открытых во время базовых и дополнительных открытых тестов. Этот тест можно настроить с помощью параметров команд MinFunctionCode и MaxFunctionCode , чтобы указать диапазон кодов функций IOCTL или FSCTL, используемых в вызовах, и MinDeviceType и MaxDeviceType для указания диапазона типов устройств, используемых в вызовах.

Тестовый двоичный файл: Devfund_DevicePathExerciser.dll

Методы тестирования: DoZeroLengthBufferIOCTLTest, DoZeroLengthBufferFSCTLTest

Параметры: см . раздел Параметры теста "Основы устройства".

MinDeviceType

MaxDeviceType

MinFunctionCode

MaxFunctionCode

DoPoolCheck

TestCycles

ChangeBufferProtectionFlags

Impersonate

FillZeroPageWithNull

Атака на выполнение операций ввода-вывода

Выполняет атаку ввода-вывода на указанном устройстве или устройствах.

Тестовый двоичный файл: Devfund_IOAttack_DeleteDataFile.wsc

Метод тестирования: RunIoAttack

Параметры: см . раздел Параметры теста "Основы устройства".

DQ

Сведения о тесте нечеткого открытия и закрытия

Тест нечеткого открытия и закрытия использует несколько различных способов открытия и закрытия экземпляров указанного устройства или устройств: основные операции открытия, операции прямого открытия устройства и тест "Открыть и закрыть".

Основные открытые операции

Во время базовых открытых операций тест fuzz неоднократно открывает (создает) экземпляры указанных устройств или устройств, экспортированных указанным драйвером с помощью различных методов и параметров.

Тест нечетких параметров всегда выполняет основные открытые операции. Их не нужно выбирать, и их нельзя исключить из тестового сеанса.

Тест fuzz выполняет все открытые операции в пользовательском режиме, вызывая системные службы (подпрограммы ZwXxx), соответствующие устройству. Если открытый вызов возвращает дескриптор устройству, тест Fuzz использует дескриптор для выполнения других тестов устройства, выбранных для тестового сеанса.

Существует пять типов базовых открытых операций:

  • Стандартный открытый. Тест fuzz открывает устройство асинхронно и задает только собственное имя устройства.

  • Откройте с добавлением обратной косой черты. Тест нечетких параметров выполняет открытый вызов имени устройства, за которым следует обратная косая черта (), например \device\cdrom\, как будто вызов открывает корневой каталог на устройстве.

    Эта операция определяет, как драйвер или файловая система управляет открытыми запросами в своем пространстве имен. В частности, если устройство не поддерживает открытые запросы в своем пространстве имен, драйвер должен предотвратить несанкционированный доступ либо путем сбоя запросов, либо путем задания характеристики устройства FILE_DEVICE_SECURE_OPEN при вызове IoCreateDevice или IoCreateDeviceSecure для создания объекта устройства.

  • Откройте как именованный канал. Тест нечетких данных открывает устройство и устанавливает именованный канал к устройству. Параметр доступа (ShareAccess) изначально задан для чтения и записи, но корректируется в случае сбоя запроса. Если устройство не поддерживает именованные каналы, запрос должен завершиться ошибкой.

  • Откройте как почтовый слоот. Тест нечетких параметров открывает устройство в виде почтового слоя. Если устройство не поддерживает этот тип подключения, запрос должен завершиться ошибкой.

  • Откройте как подключение в виде дерева. Тест "Нечеткое" открывает устройство в виде древовидного подключения для использования при удаленном доступе к сети. Параметр доступа (ShareAccess) изначально задан для чтения и записи, но корректируется в случае сбоя запроса. Если устройство не поддерживает этот тип подключения, запрос должен завершиться ошибкой.

Параметры, используемые в открытых вызовах, зависят от характеристик устройства и делают вызовы успешными. Например, если обычная операция открытия завершается сбоем из-за того, что вызов не соответствует требованиям безопасности устройства, тест Fuzz повторяет операцию открытия с запросом на меньший доступ. Например, если операция открытия, запрашивающая доступ на запись, возвращает ошибку нарушения безопасности, открытие повторяется с запросом на доступ на чтение.

Операции открытия прямого устройства

Во время операций прямого открытия устройства тест fuzz открывает устройство напрямую, как устройство, а не как файл в файловой системе. Операции прямого открытия устройств всегда синхронны. Если вызов выполнен успешно, тест fuzz использует дескриптор, предоставленный для выполнения других выбранных тестов.

Открытие и закрытие теста

Во время теста Open и Close тест нечетких параметров создает несколько потоков, каждый из которых выполняет тысячи последовательностей создания, открытия и закрытия. Это проверяет способность водителя обрабатывать чрезвычайный объем простых и ожидаемых вызовов.

Тесты "Открыть" и "Закрыть" используют те же параметры, что и в тестах "Базовые операции открытия " и "Открыть с добавлением обратной косой черты" и выполняются непосредственно перед этими тестами.

Как протестировать драйвер во время выполнения с помощью Visual Studio

Выбор и настройка тестов "Основы устройства"

Тесты по основам устройств

Предоставленные подключаемые модули простого ввода-вывода WDTF

Тестирование драйвера во время выполнения из командной строки