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