MSBuild は高度にカスタマイズ可能で拡張可能です (詳細については 「ビルドのカスタマイズ 」を参照してください)、環境とビルドの適切な構成に特別な注意を払う必要があります。
インストール場所への書き込みアクセスを制限する
信頼されたユーザーのみが書き込みアクセス権を持つ場所に MSBuild (Visual Studio、.NET SDK、スタンドアロンのいずれを使用しても) をインストールします。
ビルド ロジックを変更するには、MSBuild 実行可能ファイルの横、および MSBuild 実行可能ファイルのサブフォルダーに配置されたさまざまなバイナリ ファイルと XML ファイルを変更または追加します。 そのため、信頼されたユーザーのみがフォルダーへの書き込みを許可する必要があります。
関連する構成
-
MSBuildExtensionsPath と MSBuildUserExtensionsPath - 具体的には、拡張機能ロジックからオプトアウトするために使用できるプロパティ
ImportUserLocationsByWildcardBefore{ImportingFileNameWithNoDots}
知っているソースとレビューしたソースでのみビルドを実行する
完全に信頼できるソースでのみ、MSBuild (プロジェクトのビルドと復元だけでなく、Visual Studioでプロジェクトを開く場合) を実行します。
MSBuild ロジックは、プロジェクト ファイルを含むビルド スクリプト ファイル内で拡張できるため、不明なビルド ロジックはビルド環境で任意のコードを実行できると想定する必要があります。
関連する構成
検証済みの専用の場所でビルドを実行する
MSBuild には、プロジェクトまたはソリューションのフォルダーからのロジックと、ドライブのルートまでの親フォルダーを自動的に含めることができます。 これには、 .user ファイル、 [before|after].{solution}.targets ファイル、 Directory.Build.[props|targets|rsp] ファイルなどが含まれます。
権限を持つユーザーまたはアカウントのみが、ドライブのルートまでの階層構造内のビルド関連ファイルとフォルダーを含む場所への書き込みアクセス権を持っていることを確認します。
意図しない Directory.Build.[props|targets|rsp]が含まれるのを防ぐために、ソースのルートにそのようなファイルを含めることができます。 ファイルには、空の MSBuild Project 要素を指定できます。
関連する構成
参照先パッケージと元のフィードを把握して確認する
ビルド ロジックは、NuGet パッケージによって自動的に拡張できます。 このようなロジックは、ビルドまたはコンパイルの実行にロジックを含む復元時に実行されます。 ビルド、コンパイル、実行時の NuGet パッケージ資産の種類 とそのロールについて理解していることを確認します。 具体的には、 build、 buildTransitive、 buildMultitargeting 、および analyzers アセットは、明示的にオプトアウトされていない限り、ビルドに自動的に接続 (および実行中に自動的に実行) されます。
参照先パッケージのビルドまたはコンパイラ拡張ロジックが不要な場合は常に ExcludeAssets を使用します (さらに優れている場合は、ビルド ロジックを明示的に IncludeAssets する必要があります)。
NuGet チームの現在のドキュメントとガイダンスを理解していることを確認します。 この問題の権限のあるソースとして、プロジェクト ファイルドキュメントのPackageReferenceを参照してください。
関連する構成
ビルドの開始スクリプト/プロセスを把握して確認する
ビルド ロジックは、コマンドライン引数または環境変数の影響を受ける可能性があります。特に、プラグイン (カスタム ロガーなど) やビルド ロジック ( MSBuildUserExtensionsPath のビルド スクリプトなど) が挿入される可能性があります。 MSBuild プロセスに適用されるコマンド ライン引数と環境変数がわかっていることを確認します。 そうすることで、ビルド ロジックがどのように影響を受けるかを理解しやすくなります。
専用ユーザー アカウントとセッションを使用してビルドを実行する
以前に不明なプロセスやスクリプト (別のビルドを含む) を実行するために同じシステムで使用できるアカウントでは実行しないでください。 特に、同じユーザー アカウントの下にある関連のないビルドが、完全に信頼されておらず既知ではないソースで実行されている可能性がある場合。
MSBuild は、ユーザー プロファイル (具体的には MSBuild SDK には MSBuildUserExtensionsPath の場所にあるビルド ロジックが自動的に含まれます) から、または環境変数によって挿入可能な場所 (同じ名前の MSBuild プロパティで MSBuildUserExtensionsPath をカスタマイズできます) から、さまざまな場所からロジックをソースできます。このようなプロパティには既定値がないため、同じ名前の環境変数から取得できます)。
Note
実装の詳細として、MSBuild は名前付きパイプとミューテックスを介して永続的なプロセスを検索して通信します。 Windowsでは、これらの名前付きパイプとミューテックスはマシン全体の名前空間を共有します。 そのため、別のローカル アカウントのプロセスがこれらの名前を占有し、ビルドによる作成をブロックできます。 この状況は、可用性 (サービス拒否) のみに関する問題です。 OS アクセス制御により、別のアカウントがビルドの読み取りや変更を行うのを防ぐことができます。 すべてのローカル アカウントが信頼されているコンピューター、または分離されたセッション、コンテナー、または VM を優先します。
関連する構成
-
MSBuildExtensionsPath と MSBuildUserExtensionsPath:
ImportUserLocationsByWildcardBefore{ImportingFileNameWithNoDots}プロパティをfalseに設定して、特定の拡張機能ビルド ロジックの自動包含をオプトアウトできます。