在生产中使用 Address Sanitizer 或其他未定义的行为消毒剂?

Using Address Sanitizer or other Undefined Behavior Sanitizers in Production?

过去曾有人担心在某些环境中的生产中使用 ASAN:https://seclists.org/oss-sec/2016/q1/363。 评论是2016年的-今天的风景如何?

是否建议在用户设备上的生产系统 运行 中使用消毒剂 here?该应用程序从其他方接收不受信任的输入并以各种方式处理这些输入。

使用它们是否会产生与安全相关的影响?是否有任何添加的工具实际上可以更轻松地远程利用错误?

我正在考虑的应用程序是开源的,因此在这种情况下简化逆向工程不是问题。

消毒剂 primarily meant to be used as debug, not hardening tools i.e. for error detection at verification stage but not error prevention in production. Otherwise they may leak sensitive info to the attacker (by printing details about address space and library version to stderr on error) or obtain local root privileges 由于不受控制地使用环境变量。此外,消毒剂可能会增加相当多的开销(2 倍减速对于 Asan 并不少见,1.5 倍对于 UBsan)。

一般来说,消毒剂有时在生产环境中用于A/B测试,以增加覆盖率并检测逃过正常 QA 的错误。

Clang 有很多选项可以加固:强化(-D_FORTIFY_SOURCE=2)、ASLR(-fPIE)、 堆栈保护(-fstack-protector-fsanitize=safe-stack)和控制流完整性(-fsanitize=cfi)(详见Clang Hardening Cheatsheet)。它们的开销要小得多,专门用于生产。

更新(感谢@cisnjxqu):

UBsan supports the -fsanitize-minimal-runtime mode 提供简约、低开销的运行时库,应该不会增加应用程序的攻击面。