共用方式為


使用 BinSkim 檢查二進位檔以識別弱點

使用 BinSkim 來檢查二進位檔,以識別可能會使二進位易受攻擊的程式代碼撰寫和建置做法。 它可以用來檢查準備寄送的二進位檔,以協助驗證組建鏈結中沒有任何問題。

BinSkim 會檢查:

  • 使用過期的編譯程式工具組 - 二進位檔應該針對最新的編譯程式工具集進行編譯,盡可能最大化使用目前編譯程式層級和 OS 提供的安全性風險降低功能。
  • 不安全的編譯設定 - 二進位檔應該使用最安全的設定進行編譯,以啟用操作系統提供的安全性防護功能、將編譯程式錯誤和可採取動作的警告報告最大化等。
  • 簽署問題 - 簽署的二進位檔應該使用密碼編譯強式演算法進行簽署。

BinSkim 是開放原始碼工具,會產生使用靜態分析結果交換格式的輸出檔案(SARIF) 格式。 BinSkim 會取代先前的 BinScope 工具。

如需 BinSkim 的詳細資訊,請參閱 BinSkim 使用者指南

安裝和執行 BinSkim

請遵循下列步驟來驗證您寄送的程式代碼中是否已正確設定安全性編譯選項。

  1. 下載並安裝跨平臺 .NET Core SDK

  2. 確認已安裝Visual Studio。 如需下載及安裝 Visual Studio 的資訊,請參閱 安裝 Visual Studio

  3. 有許多選項可以下載 BinSkim,例如 NuGet 套件。 在此範例中,我們將使用 git clone 選項從這裡下載:https://github.com/microsoft/binskim 並將它安裝在 64 位 Windows 計算機上。

  4. 開啟 Visual Studio 開發人員命令提示字元視窗並建立目錄,例如 C:\binskim-master

    C:\> Md \binskim-master
    
  5. 移至您剛才建立的目錄。

    C:\> Cd \binskim-master
    
  6. 使用 git clone 命令下載所有必要的檔案。

    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 如需有關 symath 的詳細資訊,請參閱 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 選項通常不建議用於實際自動化系統,因為這會增加記錄檔的大小,並且在大量「成功」結果中,失敗情況較難辨識出來。

  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 - 'declaration': 例外狀況規格不符合先前的宣告

如需編譯程式警告的詳細資訊,請參閱編譯程式版本編譯程式警告。

另請參閱

驅動程式安全性檢查清單