過去十年,記憶體漏洞占整個產業漏洞的65%,但Google發現從2019年到2022年,Android的記憶體漏洞年度總數,從223個下降到了85個,而有這項安全性進展,Google歸因於Android的記憶體安全程式碼比例增加。

Google過去持續投資工具提高C/C++程式碼的安全性,之前幾個版本,Google在Android裝置上引入Scudo強化分配器、HWASAN、GWP-ASAN以及KFENCE,同時增加現有程式碼庫模糊測試的覆蓋率,運用這些工具發現更多C/C++程式碼漏洞,並減少未來新程式碼所包含的漏洞。

但即便Google在C/C++程式碼上做了這些努力,但他們認為這仍無法解釋Android漏洞巨幅減少的變化,而Google在審視開發策略後,認為Android從記憶體不安全語言持續轉移到記憶體安全語言,是這個現象的主要原因。

從Android 12開始,Google就在Android支援Rust程式語言,作為C/C++記憶體安全替代方案,而從那時起,Google也持續擴展Android開源專案(AOSP)中的Rust體驗和使用。Google表示,他們的目標並不是把現有的C/C++程式碼都轉換成為Rust,而是在新的程式碼使用記憶體安全語言開發。

在Android 13中,有約21%的新原生碼都是以Rust開發,在AOSP中已經有大約150萬行的Rust程式碼,涵蓋各種功能和元件,包括Keystore2、UWB堆疊、DN​​S-over-HTTP3、Android虛擬化框架等元件和開源相依項目。這些都是需要系統語言開發的低階元件,如果沒有Rust,Google就必須使用C++來實作。

到目前為止,在Android的Rust程式碼中發現的記憶體漏洞為零,Google提到,這是一個重要發現,因為過去Android漏洞密度大於1/kLOC,也就是說,每一千行程式碼至少會發現一個漏洞,與歷史資料相比,Rust可能已經阻擋數百個漏洞進入產品環境。

使用C/C++開發的功能不如預想中的運作迅速,Google提到,使用非記憶體安全語言,反而需要額外添加安全措施,而這些措施會讓程式執行的速度更慢。非記憶體安全的程式碼通常意味著開發者必須在安全性和效能之間權衡,像是添加沙盒、執行時緩解措施或是硬體保護等,都對程式碼的大小、記憶體和效能產生負面影響。

Google提到,在Android中使用Rust,能以更少的妥協最佳化安全性和系統健康。像是使用新的UWB堆疊能夠節省數MB的記憶體,並以現存的程序中執行避免IPC延遲,又或是新的DN​​S-over-HTTP3實作,能夠以安全的方法,使用更少的執行緒處理相同的工作量。

要從C/C++移植到Rust並不是一件簡單的事,Google持續增加Rust在Android平臺上的使用,為了實現更高的安全性和穩定性等目標,Google需要在更多原生碼中使用Rust,目前他們正在以Rust實作使用者空間HAL,並且已經將Android虛擬化框架中的虛擬機器韌體移植到Rust,也隨著Linux 6.1對Rust的支援,便能夠從核心驅動程式開始,對核心提供記憶體安全。

相關報導:從程式語言層級確保記憶體安全,不只美國NSA建議,今年Prossimo專案也在推動

熱門新聞

Advertisement