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





























