美国国家安全局督促弃用c/c++,使用更安全的rustc#等!

CSDN云计算 CSDN云计算     2022-12-13     538

关键词:


作者 | 苏宓

出品 | CSDN(ID:CSDNnews)

如果说此前 Kotlin、Dart、Julia、Carbon 等后起之秀向老牌编程语言发起挑战进攻都是小打小闹,那么这一次 C、C++ 这几种常青藤编程语言则是真实地陷入了尴尬的境地。

近日,美国国家安全局(NSA)发布了最新的指南,鼓励多个组织将编程语言从 C/C++ 转为使用内存安全的语言,如 C#、Rust、Go、Java、Ruby 和 Swift,主要原因是这样可以帮助软件开发者和使用者预防并缓解软件内存安全问题,这些问题占可利用漏洞的很大一部分。

安全的第一大“杀手”——内存漏洞

一直以来,内存安全的漏洞引起多个企业与开发者的警觉。

根据长期关注内存漏洞的开发者 @LazyFishBarrel 的统计,苹果公司的 iOS 和 macOS 系统中 60%-70% 的漏洞是内存安全漏洞。

微软在 2019 年的一次会议上透露,从 2006 年到 2018 年,其发现的 70% 的漏洞都是因内存安全问题造成的。

据 Google 估计,Chrome 中存在了类似比例的内存安全漏洞,另外 90% 的 Android 系统漏洞也都是内存安全问题。

为此,NSA 认为,黑客极有可能会利用代码中管理不善的内存漏洞,而这种漏洞在程序员使用灵活性更高的编程语言时更容易出现。于是,其最新发布了《软件内存安全之网络安全信息指南》时,写道,「黑客可以利用这些漏洞进行远程代码执行或其他不利影响,这通常会危及设备,并且成为大规模网络入侵的第一步」,因此 NSA 建议各个组织尽可能使用内存安全语言,并通过代码强化防御(如编译器选项、工具选项和操作系统配置)来增强保护。

NSA 网络安全技术总监 Neal Ziring 表示,在开发消除此类漏洞的软件时,必须始终使用内存安全语言和其他保护措施。

C、C++ 成为重灾区

在 NSA 看来,我们常用的编程语言如 C 和 C++,在内存管理方面提供了很大的自由度和灵活性,但用这种语言开发的应用程序的安全性很大程度上需要依赖程序员的测试、检测环节。

不过,只要程序员自身稍微有些疏忽,简单的 Bug 也会带来严重的内存漏洞。

虽然当前行业中有很多软件分析工具能够检测到许多内存管理问题,操作环境选项也可以提供一些保护,但内存安全软件语言所提供的固有保护可以防止或减轻大多数内存管理问题。

针对这一问题,几年前,微软云开发推广部的 Ryan Levick 在分享微软为什么要从 C/C++ 转向 Rust 时,也曾直言,「无论软件公司在工具和人员的培训上投入多少精力也不能解决问题,因为 C++ 本质上就不是安全的语言」。他表示:“我们使用的语言由于年代久远、来自不同时代,无法为我们提供保护,让我们免受此类漏洞攻击。C++ 不是一种内存安全的语言,相信这一点无人有异议。”

近日来,微软 Azure CTO Mark Russinovich 也再次呼吁,「是时候停止使用  C/C++ 启动任何新项目」。

然而,众所周知,C 和 C++ 是编写核心系统软件的默认语言。这两门编程语言速度快,而且源代码可以直接汇编成机器语言。

虽然一边有很多企业高管呼吁不要用,但另一边也有很多人不信邪,不愿相信 C、C++ 语言的不足之处。

为此,有人称,“只要你不使用从 C 继承的任何功能,C++ 就是安全的”,亦或者“只要遵从现代 C++ 的类型和管用做法,就不会引发内存方面的漏洞”。针对这一争论,科技圈中有开发者现身说法,根据自身在大型 C++ 项目上(遵从现代的惯用做法)的开发经验,发表了《现代 C++ 救不了程序员》一文,用实例证明 C++ 提供的类型完全不能阻止漏洞的泛滥。

另外,也有人提出质疑,“为什么非要弃用 C、C++ 呢,有什么理由不能在 C、C++ 编译器中强制执行内存安全吗?”

针对这一点,有开发者进行回应:

这在以前就已经尝试过了。

但挑战是双重的。首先,如果在编译器强制执行内存安全,范围也只能局限在编译器上。然而,真正的内存安全实际上是(至少)线程安全、空值安全和类型安全,以及大多数人所想的原始边界检查等各个方面。除非你打算进入托管语言领域(Managed Language)并引入 GC,否则你需要语言级别的结构来允许程序员在这些新的边界内有效工作。例如,在 Rust 中,这就是 "所有权 "系统。

第二点是,如果总是把语言功能限制在一些有限的、更安全的范围内,或者用一些自定义的东西取代核心功能(例如 malloc 或编译器)。这就把你能使用的库限制在那些使用功能集的库上,并要求你无限期地维护这些核心功能。即便如此,你也不会得到 "真正的 "安全,因为这取决于每个人都很小心、不使用错误的功能、编译器,而你又非常确定你的核心实现本身是安全的。

因此,如果你全力以赴,与其需要一个特定的编译器,再加上一套不同的核心语言特性,再加上你需要确保所有的支持库都符合要求,再加上需要为静态分析和编译工具链定制支持工具,倒不如直接用一种新的语言,Rust 便是不错的选择。

Rust 是未来,但任重而道远

「弃用 C、C++,扶持 Rust」的争论经过几年的发酵持续到现在,愈演愈烈。与此同时,推动软件开发向使用内存安全语言发展的队伍也从最初微软、Google、亚马逊等大厂的倡议,逐渐拓展到具体的开发者们以及学术界,现如今也包括了 NSA 在列。

NSA 表示,使用内存安全语言可以帮助防止程序员引入某些类型的内存相关问题。

内存是作为计算机语言的一部分自动管理的,它不依赖于程序员添加代码来实现内存保护。内存管理通常是使用编译和运行时检查机制来实时自动保护。使用更加安全的语言,如 C#、Go、Java、Ruby、Rust、和 Swift 等语言,可以一定程度上保护程序员不会无意中引入内存管理错误。

不过,罗马并非一日之功。

要想用 Rust 将 C、C++ 取而代之,也需要很长的一段时间,为此 C++ 之父 Bjarne Stroustrup 在回应 C++ 与 Rust 之争时分享道,“直接替换 C++ 代码,或者让它们变得更加安全都是一项非常艰巨的任务,需要逐步慢慢地才能做到这一点。否则大量不安全的 C++ 代码将会永远存在。”

网络安全公司 Acronis 的 CISO Kevin Reed 在接受外媒 The  Register 采访时也说道,“多年来,使用 C 和 C++ 编写的代码数量巨大,即使我们明天都开始使用 Rust 和 Go,也需要几十年的时间才能清理这个烂摊子。” 

参考资料:

https://langui.sh/2021/12/13/apple-memory-safety/

https://www.theregister.com/2022/11/11/nsa_urges_orgs_to_use/

https://www.nsa.gov/Press-Room/News-Highlights/Article/Article/3215760/nsa-releases-guidance-on-how-to-protect-against-software-memory-safety-issues/

https://media.defense.gov/2022/Nov/10/2003112742/-1/-1/0/CSI_SOFTWARE_MEMORY_SAFETY.PDF

为什么我相信使用c语言可以保证内存安全?(代码片段)

...安全而生的语言,欲取代过往的C/C++,甚至美国国家安全局也于不久之前发布建议:弃用C/C++,使用更安全的Rust、C#等!不过,在本文作者、也是一位软件开发者、计算系统设计师看来,Rust... 查看详情

为什么我相信使用c语言可以保证内存安全?(代码片段)

...安全而生的语言,欲取代过往的C/C++,甚至美国国家安全局也于不久之前发布建议:弃用C/C++,使用更安全的Rust、C#等!不过,在本文作者、也是一位软件开发者、计算系统设计师看来,Rust... 查看详情

c++之父:rust等内存安全语言的安全性并不优于c++

在美国国家安全局(NSA)建议组织从C/C++切换到内存安全语言(如C#、Rust、Go、Java、Ruby或Swift)之后。C++之父BjarneStroustrup回应称,在他看来,NSA报告中提到的“安全”编程语言在重要应用程序中实际上并不优于C+... 查看详情

现金支付,下一个逝去的情怀?

...媒体报道,欧美等西方国家进行了一项关于“你是否愿意弃用现金”的调查,数据显示,超过三分之一的欧洲人和美国人愿意弃用现金,他们认为电子支付更加方便,而且安全性有保证,这些国家里已经有20%的消费者已这样做了... 查看详情

微软cto建议业界弃用c/c++采用rust,遭c++之父回怼

出品|OSC开源社区(ID:oschina2013)近日,MicrosoftAzureCTO、Sysinternals的主要开发者MarkRussinovich在其社交账号上发布动态称,开发人员是时候停止使用C/C++来启动新项目,并建议可在需要使用non-GC语言的场景中... 查看详情

颤动不安全的未经检查的操作并过度使用已弃用的 api 错误

】颤动不安全的未经检查的操作并过度使用已弃用的api错误【英文标题】:flutterunsafeuncheckedoperationandovertidingadeprecatedapierrors【发布时间】:2020-06-1907:37:17【问题描述】:我收到以下错误:Note:/Users/D/flutter/.pub-cache/hosted/pub.dartlang.... 查看详情

即使已弃用,在 Display 上使用 .getWidth 是不是安全

】即使已弃用,在Display上使用.getWidth是不是安全【英文标题】:Isitsafetouse.getWidthonDisplayeventhoughitsdeprecated即使已弃用,在Display上使用.getWidth是否安全【发布时间】:2012-09-2814:59:26【问题描述】:所以我有一个小问题,我正在编... 查看详情

如何在 Visual Studio 2019 中全局禁用 C/C++ 编译器的弃用警告?

】如何在VisualStudio2019中全局禁用C/C++编译器的弃用警告?【英文标题】:HowtodisabledeprecationwarningsforC/C++compilergloballyinVisualStudio2019?【发布时间】:2019-05-1521:15:19【问题描述】:我希望在VisualStudio2019的所有C/C++项目中默认禁用弃用... 查看详情

弃用警告:由于安全性和可用性问题,不推荐使用 Buffer()

】弃用警告:由于安全性和可用性问题,不推荐使用Buffer()【英文标题】:DeprecationWarning:Buffer()isdeprecatedduetosecurityandusabilityissues【发布时间】:2019-01-2808:17:02【问题描述】:我下载了下面的Angular项目并按照他们的说明进行安装... 查看详情

PHP chmod():不允许操作,涉及安全模式弃用?

】PHPchmod():不允许操作,涉及安全模式弃用?【英文标题】:PHPchmod():Operationnotpermitted,safe_modedeprecationinvolved?【发布时间】:2014-05-2900:19:24【问题描述】:我正在努力从PHP中掌握chmod()的概念,因为我目前正在学习的课程有点过... 查看详情

等级保护测评,新版测评证书启用,测评工作更专业规范

...级测评与检测评估机构服务认证证书》自颁发之日起即可使用,同步使用新的认证标志。该公告的原文如下:新版测评机构认证证书如下:天帷信息新版测评资质认证证书在启用新版测评机构认证证书的同时,关... 查看详情

androidndk和abi简介(代码片段)

...KNDK,NactiveDevelopkit本地开发工具集允许android应用程序使用C和C++代码的一套工具集。包含了android上的一些库和编译C和C++代码的脚本。能够使用NDK工具将C和C++代码编译成.so文件,然后在Java中使用。为什... 查看详情

几维安全告知勒索病毒愈演愈烈,但更可怕的僵尸网络还没开始呢!

...,但这还不是最坏的。与WannaCry一样,NotPetya也是利用了美国国家安全局(NSA)被盗的网络武器库中泄露的Wi 查看详情

c++boost库分类总结

...算法h)Tokenizer库:把字符串拆成一组记号的方法i)Wave库:使用spirit库开发的一个完全符合C/C++标准的预处理器j)Xpressive库:无需编译即可使用的正则表达式库容器库a)Array库:对C语言风格的数组进行包装b)B 查看详情

浅谈各部门网站检查技术的需求与实践

...求“各地区、各部门要对政府网站管理工作开展经常性的督促检查,并使之制度化、常态化,及时发现并妥善解决存在的问题。”通知提出“加大党政机关网站、电子邮件系统的安全检查力度,中央和国家机关各部门网站和省市... 查看详情

CRT 弃用警告

】CRT弃用警告【英文标题】:CRTdeprecationwarnings【发布时间】:2013-04-2610:32:04【问题描述】:根据SecurityEnhancementsintheCRT和SecureTemplateOverloads,可以使用_CRT_SECURE_NO_WARNINGS禁用与因安全问题而弃用的功能相关的警告。也可以使用_CRT_S... 查看详情

本机 UITextField 安全文本输入强制使用英语(美国)键盘

】本机UITextField安全文本输入强制使用英语(美国)键盘【英文标题】:NativeUITextFieldSecureTextEntryforcesEnglish(US)keyboard【发布时间】:2019-03-1301:25:24【问题描述】:我有一个非常简单的登录页面(登录名+密码)。我的用户是法国人... 查看详情

Spring RMI 的替代方案是啥? (因为它已被弃用)

】SpringRMI的替代方案是啥?(因为它已被弃用)【英文标题】:What\'sthealternativeforSpringRMI?(sinceit\'sdeprecated)SpringRMI的替代方案是什么?(因为它已被弃用)【发布时间】:2021-08-1611:43:44【问题描述】:Spring似乎正在弃用它的rmi:... 查看详情