內核程式碼庫 Linux6.18 版本的基礎是採用用 Rust 語言編寫的 Binder 進程間通訊機制。 Binder 用於… Android 組織進程間互動和遠端方法呼叫(一個進程) Android 可能會呼叫另一個進程中的方法或函數 Android(使用 Binder 來識別、呼叫進程並在進程間傳遞參數)。 Binder 的程式碼已用 Rust 重寫,作為一項旨在提高安全性、推廣安全編程實踐並提高記憶體問題檢測效率的專案的一部分。 Android (約佔所有已識別危險漏洞的70%) Android(由記憶體操作錯誤引起)。
使用 Rust 使我們能夠解決 Binder 開發人員遇到的幾個問題,包括與引用計數、鎖定和邊界檢查相關的錯誤,並顯著降低錯誤處理的複雜性。 Binder 的 Rust 實作與原始 C 實作功能完全相同,並通過了所有 AOSP 測試(Android 開源專案),可用於建立工作版本 Android-韌體.儘管 Rust 驅動程式具有高級功能並支援具有複雜所有權語義的對象,但它比 C 版本要小——5.5 行程式碼對 5.8 行程式碼。
在commit描述中,作者提到了重寫Binder的以下原因:
- Binder 已經開發了 15 年,在此期間,其功能和複雜性顯著增加——該專案處於所有組件的交匯點。 Android 並且涵蓋了除IPC之外的各種任務:
- 正確分析和轉換可能包含多個相互作用的不同類型物件(例如指標、文件描述符)的交易內容;
- 控制使用者空間線程池的大小,並確保將事務指派給線程,以避免在線程池耗盡線程時出現死鎖;
- 追蹤進程間共享物件的引用計數器,正確傳播進程間引用計數器的變化;
- 處理多種錯誤場景,並結合 13 種不同的鎖、7 個引用計數器和原子變數。它必須盡可能快速、正確地執行這些任務。
- 遺留程式碼累積了大量技術債務,使得錯誤檢測和後續開發變得複雜。例如,核心程式碼包含超過一千行的大型函數、有問題的錯誤處理方法以及複雜的結構。
- Binder 是一個安全關鍵元件。 Android由於運行在隔離沙箱環境中的平台元素(例如 Chrome 渲染進程和軟體編解碼器)可以直接存取 Binder,因此 Binder 中的漏洞允許繞過沙箱。 Binder 的高度複雜性以及技術債使得維護其高安全性變得非常具有挑戰性。
來源: opennet.ru
