Chromium Chronicle #8:GWP-ASan:检测野外的 bug

第 8 集:作者:Vlad Tsyrklevich 在华盛顿州西雅图市(2019 年 11 月)
上一集

调试内存安全错误(例如释放后使用或缓冲区溢出)可能很困难。AddressSanitizer (ASan) 等工具有助于查明单元测试和模糊测试工具中的内存错误,但许多 bug 只有在部署到用户时,才会在 ASan 开销极高的情况下出现。

GWP-ASan 是一种仅在实际使用的堆内存错误检测器,设计为在野外使用。它会检测释放后使用、缓冲区上溢/下溢和双重释放。与 ASan 不同,它不会检测堆栈或全局变量中的错误。

通过对一小部分分配进行采样,GWP-ASan 能够提供概率错误检测功能,并且内存和性能开销微乎其微。当发生内存错误时,GWP-ASan 会导致进程立即崩溃(使用采样分配)。这样一来,您可以更轻松地发现 bug,因为崩溃发生在出现错误的地方,而不是稍后使用损坏内存的某个时间点。

与 ASan 一样,GWP-ASan 崩溃报告包含分配和取消分配堆栈轨迹,可帮助调试内存问题。我们来看一下崩溃界面中显示的一些其他数据的示例 (crbug/956230):

使用和取消分配均源自 PDFiumEngine::ExtendSelection()。源代码快速表明错误是使用失效的 std::vector 迭代器。

针对在 Windows 和 macOS 上使用 malloc/newPartitionAlloc 进行的分配,在稳定版渠道上启用了 GWP-ASan。正在提供对 Android 的支持。迄今为止,已报告超过 60 个 GWP-ASan 错误,大约 70% 已得到修复。GWP-ASan 崩溃都是可能被利用的候选安全问题,因此请快速对其进行分类,并在必要时请求向后移植。