引言:
在软件安全领域,内存安全漏洞一直是困扰开发者和用户的顽疾。长期以来,C++ 以其高效和灵活性著称,但也因其内存管理的复杂性而饱受诟病,大量的安全漏洞都源于此。然而,谷歌的一项突破性研究正在改变这一现状。通过将空间内存安全功能“加装”到 C++ 代码库中,谷歌不仅大幅降低了安全风险,还颠覆了人们对性能开销的传统认知。这是否意味着 C++ 将迎来一个默认安全的时代?
正文:
十年漏洞分析:C++ 内存安全问题触目惊心
谷歌的研究人员对过去十年(2014 年 7 月 15 日至 2023 年 12 月 14 日)的 CVE(常见漏洞和披露)数据进行了深入分析。结果令人震惊:在 C++ 中,至少 40% 的安全漏洞与空间内存漏洞有关,例如越界写入内存。这些漏洞不仅可能导致程序崩溃,还可能被恶意利用,造成严重的安全威胁。
谷歌的解决方案:加固 C++,性能影响微乎其微
面对如此严峻的挑战,谷歌并没有选择彻底抛弃 C++,而是另辟蹊径,探索在现有代码库中引入安全机制的可能性。谷歌的资深软件工程师 Alex Rebert 和 Kinuko Yasuda,以及安全基础团队的 Max Shavrick,共同撰写了一篇博文,详细介绍了他们如何通过在 C++ 代码中添加边界检查来保护其服务器端生产系统,包括 Gmail、YouTube、谷歌地图和谷歌搜索引擎等核心服务。
他们利用 C++ 标准库的 LLVM 实现中已有的加固模式,对 C++ 代码进行边界检查,并将其作为服务器端生产系统的默认设置。结果令人惊喜:
- 漏洞发现: 该团队发现了 1000 多个 Bug,预计平均每年发现的 Bug 可增加到 1000 至 2000 个。
- 故障率降低: 谷歌整个生产环境的基线分段故障率降低了 30%。
- 错误修复: 许多潜伏了十多年的 Bug 被发现并修复。
- 调试效率提升: 难以诊断的内存损坏转化为即时且易于调试的错误。
- 安全防护增强: 成功挫败了一次内部红队演习,证明了其在防御漏洞利用方面的有效性。
最令人惊讶的是,加固后的 libc++ 对谷歌服务的平均性能影响仅为 0.30%。这一结果颠覆了人们对边界检查性能开销的传统认知。
“我错了”:性能开销远低于预期
谷歌杰出工程师、新兴编程语言 Carbon 的创始人和联合牵头人 Chandler Carruth 在一篇博文中坦言:“边界检查的开销:我错了”。他承认,过去关于边界检查成本的报告和实验让他坚信,边界检查的成本不可能低到可以默认启用的程度。然而,谷歌的实践证明,边界检查的实际成本远低于预期。
Carruth 指出,微软 Visual C++ 引入了基于编译器的检查,苹果公司在 C++ 中实现安全缓冲区方面也做出了杰出贡献,使得 LLVM 生态系统最终拥有了可靠的工具。此外,内存安全语言开发人员对 LLVM 的贡献也推动了 LLVM 的持续改进,最终使得边界检查的成本大幅降低。
C++ 安全新时代:性能与安全兼得
Carruth 认为,这种水平的可用性改变了安全游戏的规则,使得我们不再需要在性能和安全性之间做出痛苦的权衡,而是可以两者兼得。他大胆提出,通过编译器对内存安全检查的持续支持,我们有机会默认实现空间内存安全,即使是在 C 和 C++ 中,即使是在性能最受限制的环境中。
他还建议,现在应该考虑参考计数等其他安全检查,即使这些检查可能带来性能影响。他认为,对于手机、笔记本电脑等小型系统,缓存流量和潜在同步开销的成本微不足道。
社区反响:积极响应,未来可期
谷歌的博文在网络上引发了积极的反响。WebAssembly 联合创始人 Ben Titzer 认为,安全检查应该真正地内置于语言中,编译器可以对其进行专门优化,从而消除许多 Bug 并大大降低动态成本。系统编程语言 D 的创建者 Walter Bright 也分享了 D 语言引入数组边界检查的成功经验,并认为这是正确的选择。
结论:
谷歌的这项研究不仅为 C++ 的内存安全问题提供了切实可行的解决方案,也为整个软件开发行业带来了新的启示。它表明,通过技术创新和持续改进,我们可以在不牺牲性能的前提下,大幅提升软件的安全性。未来,随着编译器技术的不断发展和优化,我们有理由相信,C++ 将迎来一个更加安全、可靠的新时代。
参考文献:
- David Cassel. (2024, November 16). Google “Retrofits” Spatial Memory Safety to C++. InfoQ. Retrieved from https://www.infoq.com/news/2024/11/google-cpp-memory-safety/
- Kinuko Yasuda. (2024, November 16). Twitter Post. Retrieved from https://twitter.com/kinu/status/1725171613056723270
- Chandler Carruth. (2024, November 16). The Cost of Bounds Checks: I Was Wrong. Retrieved from https://www.chandlercarruth.com/blog/2024/11/16/bounds-checks-i-was-wrong/
(注:以上参考文献使用 APA 格式)
(为了更好的阅读体验,我将原文中图片相关的描述都去掉了,因为在纯文本的格式下,图片无法展示)
Views: 0