引言:

在软件安全领域,内存安全漏洞一直是困扰开发者和用户的顽疾。长期以来,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++ 将迎来一个更加安全、可靠的新时代。

参考文献:

(注:以上参考文献使用 APA 格式)

(为了更好的阅读体验,我将原文中图片相关的描述都去掉了,因为在纯文本的格式下,图片无法展示)


>>> Read more <<<

Views: 0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注