开放源代码安全基金会 ( OpenSSF )总经理 Omkhar Arasaratnam 讨论了内存安全编程语言的演变及其为应对 C 和 C++ 等语言的局限性而出现的现象。
内存安全问题已存在五十多年,它要求程序员从内存管理任务中抽离出来。
Java、Rust、Python 和 JavaScript 等现代语言通过代替程序员处理内存管理来缓解这些问题,从而允许程序员专注于代码质量,而不必担心与低级内存管理相关的风险。
您能谈谈内存安全编程语言的演变吗?它们是如何应对 C 和 C++ 等语言在内存安全方面的限制的?
对内存安全的担忧已持续了50 多年。内存安全涉及将程序员从复杂的内存管理功能中抽象出来,而这些功能很难安全地执行。
例如,在 C 或 C++ 中,程序员必须分配和释放内存,这可能很难管理。
他们必须跟踪分配的内存量并确保仅使用适当分配的内存。
一旦不再需要该内存,程序员必须安全地处理它。Java、Rust、Python和 JavaScript 等语言可以防止程序员“内存不安全”,因为它们代表程序员处理内存管理的细微差别。
在软件开发中使用内存安全语言的主要优势是什么,特别是在系统编程或内核开发等高风险环境中?
操作系统内核对整个系统具有绝对的权限。这意味着诸如不安全的内存处理等安全问题可能会损害整个系统的安全。
虽然开发人员可以精确使用内存不安全的语言(如 C 或 C++)而不会导致内存安全问题,但历史告诉我们事实并非如此。
微软估计,其产品中 70% 的 CVE 都源于内存安全问题。谷歌进行了类似的研究,发现90% 的 Android CVE可能与内存安全有关。
Go、Python、Rust 和 Java 都是内存安全语言的优秀示例。
不幸的是,并非所有这些语言都可以用于内核开发。
Rust 即将成为 Linux 内核支持的第二种官方语言。
一旦完成,它将允许 Linux 内核开发人员用完全内存安全的语言重写内核的敏感部分。
开发人员和组织在过渡到内存安全语言时面临哪些挑战,特别是在遗留系统中?
当过渡到内存安全语言时,必须考虑几个问题:
1. 开发人员— 在过渡到新语言时,您需要培训现有的开发人员或找到熟悉该语言的开发人员。您可能还需要更改调试和构建系统以支持它。
2. 硬件支持— 像 C 和 C++ 这样的老语言在各种不同的平台上都受到支持,而像 Rust 这样的新语言则受到的支持比较有限。缺乏硬件支持可能会阻碍您过渡到这种新语言。
3. 监管要求——一些安全关键系统具有非常严格的技术或安全要求,由于缺乏保证或认证,可能会阻止切换到新的内存安全语言。
4. 错误— 将旧代码重构为新语言可能会引入错误。在某些情况下,虽然熟练的程序员可能会避免引入新的逻辑错误,但用新语言重写的旧代码可能会无意中表现出不同的行为,从而导致生产中出现意外错误。
从实际角度来看,如何逐步调整或重写 C/C++ 等语言的现有代码库,以利用内存安全语言的优势?
用 Rust 重写代码是一项艰巨的任务。去年 OpenSSF 回应ONCD 信息请求时,我们就意识到了这一挑战。我们认为答案并不是用 Rust 重写所有内容。
我们鼓励社区在开始新项目时考虑使用 Rust 编写代码。
我们还建议将 Rust 用于关键代码路径,例如通常被滥用或被破坏的区域或那些拥有“王冠上的宝石”的区域。
身份验证、授权、加密以及任何需要从网络或用户输入的内容都是不错的起点。
虽然采用内存安全并不能在一夜之间解决所有安全问题,但这是必不可少的第一步。
但即使是最好的程序员在使用并非天生内存安全的语言时也会犯内存安全错误。
通过使用内存安全的语言,程序员可以专注于编写更高质量的代码,而不是危险地与低级内存管理作斗争。
然而,我们必须认识到,不可能一夜之间重写所有内容。
OpenSSF 创建了一个C/C++ 强化指南,以帮助程序员在不显著影响现有代码库的情况下使遗留代码更安全。
根据您的风险承受能力,这是一条短期内风险较小的途径。
重写或重建完成后,还必须考虑部署。
许多关键基础设施工业控制系统不易被企业网络访问,因此重新部署重写的代码可能比重写本身花费的时间更长。
您对内存安全编程语言的未来有何看法?您是否预见到它们会成为特定领域的标准,还是传统语言将永远有一席之地?
在考虑特定行业或领域时,存在一个有趣的矛盾。
您不想急于将关键系统过渡到新语言,但具有讽刺意味的是,这正是其中一些安全属性最有价值的地方。
我们不知道内存安全语言是否会成为特定行业的标准,有些行业采用它们的速度会比较慢,因为它们出于安全或可靠性原因对过渡的要求更为保守。系
统稳定性与变化率之间存在反比关系。
使用内存安全语言开始新项目具有多种好处。
例如,Alpha-Omega 资助了 Rustls 的开发,这是 Prossimo 的一个项目,旨在在 Rust 中实现 TLS 和 QUIC。
通过用内存安全语言实现这些协议,我们可以避免 OpenSSL Heartbleed 漏洞等问题。
教育和社区支持在推动内存安全语言的采用方面发挥了多大作用?您会向寻求转型的开发人员推荐哪些举措或资源?
教育是我们拥有的最佳网络安全防御。许多小学已经开始教授 Python 作为第一门编程语言。
未来,我们希望看到其他内存安全语言(如 Rust)也能在早期引入。
此外,Rust 基金会还提供了一些工具和材料,包括《Rust 编程语言》——一本概述 Rust 的权威书籍。它还在开发培训和认证计划。