在“安全優先”、“安全左移”、“供應鏈安全”的大趨勢下,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多個漏洞。