当前位置: 首页 > 科技观察

C++之父又“出手”了,美国安全局也要摸一摸

时间:2023-03-13 01:38:30 科技观察

徐杰成评论|严政在过去的2022年,C++以4.62%的流行增长率,近20年来首次夺得TIOBE年度编程语言桂冠。作为C++语言的缔造者,C++之父BjarneStroustrup最近显得有些“暴躁”。去年9月,微软CTOMarkRussinovich在其社交账号上发文称,开发者是时候停止使用C/C++开始新项目了,并建议在非GC语言场景下使用Rust。对此,比亚恩在接受采访时也回应了马克的言论。然而,就在事件平息后不久,一个更有影响力的组织又将矛头指向了C++。2022年底,美国国家安全局(NSA)在其《Software Memory Safety》报告中指出,C和C++语言并不安全。建议组织放弃使用C/C++,并鼓励组织将编程语言从C和C++等转移到更安全的替代语言——例如C#、Rust、Go、Java或Ruby。对此,NSA网络安全主管NealZiring在接受采访时也表示,所有的程序员都在犯简单的错误,而且这些错误仍然非常普遍。NSA的这份报告也激发了Bjarne再次战斗的欲望。经过数周的准备,Bjarne最近发表了一篇名为《Think seriously about“safety”;then do something sensible about it》的论文,正式回应了NSA的一系列言论。而此次双方的对话,也让C++这一有着近30年历史的古老编程语言再次被推到了风口浪尖。1.NSA:少用或禁用C/C++在《Software Memory Safety》的报告中,NSA指出现代社会严重依赖自动化和对软件的隐性信任。如果开发人员编写的软件无法按预期运行,则意味着有时我们将不得不出于恶意目的而妥协。目前,恶意利用软件漏洞往往是基于内存问题,典型的例子就是内存缓冲区丢失。例如,微软在2019年的一次会议上表示,从2006年到2018年,70%的漏洞是由内存安全问题引起的。恶意攻击者可以利用这些漏洞进行远程代码执行或其他非法活动。谷歌近年来也在Chrome浏览器中发现了类似的内存安全漏洞。常用的语言,如C和C++,虽然提供了很大的自由度和灵活性,但在涉及到内存管理时,过于依赖程序员来执行所需的内存引用检查。因此,简单的错误可能会导致基于内存的漏洞和可利用漏洞。虽然软件分析工具可以监控许多内存实例,托管事务和操作环境选项可以提供一些保护,但内存安全语言的固有保护可以防止或减轻大多数内存管理问题。技术上的缺陷会让不良行为者更容易找到有问题的代码,而使用内存安全语言可以防止程序员引入某些类型的内存相关问题。它们的语言特性将防止程序员无意中引入的内存管理错误。因此,NSA建议组织选择“聪明的东西”——减少或禁用固有内存保护问题的编程语言,例如C/C++,使用内存安全的语言,例如C#、Rust、Go、尽可能使用Java或Ruby。2.Bjarne:你根本不懂C++“认真考虑‘安全’,然后采取一些明智的措施”这是Bjarne对NSA论文的回应标题。“太多人谈论神话般的C和C++,然后开始关注C语言的弱点,但这些缺点在C++中完全可以避免,C++可以更直接地表达程序员的想法。”Bjarne在文章中表示,许多C++用户停滞不前,NSA完全无视C++在过去30年的进步,将C与C++混为一谈,令人非常遗憾。“现在,如果我认为这些‘安全’语言中的任何一种在我所说的我关心的用途范围内优于C++,我不会认为C/C++的衰落是件坏事,但事实并非如此”.Bjarne提到NSA的“安全”概念仅限于内存安全,忽略了一个事实,即一种语言可能被用来违反某种形式的安全保证和其他十几种方式。安全的目标应该是类型和资源安全,每个对象根据其类型使用,并且没有资源泄漏。对于C++,这意味着一些运行时规范检查,消除通过空指针的访问并避免类型转换和滥用联合。C++提供了高级工具,例如容器、跨度、范围for循环和变量,这些工具可以在不影响生产力或效率的情况下提供保证。对于NSA提到的所谓安全语言,Bjarne表示,所有语言都容易受到未经静态验证的代码攻击。每个系统都必须使用硬件,而有效的硬件访问很少是安全的。此外,Bjarne还提供了一些安全使用C++的策略:静态分析以验证没有不安全的代码被强制执行编码规则以简化代码,使工业规模的静态分析成为可行的库,使简化的代码更易于编写,并确保检查运行时需要时Bjarne提到,目前全球有数百万的C++程序员和数十亿行C++代码,该语言的应用包括航空航天、医疗仪器、人工智能/机器学习、知识图谱、生物医学等领域,高能物理等等,我被NSA的言论震惊了。此外,在文章的最后,Bjarne还向NSA提出了一个灵魂拷问:据我所知,没有专家在发布报告之前通知过C++标准委员会。什么叫“见仁见智”?列一个清晰的清单。3.谁输谁赢并不重要。诚然,C++之父和美国国家安全局给开发者做了一顿大餐。但在这场针锋相对的战斗中,谁输谁赢真的不重要。C++不安全,C++安全。从辩证的角度来看,这两种说法都是正确的。我们必须承认,NSA提出的是某些语言在内存安全保证方面比C++具有更好的语言特性;而对于Bjarne的回应,在合理使用工具和保证规范的前提下,C++确实可以保证其安全性。C++作为一门有着30年历史的老牌编程语言,时至今日依然能够保持强大的竞争力,稳居编程语言排行榜的前列。在进化效率下。正如Bjarne所说,今天我们有数十亿行C++代码,基于C++编写的软件运行在世界的每一个角落。无论过去还是现在,世界上每天都在产生大量的C++代码和C++开发人员,而且这种趋势在未来还会继续。每种语言都有自己的优缺点和适合的应用场景。世界上没有最好的编程语言,只有最合适的编程语言。下面是网友在Slashdot上的留言:你能用C++写出安全的代码吗?当然,您可以使用C、ASM甚至任何成熟的编程语言来完成。与任何成熟的语言一样,关键问题不在于能不能做到,而在于如何更好地选择和使用它们。参考链接:https://img.ydisp.cn/news/20230203/z5dfgok4d3j