隨著越來越多的嵌入式設備相互連接,安全性已經成為幾乎每個設備的主要組成部分。在過去幾年中,我們已經看到了支持安全性的硬件技術的改進,如Arm TrustZone和多核微控制器。但是,許多安全漏洞是由糟糕的編程實踐造成的。在某種程度上,部分問題源于傳統的嵌入式編程語言,如C和C++沒有內置內存安全。因此,嵌入式開發人員必須管理內存安全;因此,不良實踐會導致安全漏洞。
近年來,軟件行業越來越傾向于使用內存安全的程序語言。從基于微控制器的系統角度來看,Rust是很適合的語言。然而,切換語言并非易事。在我們研究各種嵌入式編程語言中的內存安全細節之前,讓我們來探討一些導致嵌入式系統中漏洞的內存安全問題。
內存安全風險
最常見的漏洞之一是緩沖區溢出。當讀取或(更常見的是)寫入數組邊界之外的數據時,會發生緩沖區溢出。緩沖區溢出會導致內存損壞,如果處理得當,還會讓對手注入可執行代碼。利用注入的代碼,對手可以使程序崩潰,收集用戶、網絡數據,并使系統為所欲為。
另一個經常被利用的漏洞與內存的分配和釋放方式有關。例如,某個應用程序可能分配了內存,但從未釋放它,從而導致內存泄漏。此外,應用程序可能會嘗試訪問已經釋放的內存,這可能會導致崩潰,并有機會利用系統。
競爭條件也可能是漏洞的來源。例如,在嵌入式開發中,如果有兩個任務或一個中斷,而主程序正在讀寫一個內存位置,就可能發生爭用情況。當從存儲器位置讀取時,另一個可能試圖寫入它。如果寫入程序可以中斷讀取,則有可能在競爭條件下破壞讀取值,從而導致崩潰或意外的系統行為。
內存安全的語言與不安全的語言
使用內存安全編程語言并不是保證所有內存安全漏洞都會消失的靈丹妙藥。然而,如果使用得當,內存安全語言可以極大地減少應用程序中出現內存漏洞的機會。內存安全語言背后的想法是,開發人員不必做任何特殊的事情來保護內存。例如,如果你在Rust中編寫了一個覆蓋了緩沖區邊界的程序,你可能會看到如下運行時錯誤:
內存安全結論
如果你在連接的設備上工作,軟件中的內存安全是必要的。內存安全語言可以幫助開發人員更好更快地發現潛在的內存漏洞。真正的問題是將平臺或產品線從現有語言轉換到新語言。轉換語言對你來說可能有意義,也可能沒有意義。
雖然我們已經探討了一些內存安全問題,但使用內存安全語言并不是必需的。嵌入式開發人員可以通過遵循語言最佳實踐來提高應用程序的內存安全性。例如,有一些使用C和C++維護內存安全的最佳實踐。然而,C、C++和Rust中的內存安全技術是不同的。