撰稿丨诺亚
出品 | 51CTO技术栈(微信号:blog51cto)
此前,白宫曾发布报告,呼吁开发人员放弃C和C++等易受攻击的编程语言,使用内存安全的编程语言。
近日,C++之父Bjarne Stroustrup针对这一呼吁给出了回应。
“我发现,令人惊讶的是,撰写这些政府文件的人似乎对现代C++的优势视而不见,也忽视了其为提供强有力的安全保障所做的努力。另一方面,他们似乎也意识到了编程语言只是工具链的一部分,因此改进工具和开发流程至关重要。”
1、由来已久的矛盾:内存安全隐患
今年2月26日,白宫国家网络总监办公室(ONCD)发布了一份报告,敦促开发人员通过使用没有内存安全漏洞的编程语言来降低网络攻击的风险。
图片
报告直接将C++和C作为具有内存安全漏洞的两种反面示例。
“内存安全漏洞是一类影响内存如何以非预期方式访问、写入、分配或释放的漏洞。专家们已经确定了一些编程语言,它们既缺乏与内存安全相关的特性,又在关键系统中高度扩散,例如C和C++”。
图片
这份长达19页的报告还指出:“行业分析表明,在某些情况下,尽管有严格的代码审查以及其他预防和检测控制措施,但在内存不安全的语言中,高达70%的安全漏洞都是由于内存安全问题造成的。”
如果说C和C++是具有内存安全漏洞的编程语言的“反面案例”,那么Rust则是内存安全的编程语言的典例。
白宫在一份新闻稿中表示,科技公司“可以通过采用内存安全编程语言来防止整个类别的漏洞进入数字生态系统”。
所谓“内存安全编程语言”,指的是免受与内存访问相关的软件错误和漏洞的影响,包括缓冲区溢出、越界读取和内存泄漏。
值得一提的是,美国国家安全局(NSA)在2022年11月的一份网络安全信息表中将C#、Go、Java、Ruby 、Swift以及 Rust视为内存安全的编程语言。
此外,2023年12月,美国网络安全和基础设施安全局 (CISA)联邦调查局 (FBI) 以及来自澳大利亚、加拿大、新西兰和英国的国际网络安全机构合作,发布了联合指南《内存安全路线图案例》。
五眼联盟机构提到,尽管投入大量资源减少内存安全漏洞的普遍性,但该类型漏洞仍然存在。不过,使用内存安全编程语言应当能够消除这类安全缺陷并降低其影响,从而使开发人员和客户能够将资源投入到其它领域。
二、自1979年开始:C++的努力
关于内存安全漏洞的讨论由来已久,但作为C++的创造者,Stroustrup并不认同诸多政府文件对C++的指责。他强调,安全性提升一直是C++开发工作的目标。
Stroustrup指出:“从一开始就直至其不断演进的过程中,提高安全性始终是C++的目标。只需将K&R C语言与最早的C++进行比较,再将早期C++与现代C++对比就能看出这一变化。我在CppCon 2023主题演讲中概述了这一演变过程。许多高质量的C++代码都是基于RAII(资源获取即初始化)、容器和资源管理指针等技术编写的,而不是传统的、容易出错的C风格指针用法。”
图源:CppCon 2023主题演讲视频截图
Stroustrup提到了多项旨在提升C++安全性的努力。“关于安全问题有两个相关方面。数十亿行的C++代码中,很少完全遵循现代指南,而且人们对于哪些安全方面重要的认识各不相同。我和C++标准委员会正在设法解决这个问题。”
他指出的另外一点在于,“‘Profiles’是一个框架,用于指定一段代码所需的确保内容,并允许实现对其进行验证。委员会网站上有关于此的描述文档——查找WG21的相关资料,未来还将有更多内容发布。然而,我们中的一些人并不满足于等待委员会必然缓慢的进展。”
Stroustrup表示,“Profiles”是一个能够让我们逐步提升保证的框架,例如相对很快地消除大多数范围错误,并通过局部静态分析和最小运行时检查将保证逐渐引入大型代码库中。我对于C++的长期目标一直是,也仍然是在需要的时候和地方提供类型和资源安全性。当前对于内存安全的大力推动——这是我所追求的保证之一部分——或许会对我的努力有所帮助,这种努力在C++标准委员会中得到了许多人的共鸣。
三、所谓“内存安全”的语言,也从来不意味着高枕无忧
Stroustrup也不是第一次为C++辩护。2022年,美国国家安全局在一份公告中,建议组织改用内存安全的语言,而非C++和C。彼时,Stroustrup就曾针对性地进行发声。
“如果我认为这些'安全'语言中的任何一种在我关心的用途范围内优于C++,我不会认为C/C++的淡出是一件坏事,但事实并非如此。”
就像他在CppCon 2023会上提到的,“人们一般提到的安全性只涉及内存安全,但这还远远不够”。在他看来:
第一,“安全不仅仅是类型安全”。而很多人描述的“安全”仅限于内存安全,忽略了一门语言“可能(和将会)被用来违反某种形式的安全和保障的其他十几种方式。”
第二,要替换C++同样是一大问题。“假设我们将用大约七种不同的语言来取代 C++,到替换完成时(40 年后),我们可能会有 20 个不一样的语言选项,而且它们必须能够互操作。这会是一大难题。”
第三,语言的演化从来都是渐进的。“只在一头构建一个新系统,而不存在任何旧系统问题的想法是一种幻想。”遗憾的是,很多人都沉浸在这种幻想中。
关于美国国家安全局引用的所谓安全语言,Stroustrup表示,所有语言都容易受到未经静态验证的代码的攻击。此外,每个系统都必须使用硬件,而有效的硬件访问很少是安全的。
Stroustrup概述了他安全使用C++的策略:
- 静态分析以验证没有执行不安全的代码。
- 编码规则简化代码,使工业规模的静态分析可行。
- 库使这种简化的代码相当容易编写,并确保在需要时进行运行时检查。
美国国家安全局承认,即使在“内存安全”语言中,内存管理也不是完全安全的,静态和动态应用程序安全测试(SAST和DAST)等机制可用于提高所谓的非内存安全语言的内存安全性。但NSA表示,SAST和DAST都不能使非内存安全代码完全安全。
参考链接:
https://www.infoworld.com/article/3714401/c-plus-plus-creator-rebuts-white-house-warning.html
https://www.youtube.com/watch?v=I8UvQKvOSSw
https://www.infoworld.com/article/3686517/c-plus-plus-creator-bjarne-stroustrup-defends-its-safety.html
https://www.whitehouse.gov/wp-content/uploads/2024/02/Final-ONCD-Technical-Report.pdf