既定でサポートされている CET
apphost
singlefilehost
は Intel CET と互換性があります (/CETCOMPAT
オプションを使用してコンパイルされます)。 この変更は、.NET アプリケーションのセキュリティを強化するために行われました。 ただし、.NET アプリが読み込んで相互運用できる共有ライブラリには制限があります。 ライブラリでは、スレッド コンテキストを、シャドウ スタックまたは例外処理で許可される継続アドレスのテーブルに存在しない命令ポインターを持つ場所に設定することはできません。
以前の動作
以前は、.NET プロセスに読み込まれた共有ライブラリは、 SetThreadContext、 RtlRestoreContext/NtContinue
、またはその例外ハンドラーを使用して、プロセス アドレス空間内の任意の場所にスレッド コンテキストを設定できました。
新しい動作
.NET 9 以降では、.NET プロセスに読み込まれた共有ライブラリは、 SetThreadContext、 RtlRestoreContext/NtContinue
、またはその例外ハンドラーを使用して、次のいずれかの場所にスレッド コンテキストを設定することしか許可されていません。
- シャドウ スタック上に存在します。
- 例外処理で許可される継続アドレスのテーブル (
/EHCONT
コンパイラ オプションまたはSetProcessDynamicEHContinuationTargets
API によって生成されます)。
ライブラリがスレッド コンテキストを他の場所に変更しようとすると、プロセスは終了します。
導入されたバージョン
.NET 9 Preview 6
破壊的変更の種類
この変更は、バイナリの互換性に影響を与える可能性があります。
変更理由
CET を有効にすると、ROP の悪用 (リターン指向プログラミング) に対する堅牢な保護を提供するハードウェアによって適用されるスタック保護が追加され、.NET アプリケーションのセキュリティが強化されます。
推奨される操作
回避策:
- アプリのプロジェクト ファイル (たとえば、.csproj ファイル) に
<CETCompat>false</CETCompat>
を追加することで、CET をオプトアウトできます。 - Windows セキュリティ アプリまたはグループ ポリシーを使用して、特定の .NET アプリケーションに対してハードウェアでサポートされているスタックの適用をオプトアウトします。 詳細については、「 有効なエクスプロイト保護」を参照してください。
影響を受ける API
- 該当なし
.NET