最安全的編程語言:Rust
在“安全優(yōu)先”、“安全左移”、“供應(yīng)鏈安全”的大趨勢(shì)下,Rust作為一種更安全的編程語言越來越流行。
在IT巨頭那里,Rust尤其受到重視。例如,微軟曾專門委派一名實(shí)習(xí)生,用Rust重寫一個(gè)至關(guān)重要的網(wǎng)絡(luò)處理程序,該程序的內(nèi)存安全漏洞過去讓微軟安全響應(yīng)中心(MSRC)頭疼不已。
Rust已經(jīng)連續(xù)五年被開發(fā)人員評(píng)為“最受喜愛”的編程語言,因?yàn)樗梢员苊饽承╊愋偷膬?nèi)存安全錯(cuò)誤,能從根本上改善軟件漏洞的現(xiàn)狀。
讓Rust聲名遠(yuǎn)播的優(yōu)點(diǎn)還包括:提供C和C++的速度和控制能力,同時(shí)還提供了其他語言(例如Go和Python)的安全性和安全性保證。MSRC將近70%的漏洞歸類為內(nèi)存安全問題,因此消除此類漏洞至關(guān)重要。
MSRC軟件工程師Alexander Clarke近日發(fā)文表達(dá)了對(duì)Rust的偏愛,他在博客中指出,盡管用C++編譯可能會(huì)更容易,但是生成的程序更有可能出現(xiàn)錯(cuò)誤和漏洞。
Alexander說:“Rust編譯器的錯(cuò)誤消息功能特別有用。”“通過錯(cuò)誤消息,Rust能確切告訴你代碼為什么不正確,并給出解決建議,從而落實(shí)了安全編程的概念。”
在Mozilla采用Rust為Firefox瀏覽器重寫代碼十多年之后,Rust可能已準(zhǔn)備就緒。
雖然當(dāng)前Rust的采用率仍然很低,根據(jù)“StackOverflow 2020開發(fā)人員調(diào)查”,僅5.1%的開發(fā)人員使用Rust語言,但許多大型公司已承諾在特定的開發(fā)項(xiàng)目中使用Rust。
從2016年開始,Mozilla基金會(huì)就開始在推出使用Firefox瀏覽器中的Rust語言開發(fā)的代碼。2019年,微軟表示其打算更廣泛地采用Rust在Windows中編寫系統(tǒng)軟件。在2021年2月,Mozilla拆分了該項(xiàng)目,由新的Rust Foundation管理,項(xiàng)目的創(chuàng)始贊助商包括微軟、谷歌、亞馬遜和華為。
為什么Rust越來越受歡迎?
Rust Foundation的臨時(shí)執(zhí)行董事Ashley Williams表示,這不僅與速度和安全性有關(guān),至少對(duì)開發(fā)人員而言也是如此:“實(shí)際上,人們對(duì)Rust的贊譽(yù),不僅包括語言和編譯器,還包括高人氣的開發(fā)社區(qū)和一流的軟件包管理器。”
對(duì)于企業(yè)而言,是否采用Rust取決于Rust的短板——Rust的缺點(diǎn)是什么?很多開發(fā)人員發(fā)現(xiàn)Rust的編譯器喜歡無緣無故地報(bào)警并拒絕工作;某些編碼模式會(huì)導(dǎo)致緩沖區(qū)溢出,釋放后使用(use-after-free)漏洞,內(nèi)存兩次釋放問題以及引用空指針。
雖然尚存在一些問題,瑕不掩瑜,Rust的安全性的回報(bào)足夠誘人。以微軟為例,Rust可以幫助微軟消除大部分CVE漏洞。微軟首席云開發(fā)倡導(dǎo)者Ryan Levick在一篇博客文章中說,使用編程語言構(gòu)建核心系統(tǒng)組件可以幫助減少主要的漏洞來源。
他說:“我們相信Rust在編寫安全系統(tǒng)軟件方面會(huì)改變游戲規(guī)則。”“Rust提供編寫底層系統(tǒng)所需的性能和控制,同時(shí)使軟件開發(fā)人員能夠編寫健壯、安全的程序。”
當(dāng)然,我們也需要留神編程語言安全性的過分夸大。
1996年1月,Sun Microsystems(升陽(yáng)公司)宣布推出Java 1.0,鼓吹可移植代碼(例如“一次編寫,隨處運(yùn)行”),Sun還吹捧了許多安全屬性,例如自動(dòng)內(nèi)存管理(即“垃圾回收”)以及類型安全性和防止小程序(Applets)修改系統(tǒng)資源的隔離功能等。
時(shí)至今日,根據(jù)StackOverflow調(diào)查,Java的使用率約為40%,僅次于JavaScript、HTML/CSS、SQL和Python,位居第五。但是,根據(jù)《2020年開源安全狀況》,在2019年開源組件中發(fā)現(xiàn)的6,000多個(gè)漏洞中,Java程序占15%,僅次于C(占30%)和PHP(占27%)。
Java的案例表明,效率優(yōu)先的開發(fā)人員通常不會(huì)使用安全功能,而是繼續(xù)開發(fā)不安全的代碼。
Rust的安全方法比Java更自以為是,很可能無法避免開發(fā)人員對(duì)安全性的破壞。盡管Rust提供了內(nèi)存安全性,但它也提供了一種繞過方法——“UNSAFE”關(guān)鍵字。使用關(guān)鍵字是開發(fā)人員覆蓋編譯器并阻止編譯器檢查代碼塊的一種方法——因?yàn)殚_發(fā)人員拍胸脯擔(dān)保該代碼是安全的。
許多Rust愛好者認(rèn)為濫用關(guān)鍵字會(huì)破壞Rust模型。Williams對(duì)此表示理解,她說:“有些人確實(shí)會(huì)用不安全的方式使用UNSAFE防護(hù)塊。”“如果將內(nèi)容放入不安全的塊中,編譯器將不會(huì)對(duì)其進(jìn)行檢查,如果這些內(nèi)容有誤,則可能會(huì)導(dǎo)致內(nèi)存錯(cuò)誤。”
但是她指出,即使使用了正確的編譯器功能,漏洞也很可能會(huì)滲透到開發(fā)人員的程序中,但是安全研究人員和黑客往往會(huì)發(fā)現(xiàn)開發(fā)人員遺留下來的問題和漏洞。例如:重點(diǎn)關(guān)注Rust安全的站點(diǎn)RustSec列出了Rust軟件包(或“crates”)和語言中的250多個(gè)漏洞。
【本文是51CTO專欄作者“安全牛”的原創(chuàng)文章,轉(zhuǎn)載請(qǐng)通過安全牛(微信公眾號(hào)id:gooann-sectv)獲取授權(quán)】