内容提要
.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启用后的内存安全性,确保没有回归内存安全指标。