最安全的编程语言:Rust
星期二, 三月 23, 2021
在“安全优先”、“安全左移”、“供应链安全”的大趋势下,Rust作为一种更安全的编程语言越来越流行。
在IT巨头那里,Rust尤其受到重视。例如,微软曾专门委派一名实习生,用Rust重写一个至关重要的网络处理程序,该程序的内存安全漏洞过去让微软安全响应中心(MSRC)头疼不已。
Rust已经连续五年被开发人员评为“最受喜爱”的编程语言,因为它可以避免某些类型的内存安全错误,能从根本上改善软件漏洞的现状。
让Rust声名远播的优点还包括:提供C和C++的速度和控制能力,同时还提供了其他语言(例如Go和Python)的安全性和安全性保证。MSRC将近70%的漏洞归类为内存安全问题,因此消除此类漏洞至关重要。
MSRC软件工程师Alexander Clarke近日发文表达了对Rust的偏爱,他在博客中指出,尽管用C++编译可能会更容易,但是生成的程序更有可能出现错误和漏洞。
Alexander说:“Rust编译器的错误消息功能特别有用。”“通过错误消息,Rust能确切告诉你代码为什么不正确,并给出解决建议,从而落实了安全编程的概念。”
在Mozilla采用Rust为Firefox浏览器重写代码十多年之后,Rust可能已准备就绪。
虽然当前Rust的采用率仍然很低,根据“StackOverflow 2020开发人员调查”,仅5.1%的开发人员使用Rust语言,但许多大型公司已承诺在特定的开发项目中使用Rust。
从2016年开始,Mozilla基金会就开始在推出使用Firefox浏览器中的Rust语言开发的代码。2019年,微软表示其打算更广泛地采用Rust在Windows中编写系统软件。在2021年2月,Mozilla拆分了该项目,由新的Rust Foundation管理,项目的创始赞助商包括微软、谷歌、亚马逊和华为。
为什么Rust越来越受欢迎?
Rust Foundation的临时执行董事Ashley Williams表示,这不仅与速度和安全性有关,至少对开发人员而言也是如此:“实际上,人们对Rust的赞誉,不仅包括语言和编译器,还包括高人气的开发社区和一流的软件包管理器。”
对于企业而言,是否采用Rust取决于Rust的短板——Rust的缺点是什么?很多开发人员发现Rust的编译器喜欢无缘无故地报警并拒绝工作;某些编码模式会导致缓冲区溢出,释放后使用(use-after-free)漏洞,内存两次释放问题以及引用空指针。
虽然尚存在一些问题,瑕不掩瑜,Rust的安全性的回报足够诱人。以微软为例,Rust可以帮助微软消除大部分CVE漏洞。微软首席云开发倡导者Ryan Levick在一篇博客文章中说,使用编程语言构建核心系统组件可以帮助减少主要的漏洞来源。
他说:“我们相信Rust在编写安全系统软件方面会改变游戏规则。”“Rust提供编写底层系统所需的性能和控制,同时使软件开发人员能够编写健壮、安全的程序。”
当然,我们也需要留神编程语言安全性的过分夸大。
1996年1月,Sun Microsystems(升阳公司)宣布推出Java 1.0,鼓吹可移植代码(例如“一次编写,随处运行”),Sun还吹捧了许多安全属性,例如自动内存管理(即“垃圾回收”)以及类型安全性和防止小程序(Applets)修改系统资源的隔离功能等。
时至今日,根据StackOverflow调查,Java的使用率约为40%,仅次于JavaScript、HTML/CSS、SQL和Python,位居第五。但是,根据《2020年开源安全状况》,在2019年开源组件中发现的6,000多个漏洞中,Java程序占15%,仅次于C(占30%)和PHP(占27%)。
Java的案例表明,效率优先的开发人员通常不会使用安全功能,而是继续开发不安全的代码。
Rust的安全方法比Java更自以为是,很可能无法避免开发人员对安全性的破坏。尽管Rust提供了内存安全性,但它也提供了一种绕过方法——“UNSAFE”关键字。使用关键字是开发人员覆盖编译器并阻止编译器检查代码块的一种方法——因为开发人员拍胸脯担保该代码是安全的。
许多Rust爱好者认为滥用关键字会破坏Rust模型。Williams对此表示理解,她说:“有些人确实会用不安全的方式使用UNSAFE防护块。”“如果将内容放入不安全的块中,编译器将不会对其进行检查,如果这些内容有误,则可能会导致内存错误。”
但是她指出,即使使用了正确的编译器功能,漏洞也很可能会渗透到开发人员的程序中,但是安全研究人员和黑客往往会发现开发人员遗留下来的问题和漏洞。例如:重点关注Rust安全的站点RustSec列出了Rust软件包(或“crates”)和语言中的250多个漏洞。