安卓系統(tǒng)支持rust語言,以預(yù)防內(nèi)存安全漏洞
4月6日,谷歌宣布安卓操作系統(tǒng)開源版本將支持Rust編程語言以預(yù)防內(nèi)存安全相關(guān)的漏洞。內(nèi)存安全漏洞是安卓系統(tǒng)穩(wěn)定性問題的主要元兇,大約70%的安卓高危安全漏洞都與內(nèi)存安全相關(guān)。而C和C++中的內(nèi)存安全漏洞是最難解決的問題。Java 和Kotlin 語言是安卓應(yīng)用開發(fā)最好的選擇,這些語言容易使用、安全、輕便。Android Runtime (ART) 會以開發(fā)者的身份去管理內(nèi)存。安卓操作系統(tǒng)廣泛使用Java 來保護安卓平臺免受內(nèi)存漏洞的影響。但是,對于底層操作系統(tǒng)的開發(fā),Java 和Kotlin 語言并不理想。
操作系統(tǒng)底層需要像C、C++、Rust這樣的編程語言,這些語言的控制性和預(yù)測性比較好,可以提供對底層系統(tǒng)資源和硬件的訪問控制,而且在提供相同的可預(yù)測的性能特征的基礎(chǔ)上需要的資源很少。
對C和C++,開發(fā)者要負責(zé)管理內(nèi)存的全生命周期,因此很容易出現(xiàn)錯誤,尤其是在復(fù)雜和多線程的代碼庫中。Rust語言通過使用編譯時檢查和運行時檢查來確保內(nèi)存的安全。編譯時檢查來進行對象生命周期和所有權(quán)的檢查,通過運行時檢查來確保內(nèi)存訪問是有效的。而且性能不差于C和C++。
C和C++語言并不提供安全保證,需要進行隔離。所有的安卓進程都是沙箱的,并遵循Rule of 2規(guī)則,即給定3個選項,開發(fā)者智能從中選擇2個。
對安卓來說,這意味著如果代碼是用C或C++寫的,在分析不可靠的輸入時就會有非常嚴格的限制和沒有特權(quán)的沙箱。由于遵循Rule of 2規(guī)則會帶來很多的限制,因此會降低安全漏洞的嚴重性和危險性。但是沙箱并不是輕量級的,由于IPC和其他的內(nèi)存使用帶來額外的消耗和延遲。沙箱并不能完全消除代碼中的漏洞,攻擊者可以鏈接其他漏洞來發(fā)起攻擊。
Rust這類內(nèi)存安全的語言可以幫助解決這些問題:
- 可以降低代碼中漏洞的密度,提高當(dāng)前沙箱的有效性;
- 通過引入安全和輕量級的新特征來減少對沙箱的需求。
Rust融合了許多其他語言的特征,可以改善代碼的正確性:
- 內(nèi)存安全性:通過編譯時檢查和運行時檢查來確保內(nèi)存安全;
- 數(shù)據(jù)并發(fā):防止數(shù)據(jù)競爭條件,用戶可以用Rust編寫高效的、線程安全的代碼;
- 更具表現(xiàn)力的系統(tǒng):幫助預(yù)防邏輯編程漏洞,如新型封裝、枚舉變種等;
- 引用和變量默認是不可變的:幫助開發(fā)人員遵循最小特權(quán)安全原則。雖然C++有const,但是往往很少使用,而且不一致。相比之下,Rust 編譯器· 可以通過為從未變異的可變值提供警告,避免誤變注釋。
- 標(biāo)準庫中更好的安全處理:在結(jié)果中封裝可能失敗的調(diào)用,引發(fā)編譯器要求用戶檢查沒有返回所需值的函數(shù)的錯誤。這可以預(yù)防Rage Against the Cage這樣的漏洞。
- 初始化:要求所有的變量在使用前都進行初始化。未初始化的內(nèi)存漏洞是安卓系統(tǒng)中3~5%的安全漏洞的根本原因。Rust要求所有的變量在使用前初始化為其類型的合法成員,避免初始化為不安全值的情況。
- 更安全的整數(shù)處理:Rust 默認啟用了溢出處理,避免溢出相關(guān)的漏洞產(chǎn)生。此外,所有的整數(shù)類型轉(zhuǎn)化都是顯式轉(zhuǎn)化,開發(fā)者不能在分配變量或進行其他類型的算數(shù)運算時的函數(shù)調(diào)用中進行轉(zhuǎn)化。
本文翻譯自:https://security.googleblog.com/2021/04/rust-in-android-platform.html如若轉(zhuǎn)載,請注明原文地址。