微软:铁锈是业界安全系统编程的“最佳机会”

2020-06-14 00:02:50

微软云开发者倡导者瑞安·莱维克(Ryan Levick)在上个月的AllThingsOpen虚拟会议上表示,无论软件公司在工具和培训开发人员方面投入多少资金,“从本质上讲,C++并不是一种安全的语言。”他在一次虚拟演讲中解释了为什么微软正逐渐转向Rust来构建其基础设施软件,而不是C/C++。它正在鼓励其他软件行业巨头考虑同样的问题。

他说:“我们使用的语言非常古老,而且来自不同的时代,不能为我们提供保护自己免受此类漏洞伤害的能力。”“C++不是一种内存安全的语言,没有人会真的假装它是,”他说。

事实上,微软已经认为C++不再适用于编写任务关键型软件。该行业迫切需要为其低级系统工作转向性能良好、内存安全的语言。莱维克说,今天市场上最好的选择是铁锈。

今天,C和C++是编写核心系统软件的首选语言。它速度很快,代码和机器本身之间只有一次汇编。

但该行业正受到所有与内存相关的错误(其中许多是安全隐患)的困扰,这些错误都是由这些语言引起的。Levick说,现在,70%源自微软的CVE是内存安全问题。“没有真正的趋势,只是保持不变,”他说。“尽管我们做出了巨大的努力来解决这个问题,但这似乎仍然是一件常见的事情。”

从财务角度来看,考虑到补救这种与内存相关的无休止错误的成本飙升,这是有道理的。Levick说,早在2004年,每个与内存相关的错误给业界造成的损失约为25万美元,而微软的估计可能处于较低的水平。

当然,有许多提高C++安全性的努力,但是尽管每一种方法都是有效的,但都不能完全解决问题。

一种早已提出的方法是对程序员进行更多关于如何编写更安全代码的培训。但是,“没有任何证据表明,对C和C++开发人员进行整体培训实际上会以任何重要的方式解决这个问题,”Levick说,并引用了微软自己的大量开发人员内部培训。

静态分析是另一种可能的解决方案。但是静态分析带来了太多的开销:它需要连接到构建系统中。“所以有很大的诱因不使用静态分析,”Levick说,“如果默认情况下没有打开,那也无济于事.”

他说,运行时检查也是如此:“要知道何时使用了运行时检查合同,何时没有使用,这是不可能的,或者至少是极其困难的。”他补充说,这些合同也会带来运营开销。

为了应对这个与内存相关的错误问题,Microsoft安全响应中心发起了安全系统编程语言计划。在那里,有一些工作专门用来支撑C/C++。这里还创建了Verona,这是一种为安全低级编程而创建的新编程语言。但项目战略的第三个方面,也是他们最信任的一个,是支持“行业正面解决这个问题的最好机会”。

就性能而言,Rust与C/C++不相上下,甚至可能更快一些。Ruust通过包管理、现代测试框架等为开发人员带来了生产力。而程序员也喜欢它的“锈蚀”(Rust)。

但微软如此迷恋Rust的主要原因是它是一种内存安全的语言,只需最少的运行时检查。Rust擅长创建正确的程序。所谓正确大体上是指编译器检查程序是否有不安全的操作,从而减少运行时错误。不安全关键字是一个选项,但不是默认选项。不安全的锈代码几乎总是更大的安全代码的子集。不安全模式对于内存分配作业(如编写设备驱动程序)是必需的。但即使在这里,内存的不安全部分也被封装在API之后。

Levick说,这种安全编程的能力不应该掉以轻心。事实上,它可以提供超过10倍的改进,使其值得投资。这在很大程度上是因为几乎所有的C/C++代码都需要对不安全行为进行安全审核,而需要检查的用Rust编写的不安全代码只是大多数代码库的一小部分。

虽然微软看好Rust,但Levick承认微软核心开发者不会很快停止使用C/C++。

他说:“我们在微软有很多C++,这些代码哪儿也不会去。”“事实上,微软c++还在继续写,而且还会继续写一段时间.”

很多工具都是围绕C/C++构建的。特别是,Microsoft二进制文件现在几乎完全构建在Microsoft Visual C++编译器上,该编译器生成MSVC二进制文件,而Rust则依赖于LLVM。

然而,也许最大的挑战是文化。“只有一些人只想用他们已经会的语言完成他们的工作,”莱维克承认。

尽管如此,该行业似乎正在走向生锈。Amazon Web Services使用它,部分用于部署Lambda无服务器运行时,以及EC2的某些部分。Facebook已经开始使用Rust,苹果、谷歌、Dropbox和Cloudflare也是如此。

新堆栈不允许在此网站上直接发表评论。我们邀请所有希望讨论故事或发表评论的读者访问我们的Twitter或Facebook。我们也欢迎您通过电子邮件提供新闻提示和反馈:@thenewstack.io。