从C和C++向Rust等内存安全编程语言的转变正在取得进展
点击蓝字 关注我们
SUBSCRIBE to US
ISTOCK
内存安全备受关注。2022年11月,美国国家安全局建议使用内存安全编程语言,以防止软件内存安全问题。今年早些时候,《消费者报告》(https://www.consumerreports.org/)在其“记忆安全的未来”报告中鼓励使用记忆安全语言。
伦敦帝国理工学院计算系高级讲师Azalea Raad表示:“内存安全语言现在越来越受欢迎的关键原因之一是安全问题的普遍存在,主要在于内存安全漏洞。”
内存安全是编程语言的一个功能,它可以防止某些类型的内存访问错误,如越界读取和写入,以及在释放错误后使用。例如,在一个管理待办事项列表的应用程序中,越界读取可能涉及访问五个待办事项列表中不存在的第六个项目,而释放后使用错误可能涉及访问已删除待办事项列表上的一个项目。这些错误可能导致访问私人数据、损坏数据,甚至执行不属于程序的代码。
Raad说:“例如,越界读取可能导致从内存中或包含敏感数据的相邻块读取。同样,越界写入可能会覆盖内存中的敏感信息,并导致劫持程序的控制流并执行特权或恶意代码。”
在内存安全语言中,这些错误是在编译时或运行时发现的。在编译时,它们被标记为错误,然后可以进行修复。当在运行时检测到,它们将导致崩溃,而不是允许对内存进行未经检查的访问,从而限制潜在的损坏并防止安全漏洞。
除了C、C++和汇编之外,大多数编程语言都被认为是内存安全的。华盛顿大学Paul G. Allen计算机科学与工程学院教授兼副院长Dan Grossman说:“直到最近几年,几乎所有的系统软件都是用C或C++编写的,这是出了名的不安全 —— 这两种语言更容易出现基于内存的漏洞。。”
一些负责系统软件 —— 包括一些操作系统和其他低级系统等等的科技公司开始意识到了内存安全的重要性。2019年,谷歌和微软报告称,他们产品中的大多数漏洞都是内存安全问题。一项针对苹果操作系统的类似研究也发现了同样的问题。这些公司正在采取行动,采用更多的内存安全语言。例如,Meta正在接受Rust,Linux也正在其内核中添加对该语言的支持。在谷歌的Android 13操作系统中,大约五分之一的新原生代码在Rust中,由此,这家搜索巨头发现内存安全漏洞的数量和严重程度都大幅下降。
互联网安全研究小组执行主任Josh Aas表示:“我们现在明白,内存安全漏洞并不是什么深奥的计算机科学概念。”该小组的Prossimo项目正在推动向内存安全迈进。“这是真正的消费者安全问题。这是国家网络安全问题。”
Raad表示,Rust在2022年IEEE Spectrum顶级编程语言中排名第20(https://spectrum.ieee.org/top-programming-languages-2022),是C和C++的内存安全替代品,可用于编写低级系统代码或开发操作系统内核。她还建议软件开发人员在为iOS和macOS开发时改用Swift;Kotlin在为Android开发时提供了与Java的互操作性,Java是Android的主要语言;和Go为服务器编写网络代码。
为了使向新编程语言的转移更易于管理,特别是对于在大型代码库上工作的软件开发人员来说,Raad建议从新的代码库而不是现有的代码库开始着手,因为这不需要代码重写,“但仍需要调整和扩展现有的测试和部署基础设施,以支持新语言。”
下一步是针对现有代码库的新模块,这也不需要任何代码重写,但需要处理用于交换跨越两种语言边界的数据的数据结构等,Raad说。最后,程序员可以考虑用内存安全的语言重写现有的模块。Raad表示:“理想情况下,这应该是一个范围很小的模块,以最大限度地减少代码重写的固有风险,并且在切换到内存安全语言时具有明显的性能提升或安全优势。”
为了进一步简化转换,程序员可以利用应用程序编程接口(API)。Aas说:“很多Rust组件都带有C API,所以你可以从中受益,而且不必学习一门全新的语言。”
他补充道,在采用内存安全语言时,测试也是至关重要的。Aas说:“如果你担心重写代码可能会导致错误,那么最好认识到为现有代码编写测试的投资将在这里得到回报 —— 如果你对当前代码有很好的测试,那么这些测试将帮助你验证用内存安全语言进行的任何重写都是正确的。”
此外,公司本身可以通过提供培训机会和聘请高级软件工程师等方式来促进使用内存安全语言编程,这可能会产生“重大影响,因为他们可以提供代码审查并培训新的语言开发人员,”Raad说。
向新编程语言的转变通常需要一个学习曲线,但Grossman说:“在内存安全的情况下,回报通常是值得的。”
微信号|IEEE电气电子工程师
新浪微博|IEEE中国
· IEEE电气电子工程师学会 ·
往
期
推
荐
微信扫码关注该文公众号作者