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


Статические и динамические средства проверки

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

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

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

Рекомендуется использовать сочетание статических и динамических средств проверки подлинности. Статические средства позволяют проверять пути кода, которые трудно выполнять на практике, в то время как динамические инструменты находят серьезные ошибки, возникающие в драйвере.

Внимание

Программа совместимости оборудования Windows требует проверки CodeQL для статических проверок логотипа средства (STL) на наших клиентских и серверных операционных системах. Мы будем продолжать поддерживать поддержку SDV и ЦС на старых продуктах. Партнерам настоятельно рекомендуется ознакомиться с требованиями CodeQL к статическому тесту логотипа средства. Дополнительные сведения об использовании CodeQL см. в разделе CodeQL и проверка логотипа статических инструментов.

Опрос средств проверки

Следующие средства проверки описаны в WDK и рекомендуется использовать разработчиками драйверов и тестировщиками. Они перечислены в порядке, в котором они обычно используются.

Как только код компилируется

  • CodeQL, GitHub, является мощным механизмом анализа семантического кода и сочетанием обширного набора высокозначных запросов безопасности вместе с надежной платформой делает его бесценным инструментом для защиты кода драйвера. Дополнительные сведения см. в разделе CodeQL и тест логотипа статических инструментов.

Дополнительные статические инструменты

В зависимости от того, какую версию Windows вы создаете драйвер, могут потребоваться другие статические средства.

  • Анализ кода для драйверов — это статическое средство проверки, которое выполняется во время компиляции. Анализ кода для драйверов может проверять драйверы, написанные на C/C++ и управляемый код. Он проверяет код в каждой функции драйвера независимо, поэтому его можно запустить сразу после сборки драйвера. Он выполняется относительно быстро и использует несколько ресурсов.

    Основные функции средства анализа кода в Visual Studio обнаруживают общие ошибки кодирования, такие как отсутствие проверки возвращаемых значений. Функции, относящиеся к драйверу, обнаруживают более тонкие ошибки кодирования драйвера, такие как выход из неинициализированных полей в скопированном IRP и сбой восстановления измененного IRQL к концу подпрограммы.

  • Средство проверки статических драйверов (SDV) — это статическое средство проверки, которое выполняется во время компиляции и проверяет код драйвера в режиме ядра, написанный на C/C++. Он включен в WDK и может быть запущен из Visual Studio Ultimate 2012 или из окна командной строки Visual Studio с помощью MSBuild.

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

Внимание

SDV больше не поддерживается, а SDV недоступен в выпусках Windows 24H2 WDK или EWDK. Он недоступен в WDKs более поздней сборки 26017 и не включен в windows 24H2 RTM WDK. SDV по-прежнему можно использовать, скачав Windows 11 версии 22H2 EWDK (выпущено 24 октября 2023 г.) с инструментами сборки Visual Studio 17.1.5 из скачивания комплекта драйверов Windows (WDK). Рекомендуется использовать только enterprise WDK для запуска SDV. Использование более старых версий стандартной WDK в сочетании с последними выпусками Visual Studio не рекомендуется, так как это, скорее всего, приведет к сбоям анализа.
В будущем CodeQL будет основным средством статического анализа драйверов. CodeQL предоставляет мощный язык запросов, который обрабатывает код как базу данных для запроса, что упрощает запись запросов для конкретных поведения, шаблонов и многого другого. Дополнительные сведения об использовании CodeQL см. в разделе CodeQL и проверка логотипа статических инструментов.

При запуске драйвера

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

  • Средство проверки драйверов — это средство динамической проверки, написанное специально для драйверов Windows. Он включает несколько тестов, которые могут выполняться одновременно на нескольких драйверах. Средство проверки драйверов настолько эффективно при поиске серьезных ошибок в драйверах, которые опытные разработчики драйверов и тестировщики настраивают средство проверки драйверов для запуска при каждом запуске драйвера в среде разработки или тестирования. Средство проверки драйверов входит в Windows. При включении средства проверки драйверов для драйвера необходимо также выполнить несколько тестов на драйвере. Средство проверки драйверов может обнаруживать некоторые ошибки драйвера, которые трудно обнаружить с помощью статических средств проверки. Ниже приведены примеры таких типов ошибок:

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

    • Использование памяти после освобождения. Специальные блоки памяти пула используют собственную страницу памяти и не совместно используют страницы памяти с другими выделениями. Когда драйвер освобождает блок памяти пула, соответствующая страница памяти становится недоступной. Если драйвер пытается использовать такую память после освобождения, драйвер немедленно завершит работу.

    • Использование памяти с возможностью страниц при выполнении с повышенными привилегиями IRQL. Когда проверенный драйвер вызывает IRQL на DISPATCH_LEVEL или более поздней версии, средство проверки драйверов обрезает все страницы памяти из системного рабочего набора, имитируя систему под давлением памяти. Драйвер завершает работу, если он пытается использовать один из этих страничных виртуальных адресов.

    • Моделирование низких ресурсов. Чтобы имитировать систему в условиях низких ресурсов, средство проверки драйверов может завершить работу различных API ядра операционной системы, вызываемых драйверами.

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

    • Операции ввода-вывода, которые занимают слишком много времени для завершения или отмены. Средство проверки драйверов может протестировать логику драйвера для реагирования на STATUS_PENDING возвращаемых значений из IoCallDriver.

    • Проверка соответствия DDI. (Доступно начиная с Windows 8) Средство проверки драйверов применяет набор правил интерфейса драйвера устройства (DDI), которые проверяют правильное взаимодействие между драйвером и интерфейсом ядра операционной системы. Эти правила соответствуют правилам, которые средство проверки статических драйверов использует в анализе исходного кода драйвера. Если средство проверки драйверов обнаруживает ошибку при включенной проверке соответствия требованиям DDI, запустите средство проверки статических драйверов и выберите то же правило, которое вызвало ошибку. Средство проверки статических драйверов поможет найти причину дефекта в исходном коде драйвера.

  • Санитизатор адресов ядра (KASAN) — это технология обнаружения ошибок, поддерживаемая в драйверах Windows, которая позволяет обнаруживать несколько классов незаконного доступа к памяти, таких как переполнение буфера и события после использования.

  • Средство проверки приложений — это средство динамической проверки для приложений и драйверов в пользовательском режиме, написанных на C/C++. Он не проверяет управляемый код.