半个多世纪以来,软件工程师已经知道恶意行为者可以利用一类称为“内存安全漏洞”的软件缺陷来危害应用程序和系统。在此期间,专家们多次警告与内存安全漏洞相关的问题。内存不安全代码甚至导致了 1988 年的一次重大互联网中断。内存不安全问题到底有多大?微在一篇博客文章中报告称,“微软每年指定 CVE(常见漏洞和暴露)的漏洞中,约有 70% 仍然是内存安全问题。” 谷歌同样报称,“Chromium 项目发现,我们大约 70% 的严重安全漏洞都是内存安全问题。” Mozilla 报在对安全漏洞的分析中,“在 34 个严重/严重错误中,有 32 个与内存相关。”
这些漏洞并不是理论上的。攻击者利用它们对真人进行攻击。例如,谷歌的零日计划团队在将攻击者报告给软件提供商之前分析了攻击者在野外使用的漏洞(也称为“零日漏洞”)。他们报称,“在今年的 58 个 [此类漏洞] 中,有 39 个(即 67%)是内存损坏漏洞。” 公民实验室发现针对利用内存安全漏洞的民间社会组织的间谍软件。
在其他哪个行业,市场会容忍产品用户几十年来所面临的这种众所周知的严重危险?
多年来,软件工程师发明了许多巧妙但最终不足以缓解此类漏洞的方法,包括内存随机化和沙箱技术等可减少影响的工具,以及可减少发生的静态和动态代码分析工具。除了这些工具之外,组织还花费了大量时间和金钱来培训开发人员以避免不安全的内存操作。还有一些并行的工作来提高现有 C/C++ 代码的内存安全性。尽管做出了这些努力(以及相关的复杂性、时间和金钱成本),但几十年来,内存不安全一直是最常见的软件安全缺陷类型。
然而,每个软件公司都应该调查一些领域。首先,硬件方面有一些有前途的内存安全缓解措施。能力硬件增强型 RISC 指令 ( CHER ) 研究项目使用修改后的处理器为 C 和 C++ 等内存不安全语言提供保护,以防止许多广泛利用的漏洞。另一种硬件辅助技术以内存标记扩展 (MTE) 的形式出现,在某些系统中可用。虽然其中一些基于硬件的缓解措施仍在从研究到交付产品的过程中,但许多观察家认为它们将成为消除内存安全漏洞总体战略的重要组成部分。
其次,公司应该研究内存安全的编程语言。除 C/C++ 之外的大多数现代编程语言都已经是内存安全的。内存安全编程语言管理计算机的内存,因此程序员不能引入内存安全漏洞。与其他需要持续维护的可用缓解措施(无论是开发新的防御措施、筛选漏洞扫描还是人工)相比,一旦使用内存安全编程语言编写代码即可保持内存安全,则无需执行任何工作。
直到几年前,我们还缺乏一种具有 C/C++ 速度且具有内置内存安全保证的语言。2006 年,Mozilla的一名软件工程师开始研究一种名为 Rust 的新编程语言。Rust 1.0 版本于 2015 年正式发布。从那时起,几个著名的软件组织开始在他们的系统中使用它,包括亚马逊、Facebook、谷歌、微软、Mozilla 等。Linux 内核的开发也支持它。
不同的产品需要不同的投资策略来减少内存不安全代码。C/C++ 缓解措施、硬件缓解措施和内存安全编程语言之间的平衡甚至可能在同一公司的产品之间有所不同。没有一种方法可以解决所有产品的所有问题。然而,软件制造商不能做的一件事就是忽视这个问题。软件行业决不能因为无所作为而将时间再拖到十年。
CISA 的安全设计白皮书为软件制造商概述了三个核心原则:掌握客户安全成果、拥抱彻底的透明度以及从组织高层领导安全转型。内存不安全问题的解决方案将包含所有三个原则。
CISA 敦促软件制造商将减少并最终消除其产品线中的内存安全漏洞作为公司的最高目标。为了证明这样的承诺,公司可以发布“内存安全路线图”,其中包括有关他们如何修改软件开发生命周期(SDLC)以实现这一目标的信息。路线图可能包括详细信息,例如它将使用内存安全编程语言构建新产品或组件的日期,以及计划支持属于其供应链一部分的开源库的内存安全计划。
内存不安全问题几十年来一直困扰着软件行业,并且将继续成为漏洞和现实世界危害的主要来源,直到软件制造商的顶级业务领导者做出适当的投资并掌控客户的安全结果。在我们庆祝国家编码周之际,我们期待整个软件行业的参与者共同努力,使软件在设计上更加安全,而内存安全是实现这一目标的关键。