使用 BinSkim 检查二进制文件以识别漏洞
使用 BinSkim 检查二进制文件,以确定可能使二进制文件易受攻击的编码和构建做法。 它可用于检查准备交付的二进制文件,以帮助验证生成链中是否有问题。
BinSkim 检查以下项:
- 使用过时的编译器工具集 - 应尽可能针对最新的编译器工具集编译二进制文件,以最大程度地使用当前编译器级别和 OS 提供的安全缓解措施。
- 不安全的编译设置 - 二进制文件应使用最安全的设置进行编译,以启用 OS 提供的安全缓解措施,最大程度地提高编译器错误和可操作的警告报告,等等。
- 签名问题 - 应使用加密强度高的算法对已签名的二进制文件进行签名。
BinSkim 是一种开源工具,它生成使用静态分析结果交换格式(SARIF) 格式的输出文件。 BinSkim 取代了以前的 BinScope 工具。
有关 BinSkim 的详细信息,请参阅 BinSkim 用户指南。
安装和运行 BinSkim
按照以下步骤验证安全编译选项是否已在寄送的代码中正确配置。
下载并安装跨平台 .NET Core SDK。
确认已安装 Visual Studio。 有关下载和安装 Visual Studio 的信息,请参阅 安装 Visual Studio。
有许多选项可用于下载 BinSkim,例如 NuGet 包。 在此示例中,我们将使用 git 克隆选项从此处下载:https://github.com/microsoft/binskim 并将其安装在 64 位 Windows 电脑上。
打开 Visual Studio 开发人员命令提示符窗口并创建目录,例如
C:\binskim-master
。C:\> Md \binskim-master
移动到刚刚创建的目录。
C:\> Cd \binskim-master
使用 git clone 命令下载所有所需的文件。
C:\binskim-master> git clone --recurse-submodules https://github.com/microsoft/binskim.git
移动到 clone 命令创建的新
binskim
目录。C:\> Cd \binskim-master\binskim
运行 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 ...
生成过程使用 BinSkim 可执行文件创建一组目录。 移动到 win-x64 生成输出目录。
C:\binskim-master\binskim> Cd \binskim-master\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\win-x64>
显示分析选项的帮助。
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 调试器的 Sympath 工具来检索符号,以便验证这些代码依赖项的安全性。 如果发现这些依赖项中存在问题,可能无法修复它们。 但是,通过承担这些依赖项,了解所接受的任何可能的安全风险可能很有用。
提示
添加符号路径(引用网络符号服务器)时,请添加本地缓存位置以指定用于缓存符号的本地路径。 不这样做可能会大大损害 BinSkim 的性能。 以下示例指定 d:\symbols 处的本地缓存。
--sympath Cache*d:\symbols;Srv*http://symweb
有关 sympath 的详细信息,请参阅 Windows 调试器的符号路径。
执行以下命令以分析已编译的驱动程序二进制文件。 更新目标路径以指向已编译的驱动程序 .sys 文件。
C:\binskim-master\binskim\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\win-x64> BinSkim analyze "C:\Samples\KMDF_Echo_Driver\echo.sys"
如需更多信息,请添加详细选项,如下所示。
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 选项,因为这会使得在发生单个故障时更难识别出故障,因为它们会被大量“成功”结果所淹没。
查看命令输出,查找可能的问题。 此示例输出显示通过的三个测试。 有关规则的其他信息,例如 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).
此输出显示测试 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.
此输出显示测试 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 中用于驱动程序项目的默认编译选项可以禁用如下警告。 这些警告将由 BinSkim 报告。
C4603 - 'name':未定义宏或使用预编译头后定义不同
C4627 - 'description':在查找预编译头使用情况时跳过
C4986 - “declaration”:异常规范与以前的声明不匹配
有关编译器警告的详细信息,请参阅按编译器版本分类的 编译器警告。