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