
美国网络安全和基础设施安全局 (CISA) 和国家安全局 (NSA) 本周发布指南,敦促软件开发人员采用内存安全的编程语言。去年初,美国白宫曾建议程序开发人员放弃C和C++,转向Rust等内存安全的编程语言。
跨机构报告[PDF] 指出:“内存安全的重要性怎么强调也不为过。”
内存安全的重要性怎么强调也不为过
内存安全性是指编程语言提供的避免因计算机内存处理不当而导致漏洞的方法的程度。Rust、Go、C#、Java、Swift、Python 和 JavaScript 等语言支持自动内存管理(垃圾收集)或对内存所有权实施编译时检查,以防止基于内存的错误。
C 和 C++ 是两种最广泛使用的编程语言,但默认情况下它们并非内存安全的。虽然开发人员可以通过严格遵循最佳实践和使用静态分析工具来提高内存安全性,但并非每个人都会如此谨慎地部署代码。
更复杂的是,用名义上安全的语言编写的代码仍可能使用外部函数接口导入不安全的 C/C++ 库,这可能会破坏内存安全保证。
过去十年,安全研究人员一直在对内存安全漏洞的危险发出警告。安全研究员亚历克斯·盖纳(Alex Gaynor)早在2017年就表示:“内存不安全是困扰我们行业的一大祸害。”
谷歌和微软将大型软件项目中的大多数漏洞归咎于内存安全错误。例如,在谷歌的Android操作系统中, 2018年90%的高危漏洞都来自内存安全漏洞。2021年,巧克力工厂(Chocolate Factory)指出,Chromium中超过70%的严重安全问题来自内存安全漏洞。
OpenSSL加密库中臭名昭著的Heartbleed漏洞,就是C代码中的一个内存安全错误(越界读取)造成的。此外,还有很多其他例子,包括6月中旬的Google Cloud宕机事件,谷歌的事件报告将其归咎于缺乏对空指针的适当错误处理。
几年之内,科技行业开始响应内存安全语言的号召。2022年,微软高管开始呼吁使用Rust等内存安全语言编写新应用程序。到2023年,主流产品评测刊物《消费者报告》发布了一份关于内存安全的报告,当时CISA主管Jen Easterly等政府官员在公开露面时也强调了向内存安全语言过渡的必要性。
过去一年,内存安全方面的努力在 Linux 内核社区引发了一些动荡,因为集成基于 Rust 的驱动程序的努力遭到了内核维护人员的抵制。这也引起了C/C++ 社区的警惕,该社区的开发人员一直在忙于通过TrapC、FilC、Mini-C和Safe C++等项目,试图找到与 Rust 的内存安全承诺相匹配的方法。
CISA/NSA 报告重新审视了提高内存安全性的理由以及政府采用内存安全语言 (MSL) 的呼吁,同时也承认并非每个机构都能中途换马的现实。
可靠性提高、攻击面减少、长期成本降低等诸多优势,为 MSL 的采用提供了强有力的理由
报告指出:“平衡的方法是承认 MSL 并非万能药,转型过程充满挑战,尤其对于拥有庞大现有代码库或关键任务系统的组织而言。” “然而,MSL 的诸多优势,例如可靠性提升、攻击面减少以及长期成本降低,都为采用 MSL 提供了强有力的理由。”
该报告列举了谷歌如何在2024年之前成功将Android内存安全漏洞比例降低到24%。报告还概述了采用MSL的各种优势,并探讨了采用过程中面临的挑战。此外,报告还敦促科技行业推广内存安全,例如,发布需要MSL专业知识的职位信息。
它还引用了各种政府项目来加速向 MSL 的过渡,例如国防高级研究计划局 (DARPA) 的将所有 C 语言翻译成 Rust ( TRACTOR ) 计划,该计划旨在开发一种将 C 代码自动化翻译成 Rust 的方法。
普林斯顿大学、加州大学伯克利分校和加州大学圣地亚哥分校的研究人员最近提出了一项名为Omniglot的类似项目。它为不安全的库提供了一种通过外部函数接口 (FFC) 与 Rust 代码进行通信的安全方式。
这正是 CISA 和 NSA 希望从私营部门看到的项目,特别是考虑到即将到来的预算削减可能导致CISA成员人数减少三分之一。
尽管由于需要维护遗留系统以及 MSL 可能不是每种情况下的最佳选择,实现更高内存安全性的道路变得复杂,但政府的信息很明确。
报告总结道:“内存漏洞对国家安全和关键基础设施构成严重风险。MSL 能够提供最全面的缓解措施,有效抵御此类普遍且危险的漏洞。”