ビジネス向けアプリ コントロールと .NET

.NET アプリ (C#のような高レベルの言語で記述) は、中間言語 (IL) にコンパイルされます。 IL は、任意のオペレーティング システムまたはアーキテクチャでサポートできるコンパクトなコード形式です。 ほとんどの .NET アプリでは、複数の環境でサポートされている API が使用され、.NET ランタイムのみを実行する必要があります。 CPU (Arm64 や x64 など) で実行するには、IL をネイティブ コードにコンパイルする必要があります。 .NET では、アプリ コントロール ユーザー モード ポリシーを使用してデバイス上のネイティブ イメージ (NI) に IL をコンパイルするときに、最初に元の IL ファイルが現在のアプリコントロール ポリシーに合格するかどうかを確認します。 その場合、.NET は、生成された NI ファイルに NTFS 拡張属性 (EA) を設定して、アプリ コントロールも信頼できるようにします。 .NET アプリを実行すると、アプリ コントロールは NI ファイルに EA を表示し、それを許可します。

NIファイルに設定されているEAは、現在アクティブなアプリコントロールポリシーにのみ適用されます。 アクティブなアプリ制御ポリシーの 1 つが更新された場合、または新しいポリシーが適用された場合、NI ファイルの EA は無効になります。 次回アプリを実行すると、アプリコントロールによってNIファイルがブロックされます。 .NET はブロックを適切に処理し、元の IL コードにフォールバックします。 IL が最新のアプリ制御ポリシーに引き続き合格した場合、アプリは機能に影響を与えずに実行されます。 IL は現在実行時にコンパイルされているため、アプリのパフォーマンスに若干の影響を与える可能性があります。 .NET が IL にフォールバックする必要がある場合、.NET では、すべての NI ファイルを再生成するために、次のメンテナンス期間に実行するプロセスもスケジュールされます。したがって、最新のアプリ制御ポリシーに合格したすべてのコードについて、アプリ コントロール EA を再確立します。

場合によっては、NI ファイルがブロックされている場合、「App Control 管理 Tips & 既知の問題」で説明されているように、CodeIntegrity - Operational イベント ログに "誤検知" ブロック イベントが表示されることがあります。

App Control EA が無効または欠落している場合に発生するパフォーマンスへの影響を軽減するには、次の手順を実行します。

  • アプリ制御ポリシーを頻繁に更新することは避けてください。
  • ngen update (すべてのマシン アーキテクチャで) を実行して、アプリコントロールポリシーに変更を適用した直後にすべてのNIファイルを強制的に再生成します。
  • アプリケーションを .NET Core (.NET 6 以降) に移行します。

アプリコントロールと .NET の強化

セキュリティ研究者は、アプリが外部ソースからライブラリを読み込んだり、実行時に新しいコードを生成したりできる一部の .NET 機能を使用して、アプリコントロールコントロールを回避できることを発見しました。 この潜在的な脆弱性に対処するために、アプリ コントロールには、実行時に読み込まれたコードを検証するために .NET と連携する 動的コード セキュリティ と呼ばれるオプションが含まれています。

[動的コード セキュリティ] オプションを有効にすると、.NET が外部ソースから読み込むライブラリにアプリ制御ポリシーが適用されます。 たとえば、インターネットやネットワーク共有などのリモート ソースなどです。

重要

UMCI が有効になっているアプリ制御ポリシーでオプション 19 Enabled:Dynamic Code Security が設定されている場合、.Net 動的コード セキュリティの強化が有効になり、適用されます。 この機能の監査モードはありません。 多数のデバイスでオンにする前に、このオプションを設定してアプリをテストする必要があります。

さらに、.NET によってディスクに生成されたコードの改ざんを検出し、改ざんされたコードの読み込みをブロックします。

外部に読み込まれたライブラリに対して既存のポリシーが考慮されない可能性があるため、動的コード セキュリティは既定では有効になっていません。 さらに、System.Reflection.Emit を使用してビルドされた署名されていないアセンブリの読み込みなど、いくつかの .NET 読み込み機能は、現在、動的コード セキュリティを有効にしてサポートされていません。 Microsoft では、新しいライブラリをポリシーに含める必要があるかどうかを検出するように強制する前に、監査モードで動的コード セキュリティをテストすることをお勧めします。

さらに、お客様は、署名されていない動的に生成されたコードを読み込もうとするため、許可された実行可能ファイルが終了するのを防ぐためにのみ、デプロイをプリコンパイルできます。 これを修正する方法については、ASP.NET プリコンパイルの概要に関するドキュメントの「 展開専用のプリコンパイル 」セクションを参照してください。

動的コード セキュリティを有効にするには、アプリ制御ポリシーの [ <Rules> ] セクションに次のオプションを追加します。

<Rule>
    <Option>Enabled:Dynamic Code Security</Option>
</Rule>