C语言和C++语言是不安全的。美国国家安全局(NSA)希望广大开发人员使用内存安全的语言,因为大多数安全漏洞都是由内存使用方面的漏洞引起的。美国国家安全局网络安全部门主任Neal Ziring表示,所有程序员都在犯“简单的错误”,这些错误“依然完全非常普遍”。他谈论了缓冲区溢出和释放后使用漏洞之类的问题。他给出的建议是:改用像Rust这样的语言,Linux内核团队的一些成员正在这么做。
这是怎么回事?IT外媒The Register的撰稿人Laura Dobberstein在《NSA敦促组织使用内存安全的编程语言》一文中写道:
“C和C++特别成问题”……美国国家安全局(NSA)近日发布了指导方针,鼓励众多组织将编程语言从C和C++之类的语言转向内存安全的替代语言,即C#、Rust、Go、Java、Ruby或Swift……该政府机构主要担心的是,恶意网络威胁分子可能会利用管理不善的内存中的漏洞,这种情况在为程序员提供更多选项和灵活性的语言中出现得较频繁。……内存安全语言结合使用编译时检查和运行时检查,自动保护程序员避免引入后来变成漏洞的错误……从2020年第一季度到2022年第一季度,Rust用户数量增加了两倍。……NSA断言,C和C++特别成问题,这是一种流行的观点。微软Azure首席技术官Mark Russinovich在9月份亮明了其观点,他认为是时候停止用这两种语言编写的任何新项目了。但就在发推文前一晚,他本人却在85000行Sysinternals代码中添加了C/ C++代码。
照我说的做,而不是照我做的做?Fudzilla网站的Nick Farrell在其撰写的《NSA希望企业转向内存安全的语言》一文中补充道:“软件内存安全问题”NSA在“软件内存安全”网络安全信息表中表示,恶意网络威胁分子可能利用糟糕的内存管理问题来访问敏感信息、散布未经授权的代码执行风险,并造成其他负面影响。NSA网络安全部门主任Neal Ziring说:“在开发软件时,我们不得不一致地使用内存安全语言及其他保护措施,以消除这些弱点。”……微软和谷歌都表示,软件内存安全问题导致了大约70%的漏洞。糟糕的内存管理也会导致技术性问题,比如不正确的程序结果、程序性能逐渐下降以及程序崩溃。70%?Neal Ziring及朋友们进一步阐述了“软件内存安全”这个主题。“内存漏洞是可以防止的”现代社会隐式信任开发人员编写的软件按照预期的方式运行,而且不会被恶意攻击。但是可被人利用的软件漏洞仍然通常基于内存问题。例子包括内存缓冲区溢出以及利用软件如何分配和回收内存方面的问题。……C和C++等通常使用的语言在内存管理方面提供了很大的自由度和灵活性,同时又严重依赖程序员对内存引用执行所需的检查。简单的错误可能导致可被人利用的基于内存的漏洞……NSA建议尽可能使用内存安全语言。使用静态应用程序安全测试和动态应用程序安全测试来分析软件无法使非内存安全的代码完全做到内存安全。而且对于恶意威胁分子说,绕过地址空间布局随机化(ASLR)和数据执行保护(DEP)并非不可实现……如果使用内存安全语言以及现有的代码强化防御措施,许多内存漏洞是可以被防止、被缓解或者很难被网络威胁分子利用的。哇。C++专家对此又有何看法?实际上,据Hacker News网站上的用户tialaramex显示,他们基本上同意:目前WG21(“C++标准委员会”)的一系列最新文件包括不止一份称我们应该停止说C和C++是不安全的……,但很显然Bjarne Stroustrup和Gabriel Dos Reis的P2687特别惹人瞩目……它为程序员们往往编写糟糕的代码而感到苦恼。……Bjarne和Gaby将这种情况称之为“紧急情况”。(但P2687)并没有花太多的时间解释如何解决这个问题(只是含糊地提及“静态分析”)。……只有政府中有人把这类事情真正当成回事,这个实际问题才会得到解决。还是那句话,编写糟糕的代码是开发人员的过错。Slashdot网站的用户DaPhil称之为“明摆着的事”:这再明显不过了,但令人惊讶的是,过了这么久才指出这一点……大多数人都不擅长编写良好的代码。所以,我们从使用的语言中得到的帮助越多越好。可以用C语言编写良好的代码吗?当然!只是比用Java或Rust编写同样良好的代码要困难得多。那么说Java“安全”公平吗?The Register网站上留言读者Sitta_europea这样写道:Java到底又如何呢?……近期一些最重大的灾难不是用它编写的(log4j和npm)吗?你可以证明任何一种计算机语言的软肋。这是NSA必须攻克的难题吗?Hacker News网站上的用户Mark_l_watson是这么认为的:我觉得很悲哀,在911事件发生后,NSA和FBI显然停止了之前在公开支持计算机安全方面的大量工作……作为一名美国纳税人,我希望看到他们优先考虑这种工作。当然,我们以前遇到过这种情况。不妨听听Slashdot网站上的用户david.emery的观点:当然,从最初的Ada83版本开始,Ada就一直是一种有意设计的内存安全语言。而NSA在可验证的SPARK子集和证明工具方面做了一些工作。当美国国防部放弃Ada方面的大量投入时,失去了另一个机会,之所以放弃Ada,是由于“Ada不是行业在投入的”(好像“行业在投入”是一个理由)。……我记得NSA出席Ada会议的场景……80年代末,我出席了SIGAda会议,坐在旁边的那个人别着身份证件,上面写着他的大名和“美国国防部”。我对他说:“您准是在NSA工作。”他很不高兴,说“是啊。你怎么知道的?”“来自国防部的其他所有人都标明其所在机构。只有NSA标明美国国防部。”与此同时,The Register上留言的用户Anonymous Coward也许年事已高,愤世嫉俗:也许我年事已高,愤世嫉俗,但我忍不住认为与其说“几十年后才能清理这个烂摊子”,实际上还不如说“几十年后才能把这副烂摊子换成另一副不同的烂摊子。”