C++ 创始人 Bjarne Stroustrup 为这种已经广泛使用的编程语言进行了辩护,回应拜登政府的发布的语言安全报告,这份报告呼吁开发人员使用内存安全语言,并避免使用C++和C等易受攻击的编程语言。
就在 3 月 15 日,在对技术媒体的访谈回复中,Stroustrup 指出了 1979 年设计的 C++ 的优势,包括安全保证。
Stroustrup 说:“在某一方面,他们似乎已经意识到编程语言只是工具链的一部分,因此改进的工具和开发流程至关重要。”
Stroustrup 还强调,安全性改进始终是 C++ 开发工作的目标。
“从第一天起以及整个发展过程中,提高安全性一直是 C++ 的目标。人们只要将K&R C语言与最早的C++,拿早期的C++与当代的C++进行比较即可。
他还在CppCon 2023 主题演讲中描述了这一演变:“许多高质量的 C++ 都是使用基于 RAII(资源获取初始化)、容器与资源管理指针等技术编写,而不是传统的 C 风格的混乱指针。”
美国白宫在2 月 26 日发布的报告中,呼吁开发人员通过使用不存在内存安全漏洞的编程语言来降低网络攻击的风险。报告中未明确指明,但C++ 和 C 被认为是存在内存安全漏洞的语言的两个典型。
美国国家安全局 (NSA)于 2022 年 11 月发布网络安全信息表,已经将 C#、Go、Java、Python 和 Rust 列为被认为内存安全的语言。
美国国家安全局 (NSA) 的技术总监尼尔·齐林 (Neal Ziring)一直在投一些"真相炸弹":
“内存管理问题已经被利用了几十年,并且在今天仍然非常普遍”。类似于如下代码:
int main() {
int *memory;
// Allocate 200 ints.
memory = malloc(200 * sizeof(int));
// Allocate 100 more ints.
// ERROR: This will compile, but will leave the previously
// allocated memory hanging, with no way to access it.
memory = malloc(100 * sizeof(int));
// Free second block of 100 ints.
// The first block is not freed.
free(memory);
return 0;
}
malloc函数的功能是分配内存。第一次使用时分配的内存永远不会被释放。
如果像这样不断分配内存且从不释放,则攻击者可能能够使用它来对软件执行拒绝服务攻击,导致服务器的内存不足。
在面临这样的安全报告,Stroustrup 列举了许多提高 C++ 在安全性方面的努力。
“事实上存在两个与安全相关的问题。在数十亿行 C++ 代码中,很少有完全遵循现代准则的,而且人们对安全的某些重要方面的看法也不尽相同。我和 C++ 标准委员会正在努力解决这个问题。”
Stroustrup说:
“配置文件是一个框架,用来指定一段代码需要什么保证,并启用实现来验证它们。在C++委员会网站上有描述这一点的文件(关键字:WG21),并且还会有更多文件的可以查阅。但是,我们中的一些人没有心情等待委员会有一些缓慢的进展。”
Stroustrup 还表示,“Profiles 是一个框架,它允许我们逐步改进质量与安全保证。例如,相对较快地消除大多数范围错误,并通过本地静态分析和最少的运行时检查,逐步将安全保证引入大型代码库。我对 C++ 的长期目标是,让 C++ 在需要的时间和地点提供类型和资源安全性。也许当前对内存安全的推动是我想要保证的一个子集,也将证明我的努力将会有帮助,C++ 标准委员会的许多合作伙伴也认同这一点。”
Stroustrup此前针对 NSA 捍卫了 C++ 的安全性表示赞赏,但之后 NSA 在2022 年 11 月的公告中,建议开发者使用内存安全语言,而不是 C++ 和 C。
内存安全且能自动管理内存的编程语言,众所周知的有:C#、Go、Java、Ruby、Rust 和 Swift等。