默认情况下支持 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
- 不适用