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


Использование BinSkim для проверки двоичных файлов для выявления уязвимостей

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

BinSkim проверяет наличие:

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

BinSkim — это средство с открытым исходным кодом и создает выходные файлы, использующие формат обмена статическими результатами анализа (SARIF) . BinSkim заменяет прежнее средство BinScope.

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

Установка и запуск BinSkim

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

  1. Скачайте и установите кроссплатформенный пакет SDK для .NET Core .

  2. Убедитесь, что Visual Studio установлен. Сведения о загрузке и установке Visual Studio см. в Установить Visual Studio.

  3. Существует ряд вариантов скачивания BinSkim, например пакета NuGet. В этом примере мы будем использовать параметр клонирования git, чтобы скачать отсюда: https://github.com/microsoft/binskim и установить его для 64-разрядного компьютера с Windows.

  4. Откройте окно командной строки разработчика Visual Studio и создайте каталог, например C:\binskim-master.

    C:\> Md \binskim-master
    
  5. Перейдите к только что созданному каталогу.

    C:\> Cd \binskim-master
    
  6. Используйте команду клонирования Git, чтобы скачать все необходимые файлы.

    C:\binskim-master> git clone --recurse-submodules https://github.com/microsoft/binskim.git
    
  7. Перейдите в новую директорию binskim, созданную командой клонирования.

    C:\> Cd \binskim-master\binskim
    
  8. Запустите BuildAndTest.cmd, чтобы убедиться, что выпускная сборка выполнена успешно, и что все тесты пройдены.

    C:\binskim-master\binskim> BuildAndTest.cmd
    
    Welcome to .NET Core 3.1!
    ---------------------
    SDK Version: 3.1.101
    
    ...
    
    C:\binskim-master\binskim\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\win-x64\BinSkim.Sdk.dll
    1 File(s) copied
    C:\binskim-master\binskim\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\linux-x64\BinSkim.Sdk.dll
    1 File(s) copied
    
    ...
    
    
  9. Процесс сборки создает набор каталогов с исполняемыми файлами BinSkim. Перейдите в выходной каталог сборки win-x64.

    C:\binskim-master\binskim> Cd \binskim-master\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\win-x64>
    
  10. Показать справку по опции анализа.

C:\binskim-master\binskim\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\win-x64> BinSkim help analyze

BinSkim PE/MSIL Analysis Driver 1.6.0.0

--sympath                      Symbols path value, e.g., SRV*http://msdl.microsoft.com/download/symbols or Cache*d:\symbols;Srv*http://symweb. See
                              https://learn.microsoft.com/windows-hardware/drivers/debugger/advanced-symsrv-use for syntax information. Note that BinSkim will clear the
                              _NT_SYMBOL_PATH environment variable at runtime. Use this argument for symbol information instead.

--local-symbol-directories     A set of semicolon-delimited local directory paths that will be examined when attempting to locate PDBs.

-o, --output                   File path to which analysis output will be written.

--verbose                      Emit verbose output. The resulting comprehensive report is designed to provide appropriate evidence for compliance scenarios.

...

Задание пути символа для BinSkim

Если вы создаете весь код, который вы анализируете на одном компьютере, на котором выполняется BinSkim, обычно не нужно задавать путь к символам. Это связано с тем, что файлы символов доступны на локальном компьютере, на котором вы скомпилировали. Если вы используете более сложную систему сборки или перенаправляете символы в другое расположение (а не вместе с скомпилированным двоичным файлом), используйте --local-symbol-directories для добавления этих расположений в поиск по файлу символов. Если ваш код ссылается на скомпилированный двоичный файл, который не является частью вашего кода, то отладчик Windows можно использовать для получения символов, чтобы проверить безопасность этих зависимостей кода. Если в этих зависимостях возникла проблема, возможно, вы не сможете устранить их. Но это может быть полезно знать о любых возможных рисках безопасности, которые вы принимаете, принимая эти зависимости.

Совет

При добавлении пути символа (который ссылается на сетевой сервер символов), добавьте расположение локального кэша, чтобы указать локальный путь для кэширования символов. Не делать этого может значительно ухудшить производительность BinSkim. В следующем примере указывается локальный кэш в d:\symbols. --sympath Cache*d:\symbols;Srv*http://symweb Для получения дополнительной информации о символическом пути см. Пути символов для отладки Windows.

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

    C:\binskim-master\binskim\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\win-x64> BinSkim analyze "C:\Samples\KMDF_Echo_Driver\echo.sys"
    
  2. Для получения дополнительных сведений добавьте подробный параметр, как показано ниже.

    C:\binskim-master\binskim\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\win-x64> BinSkim analyze "C:\Samples\KMDF_Echo_Driver\osrusbfx2.sys" --verbose
    

    Заметка

    Опция --verbose будет выводить явные результаты успеха или неудачи для каждой проверки. Если вы не предоставляете подробные сведения, вы увидите только дефекты, обнаруженные BinSkim. Опция --verbose обычно не рекомендуется для автоматизированных систем из-за увеличения размера файлов журналов, что затрудняет выявление отдельных сбоев, так как они затеряются среди большого количества результатов 'pass'.

  3. Просмотрите выходные данные команды, чтобы найти возможные проблемы. В этом примере выходных данных показаны три пройденных теста. Дополнительная информация о правилах, таких как BA2002, доступна в руководстве пользователя BinSkim.

    Analyzing...
    Analyzing 'osrusbfx2.sys'...
    ...
    
    C:\Samples\KMDF_Echo_Driver\osrusbfx2.sys\Debug\osrusbfx2.sys: pass BA2002: 'osrusbfx2.sys' does not incorporate any known vulnerable dependencies, as configured by current policy.
    C:\Samples\KMDF_Echo_Driver\Debug\osrusbfx2.sys: pass BA2005: 'osrusbfx2.sys' is not known to be an obsolete binary that is vulnerable to one or more security problems.
    C:\Samples\KMDF_Echo_Driver\osrusbfx2.sys: pass BA2006: All linked modules of 'osrusbfx2.sys' generated by the Microsoft front-end satisfy configured policy (compiler minimum version 17.0.65501.17013).
    
  4. В этих выходных данных показано, что тест BA3001 не выполняется, поскольку средство указывает, что драйвер не является двоичным файлом ELF.

    ...
    C:\Samples\KMDF_Echo_Driver\Debug\osrusbfx2.sys: notapplicable BA3001: 'osrusbfx2.sys' was not evaluated for check 'EnablePositionIndependentExecutable' as the analysis is not relevant based on observed metadata: image is not an ELF binary.
    
  5. В этом выводе показывается ошибка теста BA2007.

    ...
    
    C:\Samples\KMDF_Echo_Driver\Debug\osrusbfx2.sys: error BA2007: 'osrusbfx2.sys' disables compiler warning(s) which are required by policy.
    A compiler warning is typically required if it has a high likelihood of flagging memory corruption, information disclosure, or double-free vulnerabilities.
    To resolve this issue, enable the indicated warning(s) by removing /Wxxxx switches (where xxxx is a warning id indicated here) from your command line, and resolve any warnings subsequently raised during compilation.
    

Чтобы включить эти предупреждения в Visual Studio, в разделе C/C++ на страницах свойств проекта удалите значения, которые не нужно исключить в Отключить определенные предупреждения.

снимок экрана диалогового окна для отключения определенных предупреждений в Visual Studio 2019.

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

C4603 — "name": макрос не определен или определение отличается после использования предварительно скомпилированного заголовка

C4627 — "description": пропущен во время поиска предварительно скомпилированного заголовка

C4986 — "объявление": спецификация исключений не соответствует предыдущему объявлению

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

См. также

Список проверки безопасности драйвера