默认情况下支持 CET

apphost 现在 singlefilehost 标记为 Intel CET - 兼容(它们已使用 /CETCOMPAT 选项进行编译)。 此更改旨在增强 .NET 应用程序的安全性。 但是,它对 .NET 应用可以加载和互操作的共享库施加限制。 不允许库使用指令指针将线程上下文设置为位置,这些指令指针不存在于阴影堆栈或异常处理的允许延续地址表中。

旧行为

以前,加载到 .NET 进程的共享库能够使用 SetThreadContext、RtlRestoreContextNtContinue/ 或其异常处理程序将线程上下文设置为进程地址空间中的任何位置。

新行为

从 .NET 9 开始,只允许加载到 .NET 进程的共享库使用 SetThreadContext、RtlRestoreContextNtContinue/ 或其异常处理程序将线程上下文设置为以下位置:

  • 存在于阴影堆栈上。
  • 在异常处理的允许延续地址的表中(由 /EHCONT 编译器选项或 SetProcessDynamicEHContinuationTargets API 生成)。

如果库尝试将线程上下文更改为任何其他位置,则进程将终止。

引入的版本

.NET 9 预览版 6

中断性变更的类型

此项更改可能会影响二进制兼容性

更改原因

启用 CET 通过添加硬件强制堆栈保护来增强 .NET 应用程序的安全性,该保护提供针对 ROP 攻击(面向返回的编程)的强大保护。

解决方法:

  • 可以通过添加到 <CETCompat>false</CETCompat> 应用的项目文件(例如 .csproj 文件)来选择退出 CET。
  • 使用Windows 安全应用或组策略选择退出特定 .NET 应用程序的硬件支持的堆栈强制实施。 有关详细信息,请参阅 “启用攻击保护”。

受影响的 API

  • 不适用