美国国家安全局督促弃用 C/C++,使用更安全的 Rust、C# 等!

ccbc3980724db1e6a1fba26c7ed5e4ed.gif

作者 | 苏宓

出品 | CSDN(ID:CSDNnews)

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

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

2ebe0978d65a84485e8e87dcaaabb54d.png

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

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

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

63944549bdf69e1f76f86e6b7ed9f71b.png

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

102390947f88026e43e0bbd0ad155b90.png

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

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

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

8f09fb6975f8d0fd652a54f6105ac99e.png

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 便是不错的选择。

175e9f5c3f5f96f28af8524cfa5bb4af.png

4d3e452d14c7db452eb22332e7c5bcd5.png

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

b7f0aa893067bf55682d6569bf386221.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DataFunTalk:阿里建设一站式实时数仓的经验分享

导读:大数据计算正从规模化走向实时化,实时大数据建设过程中开始面临很多的痛点和问题。本文内容整理于阿里资深技术专家姜伟华在DataFunTalk上的演讲,为大家介绍阿里巴巴基于一站式实时数仓Hologres建设实时数仓的经验和解决方案。 分享的内…

什么是真正的敏捷开发?敏捷开发与瀑布开发有何不同

什么是真正的敏捷开发?敏捷开发与瀑布开发有何不同。从本质上讲敏捷开发的一个重要目标是建立持续价值交付的能力。这种能力最终必须服务于业务的创新,促进业务的成功。 敏捷开发的目标——更早的交付 我们经常会说敏捷模式,那什么开发模式…

服务了 300 万微信开发者的这款产品,又升级了

从云开发到低代码甚至零代码,技术领域在发生快速的变化,腾讯、阿里、华为等云厂商也在持续布局。作为一线技术开发者,“不懂云开发或者低代码,在未来甚至都找不到工作”,绝不是危言耸听。由于背靠微信生态,…

基于 EasyCV 复现 ViTDet:单层特征超越 FPN

欢迎使用我们最近开源的EasyCV,主要聚焦于最新的Vision Transformer模型,以及相关的下游CV任务 开源地址: https://github.com/alibaba/EasyCV ViTDet其实是恺明团队MAE和ViT-based Mask R-CNN两个工作的延续。MAE提出了ViT的无监督训练方法…

数据湖构建—如何构建湖上统一的数据权限

背景信息 阿里云数据湖构建产品(DLF)提供的统一元数据服务,通过完善各种引擎/表格式生态解决了数据湖场景下多引擎面临的数据孤岛和元数据一致性问题,实现了开源大数据引擎及数据湖格式元数据的统一视图,避免了各引擎…

从阿里云容器攻防矩阵API安全生命周期,看如何构建金融安全云原生平台

【编者按】云原生技术正在助力银行通过差异化业务进行创新,却也带来了由于研发/运维人员对新架构不熟悉所导致的基础设施风险、业务风险及数据暴露风险。如何在飞速更迭的技术环境下保持业务持续发展,同时保证业务整体的安全性,满足不断增强的…

StarRocks X Flink CDC,打造端到端实时链路

实时数仓建设背景 实时数仓需求 随着互联网行业的飞速发展,企业业务种类变得越来越多,数据量也变得越来越大。以 Apache Hadoop 生态为核心的数据看板业务一般只能实现离线的业务。在部分领域,数据实时处理的能力已经成为限制企业数据变现的…

使用 Databricks+Mlflow 进行机器学习模型的训练和部署

ML工作流的痛点 机器学习工作流中存在诸多痛点: 首先,很难对机器学习的实验进行追踪。机器学习算法中有大量可配置参数,在做机器学习实验时,很难追踪到哪些参数、哪个版本的代码以及哪个版本的数据会产生特定的结果。其次&#x…

数字工业 弹性安全丨2022 Fortinet工业互联网安全发展峰会成功举办

随着数字化转型的持续推进,工业互联网的作用和地位日益加强。而 OT 安全作为工业互联网体系不可或缺的部分,虽然受到越来越多企业的关注,但仍然面临着多方面的挑战。11月16日,一年一度的 OT 安全盛会——2022 Fortinet工业互联网安…

团队管理|如何提高技术 Leader 的思考技巧?

技术Leader是一个对综合素质要求非常高的岗位,不仅要有解具体技术问题的架构能力,还要具备团队管理的能力,更需要引领方向带领团队/平台穿越迷茫进阶到下一个境界的能力。所以通常来说技术Leader的技能是虚实结合的居多,繁杂的工作…

关于 Data Lake 的概念、架构与应用场景介绍

数据湖(Data Lake)概念介绍 什么是数据湖(Data Lake)? 数据湖的起源,应该追溯到2010年10月,由 Pentaho 的创始人兼 CTO, James Dixon 所提出,他提出的目的就当时历史背景来看,其实…

蚂蚁链牵头两项区块链国际标准在ITU成功立项

近日,国际电信联盟第十六研究组(简称ITU-T SG16)召开全体会议。会上,由蚂蚁链牵头的两项区块链国际标准获得立项通过。包括: ITU-T H.DLT-SCLMR “Smart contract lifecycle management requirements for distributed…

使用 Databricks 进行营销效果归因分析的应用实践

本文介绍如何使用Databricks进行广告效果归因分析,完成一站式的部署机器学习,包括数据ETL、数据校验、模型训练/评测/应用等全流程。 内容要点: 在当下的信息化时代,用户每天都会收到媒体投放的广告信息,如何做到精准…

5年磨一剑|优酷Android包瘦身治理思路全解

稳定性、性能、包大小,在移动端基础用户体验领域“三分天下”,是app承载业务获得稳定、高效、低成本、快速增长的重要基石。其中,包大小对下载转化率、拉新拉活成本等方面的影响至关重要,这在业界已经成为共识,近年来头…

2022年“移动云杯”算力网络应用创新大赛圆满落幕,百万大奖揭晓!

11 月 17-18 日,2022 年移动云开发者技术论坛暨“移动云杯”算力网络应用创新大赛总决赛在苏州举行。活动现场公布了 2022 年“移动云杯”算力网络应用创新大赛总决赛获奖名单。同时重磅发布了移动云 openAPI 2.0、首届移动云量子计算大赛。 三大赛道齐发力&#xf…

代码注释的艺术,优秀代码真的不需要注释吗?

前言 前天回家路上,有辆车强行插到前面的空位,司机大哥吐槽“加塞最可恶了”,我问“还有更可恶的吗”,司机大哥淡定说道“不让自己加塞的”。似乎和我们很类似,我们程序员届也有这2件相辅相成的事:最讨厌别…

DataProcess-VOC数据图像和标签一起进行Resize

VOC数据图像和标签一起进行Resize 参加检测比赛的时候,很多时候工业原始数据尺度都比较大,如果对数据不提前进行处理,会导致数据在加载进内存时花费大量的时间,所以在执行训练程序之前需要将图像提前进行预处理。对于目标检测的数…

元宇宙持续升温,金蝶推出数字员工破圈而来

作者 | 伍杏玲 “金小蝶,请分析今年企业销售事业部的业绩”。 话音刚落,大屏幕展开一张张账务报表,一位身着西装,举止大方得体的数字人条理清晰地回复:“截至今年10月,企业销售事业部在签单金额、新签收入…

阿里云易立:云原生如何破解企业降本提效难题?

2020年以来,新冠疫情改变了全球经济的运行与人们的生活。数字化的生产与生活方式成为后疫情时代的新常态。今天,云计算已经成为全社会的数字经济基础设施,而云原生技术正在深刻地改变企业上云和用云的方式。如何利用云原生技术帮助企业实现降…

Alibaba/IOC-golang 正式开源 ——打造服务于go开发者的IOC框架

IOC(inversion of control)即控制反转,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。IOC-golang 是一款服务于Go语言开发者的依赖注入框架,基于控制反转思路,方便开发人员搭建任何…