BinSkim を使用してバイナリ ファイルを調べて、バイナリが脆弱になる可能性があるコーディングとビルドのプラクティスを特定します。 ビルド チェーンで何も問題が発生していないかどうかを検証するために、出荷の準備が整っているバイナリを確認するために使用できます。
BinSkim は次のことをチェックします。
- 古いコンパイラ ツール セットの使用 - バイナリは、可能な限り最新のコンパイラ ツール セットでコンパイルして、現在のコンパイラレベルと OS が提供するセキュリティ軽減策を最大限に活用する必要があります。
- セキュリティで保護されていないコンパイル設定 - バイナリは、OS で提供されるセキュリティ軽減策を有効にし、とりわけコンパイラ エラーやアクションにつながる警告の報告を最大化するために、可能な限り最も安全な設定でコンパイルする必要があります。
- 署名の問題 - 署名されたバイナリは、暗号強度の高いアルゴリズムで署名する必要があります。
BinSkim はオープンソース ツールであり、静的分析結果交換形式 (SARIF) 形式を使用する出力ファイルを生成します。 BinSkim は、以前の BinScope ツールを置き換えます。
BinSkim の詳細については、 BinSkim ユーザー ガイドを参照してください。
BinSkim をインストールして実行する
次の手順に従って、出荷するコードでセキュリティ コンパイル オプションが正しく構成されていることを確認します。
クロス プラットフォーム の .NET Core SDK をダウンロードしてインストールします。
Visual Studio がインストールされていることを確認します。 Visual Studio のダウンロードとインストールの詳細については、「 Visual Studio のインストール」を参照してください。
NuGet パッケージなど、BinSkim をダウンロードするオプションは多数あります。 この例では、git クローン オプションを使用してここからダウンロードします。 https://github.com/microsoft/binskim して、64 ビットの Windows PC にインストールします。
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
を使用してシンボル ファイルの検索にこれらの場所を追加します。
コードがコードの一部ではないコンパイル済みバイナリを参照している場合は、Window デバッガーの同情を使用してシンボルを取得し、これらのコード依存関係のセキュリティを確認できます。 これらの依存関係で問題が見つかると、それらを修正できない可能性があります。 ただし、これらの依存関係を引き受けることで、受け入れる可能性のあるセキュリティ リスクを認識すると便利です。
ヒント
シンボル パス (ネットワーク シンボル サーバーを参照する) を追加する場合は、ローカル キャッシュの場所を追加して、シンボルをキャッシュするローカル パスを指定します。 これを行わないと、BinSkim のパフォーマンスが大幅に低下する可能性があります。 次の例では、d:\symbols にローカル キャッシュを指定します。
--sympath Cache*d:\symbols;Srv*http://symweb
同調の詳細については、「 Windows デバッガーのシンボル パス」を参照してください。
コンパイル済みのドライバー バイナリを分析するには、次のコマンドを実行します。 準拠しているドライバー .sys ファイルを指すターゲット パスを更新します。
C:\binskim-master\binskim\bld\bin\AnyCPU_Release\Publish\netcoreapp2.0\win-x64> BinSkim analyze "C:\Samples\KMDF_Echo_Driver\echo.sys"
詳しい情報が必要な場合は、次のようにverboseオプションを追加します。
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).
この出力は、ツールがドライバーが ELF バイナリではないことを示すので、テスト BA3001 が実行されていないことを示しています。
... 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': 例外の指定が以前の宣言と一致しません
コンパイラの警告の詳細については、「コンパイラ のバージョン別のコンパイラの警告」を参照してください。