白宫想要内存安全编程,但这是什么?

核心要点

  • 白宫强烈建议采用诸如 Rust 之类的内存安全语言,以减少代码中潜在的安全隐患。
  • 诸如 C 这样的传统低级语言,其代码存在导致安全事件的风险。
  • Rust 等内存安全语言具备自动内存管理和错误预防机制。

美国政府机构已发布指令,建议程序员优先考虑使用像 Rust 和 Java 这样的内存安全语言。那么,这些语言的优势到底是什么,它们的采用真的至关重要吗?

白宫的立场是什么?

在2月26日发布的声明中,白宫国家网络安全主任办公室(ONCD)呼吁软件开发者积极采用 Rust 等内存安全的编程语言。

ONCD 指出

作为一个国家,我们有责任也有能力缩小网络攻击面,防止各种安全漏洞侵入数字生态系统。这需要我们着力解决向内存安全编程语言过渡的难题。

为何至关重要?

ONCD 成立于 2021 年,直接向总统汇报工作,就网络安全及相关问题向总统提供建议。美国的政策走向通常会对整个科技行业产生深远的影响。

许多最严重的安全漏洞,其根源都可追溯到内存安全问题。传统低级语言虽然赋予程序员较大的操作权限,但也增加了因错误代码造成严重后果的风险。

尽管如此,内存安全语言(如 Rust、Python 和 JavaScript)的使用率长期以来一直在稳步攀升。ONCD 的这一呼吁,很可能源于像 C 这样安全性较低的语言已经存在很长时间,它们的遗留代码已经深深扎根于基础设施和我们日常使用的许多软件中。

不安全语言的典型特征是什么?

不安全的代码并不总是显得可怕或复杂。 我们以一个简单的 C 程序为例:

#include <stdio.h>

int main(void) {
int arr[3] = {0, 0, 0};
printf("%d\n", arr[3]);
return 0;
}

这是一个典型的错误示例,可能会导致缓冲区溢出攻击。程序员忽略了 C(以及大多数其他语言)中的数组索引是从零开始的,这意味着第一个元素位于 `arr[0]`。因此,尝试访问 `arr[3]` 是错误的,但 C 允许这样的错误发生:

访问 `arr[3]` 时所指向的内存地址是合法的,它与其他任何地址一样,只是不属于该数组。任何值都可能存储在那里,访问或写入它的后果可能从程序崩溃到灾难性的安全事故。历史上,许多黑客正是利用此类漏洞发起攻击。

即使 C 编译器会发出警告,它仍然会生成可执行文件。程序员可以自由地忽略警告,甚至使用编译器标志将其隐藏。C 允许程序员自己“搬起石头砸自己的脚”,而像 Rust 这样的语言根本不允许出现这种情况。

内存安全代码是什么样的?

在像 Rust 这样的内存安全语言中,上述问题根本不会存在。以下是 Rust 中等效的程序:

fn main() {
    let arr: [u32; 5] = [0;3];
    println!("{}", arr[3]);
}

虽然此代码在语法上是正确的,但 Rust 编译器将拒绝编译它:

编译器会明确指出问题所在,并拒绝生成可执行文件。Rust 根本不会允许你运行这段代码。

除此之外,Rust 还提供了更多安全保护功能。它包括智能指针等特性,可以自动管理内存并防止空指针解引用。

我应该切换语言吗?

每种编程语言都有其特定的用途,因此我们应该对任何绝对化的建议保持警惕,即使这些建议来自政府机构。尽管你可能会选择专注于某一特定语言,但学习多种语言总是有益的,这能扩大你的选择范围。

内存安全是许多现代语言的特性,至少应该熟悉其中的一种。C 有其用武之地,但也有更安全的选择可以降低意外发生的可能性。特别是,如果你在寻找一种高效且具有良好安全机制的语言,那么 Rust 绝对值得尝试。