如今,當談到嵌入式安全性時,我們都有點不安全。這是一個快速發展的領域,新的威脅不斷涌現。最糟糕的是,我們在嵌入式軟件開發中通常生活在資源受限的硬件世界中,這與大多數嵌入式安全防御機制不一致。
更復雜的是,根據需要保護的內容的重要性、潛在的攻擊面以及技術上和經濟上的實用性,嵌入式安全需求會有很大的不同。換句話說,嵌入式安全更多的是一個范圍,而不是一種一刀切的方法。例如,銀行的安全要求與餐館的安全要求有很大不同。嵌入式系統也是如此。
嵌入式系統的硬件安全
嵌入式處理器提供多種嵌入式安全特性。我們來看看最常見的。
l 防篡改。此功能保護固件免受未經授權的訪問。這用于保護固件IP,并防止對手研究目標代碼的漏洞。
l 鎖定步驟執行。這種安全特性使用多個處理器來執行具有相同數據的相同代碼,從而保證代碼的準確執行。這種硬件主要出現在安全關鍵的應用程序中,更安全的代碼通常更安全。
l 防故障。該安全特征采用電路來防止攻擊者通過操縱電源或其他系統信號來導致異常程序執行。否則,攻擊者可能能夠“跳過”啟用MMU或MPU設置的指令。
l 僅從閃存執行。大多數微控制器(MCU)執行來自閃存的指令。其中一些MCU還可以禁止從RAM執行,建議這樣做有助于防止在遠程執行攻擊中動態插入惡意代碼。
l 硬件堆棧限制。有些處理器有一個堆棧限制寄存器,可以防止堆棧溢出造成的內存損壞。
l 硬件看門狗定時器。許多處理器都有一個不可屏蔽的硬件看門狗定時器。這一安全特征起到自動防故障的作用。在正常操作下,應用程序代碼定期復位看門狗,并且總是在它到期之前。在異常執行期間,看門狗不會復位,因此會產生一個不可屏蔽的中斷來中止異常執行。通常,應用程序會在看門狗到期后簡單地復位。
l 真隨機數生成器(TRNG)。在硬件中擁有一個TRNG或者更基本的隨機數發生器(RNG)是非常有益的。這對于聯網的嵌入式設備非常重要。
l 內存管理單元(MMU)。通常,這種硬件安全特性只能在更大、更強大的處理器上使用,它可以限制對不同內存區域的訪問。這通常由應用固件在復位后設置一次,以映射和保護對各種存儲器區域的訪問。
l 存儲器保護單元(MPU)。這種硬件安全功能類似于MMU,在更小、資源更有限的設備中可以找到。同樣,這通常由應用固件在復位后設置,以保護各種存儲區域。在沒有堆棧限制寄存器的情況下,MPU可以在每個線程的堆棧頂部設置一個保護塊,以防止堆棧溢出。
l 安全元素(SE)或可信平臺模塊(TPM)。對于聯網的嵌入式設備,SE或TMP可以安全地將憑證或其他機密與主應用程序隔離開來。這可以大大提高設備的網絡安全性,因此強烈建議這樣做。
l 當然,提到的每個硬件安全特性都有相關的成本——在電路、功耗、尺寸等方面。這些成本必須經過風險收益分析。
嵌入式設備的軟件安全性
不管你擁有什么樣的硬件安全特性,你都可以在軟件中做一些事情來幫助提高嵌入式安全性。以下是一些可以提高設備安全性的軟件最佳實踐。
l 強化設備固件。你應該爭取100%的語句和100%的分支/決策覆蓋測試,因為更安全的代碼也更安全。
l 利用靜態分析和相關工具。除了加固之外,利用靜態分析工具以及滲透測試和模糊化工具也是一個好主意。這些安全測試工具有助于發現開發中的微妙問題,這比調試現場設備容易得多。
l 使用足夠(或更大)的堆棧大小。堆棧溢出是嵌入式系統內存損壞的頭號原因。每個線程堆棧必須有足夠的內存用于最壞情況下的函數調用嵌套,包括每個函數中的所有局部變量。否則,堆棧將溢出到堆棧前面的內存中。這種安全問題可以通過使用硬件堆棧限制功能來防止,或者使用MPU/MMU來保護堆棧正上方的區域。
l 顯式指定并檢查緩沖區大小。在所有提供緩沖區的函數中,調用方明確提供緩沖區的大小,被調用方明確檢查大小以避免溢出,這一點很重要。
l 請注意內存損壞的可能性。當線程堆棧溢出時,它通常會破壞線程堆棧內存之前的內存(在大多數架構中,線程堆棧會向較低的地址增長)。相反,緩沖區溢出更有可能破壞緊跟在緩沖區后面的內存。因此,將關鍵數據放在堆棧之后、緩沖存儲器之前通常更安全。
l 插入運行時間和位置堆棧和緩沖區之間的唯一數據模式,可用于在運行時檢測內存損壞。
l 使用函數指針要非常小心。函數指針為不必要的程序執行提供了一條簡單的路徑——無論是無意的還是有意的。例如,將函數指針放在緩沖區內并不是好的做法,因為緩沖區溢出也可能會覆蓋函數指針。在使用函數指針之前,通過一個小的散列或校驗和來驗證它們也是很好的。函數指針損壞是攻擊者發起不想要的遠程執行的最容易的方式,使你的嵌入式安全性變得不安全。
利用你的硬件安全資源并遵循嵌入式軟件安全方面的一些最佳實踐,將有助于提高你的嵌入式設備的安全性。還要記住,所有嵌入式安全措施——在設備端和設備所在的網絡級別——都是整體深度防御策略的一部分。嵌入式安全的唯一目標是讓對手更難獲得不必要的訪問!