在.NET的CoreCLR中采用MSVC地址清理器

在.NET的CoreCLR中采用MSVC地址清理器

💡 原文英文,约1000词,阅读约需4分钟。
📝

内容提要

.NET的CoreCLR采用了MSVC Address Sanitizer(ASan)来提高平台的可靠性和安全性。ASan帮助检测和修复CoreCLR中的内存错误,如缓冲区溢出和内存泄漏。为了在Windows上启用ASan,进行了一些更改,包括创建动态链接库和解决兼容性问题。CoreCLR还进行了一些更改,以避免构建和运行时错误。在CoreCLR中采用ASan是提升.NET安全性和稳定性的重要一步。

🔎

延伸解读

为何CoreCLR需要ASan适配

CoreCLR作为.NET的核心运行时,由C/C++编写,性能关键且与操作系统、原生库和托管代码交互,容易发生缓冲区溢出、释放后使用和内存泄漏等错误。这些错误可能导致崩溃、数据损坏甚至安全漏洞。ASan能零误报地检测内存安全错误,因此CoreCLR成为理想候选。此前在gcc上启用ASan已发现分配/释放不匹配、缓冲区越界等问题,但Windows上的构建基础设施不兼容、测试配置混合和运行时问题阻碍了采用。

Windows平台集成的特殊挑战

CoreCLR在Windows上有独特约束:运行时加载和卸载模块会干扰ASan的初始化和终结;自定义内存分配器和堆栈展开机制与ASan的跟踪和报告冲突;快速检查转换和尾调用代码路径曾导致ASan误报;JIT层生成机器码也给ASan带来困难。此外,Windows上调试与发布、动态与静态链接库的配置差异是ASan采用的主要障碍。为此,MSVC ASan团队创建了一个始终动态链接的单一库,作为应用程序内存状态的唯一来源,解决了配置问题。

双方的关键改动与持续监控

MSVC ASan方面进行了多项修改:注解ASan开始跟踪前的分配以避免误报;在x64上拦截AddVectoredExceptionHandler和RemoveVectoredExceptionHandler以防止虚假访问冲突异常;修正跨DLL全局变量的ODR违规问题;支持弱符号以使用ASan接口函数;抑制ASan与调试器的通信以避免被CoreCLR异常处理程序捕获。CoreCLR方面则调整构建基础设施以分别测试消毒和未消毒组件,并在异常处理路径中插入__asan_handle_no_return函数以正确识别堆栈

对开发者的意义与后续步骤

在CoreCLR中采用ASan是提升.NET安全性和稳定性的重要一步,且由于.NET跨平台,ASan可跨Clang、GCC和MSVC使用,NativeAOT运行时组件也已被消毒。大部分工作已在Visual Studio 2022 17.8发布前完成,但直到.NET的CI基础设施能消费官方发布中的更改才得以启用。开发者现在可以下载Visual Studio并尝试Address Sanitizer,通过评论或产品内反馈渠道提供建议。持续监控ASan结果对防止内存安全指标回退至关重要。

❓

Q&A

MSVC地址清理器(ASan)在.NET CoreCLR中的作用是什么?

ASan帮助检测和修复CoreCLR中的内存错误,如缓冲区溢出和内存泄漏,从而提高平台的可靠性和安全性。

在Windows上启用ASan需要哪些更改?

需要创建动态链接库并解决兼容性问题,以便在Windows上正确启用ASan。

CoreCLR在集成ASan时面临哪些挑战?

CoreCLR在运行时加载和卸载模块、使用自定义内存分配器以及存在JIT层等特性,使得ASan的集成更加复杂。

ASan如何提高内存安全性?

ASan通过提供零假阳性的内存安全错误报告,增强了对现有和遗留代码库的安全信心。

CoreCLR在ASan集成后进行了哪些具体更改?

CoreCLR进行了构建基础设施的更改,以测试个别组件,并插入了__asan_handle_no_return函数以正确识别堆栈使用后的情况。

如何测试ASan启用后的内存安全性?

通过每周运行的管道测试来监控ASan启用后的内存安全性,确保没有回归内存安全指标。

🏷️

标签

➡️

继续阅读