引入一種新的機制來檢測和減輕基于MCU的應用中的存儲器損壞。
在實時操作系統(RTOS)級別工作的嵌入式軟件開發人員知道,內存損壞問題很容易引入,很難檢測,并且通常會破壞應用程序的安全性。這使得防止這些問題成為行業標準、測試工具和RTOS解決方案提供商的熱門話題。盡管如此,在減輕微控制器單元(MCU)設備上的存儲器損壞方面仍然存在顯著的限制,因為它們不能支持更復雜的編程和RTOS技術。
作為全球數十億應用的核心,MCU帶來了獨特的安全和安保挑戰。由于沒有內存管理單元(MMU)或內存保護單元(MPU ),并且幾乎沒有能力在代碼中包含內存保護功能,MCU為嵌入式開發人員提供了很少的選項來確保他們系統的健壯性。
隨著MCU部署的不斷增加并支持更多連接的系統,開發人員需要更好的方法來防止存儲器損壞問題,同時又不影響這些硬實時系統的嚴格功能和性能要求。
基于MCU的應用面臨的安全挑戰
為了最大限度地減少處理器工作負載和內存占用,基于MCU的應用程序傾向于在所有線程之間全局共享的單個地址空間內運行。與運行在更高級別的RTOS(如嵌入式Linux)上的應用不同,后者將內存劃分為不同的地址空間,MCU應用可以訪問整個范圍的內存。這種單一的方法讓開發人員不得不尋找自己的方法來防止應用程序函數破壞自己段外的內存。
當內存位置中的數據通過意外或不希望的方式被更改時,例如將指針從有效地址更改為可疑地址,就會發生損壞。例如,函數指針的損壞可能導致程序執行跳轉到無效的內存位置,從而導致系統故障。如果黑客懷疑這一弱點存在,他們可以利用未受保護的指針將執行誤導到他們通過稱為代碼注入的技術引入的惡意代碼。
防止內存損壞需要遠見和知識。開發人員需要認識到什么時候可能會出現問題(在多線程訪問相同內存位置的應用程序中,這并不容易),并知道如何最小化出現問題的可能性。以下是針對沒有內置內存保護的設備的一些典型補救策略:
l 空指針檢查確保引用在使用時指向有效的內存位置。
l 使用校驗和或CRC來檢測和處理潛在的不安全內存訪問。
l 將值與存儲在不同存儲位置的數據進行比較,看它們是否匹配。
這些技術消耗設備資源,并且依賴于開發人員記住在哪里使用它們。后兩者在規劃、架構和測試方面也需要相當大的努力。
PX5 RTOS專為要求苛刻的基于MCU的應用而設計,提供內置的內存保護方法,最大限度地減少開發人員和設備的開銷。這種方法被稱為指針數據驗證(PDV)。
用PDV減輕內存損壞
PDV是PX5 RTOS獨有的一種簡單而強大的內存地址驗證方法。PDV專為無法訪問MMU或MPU的資源受限的MCU應用而設計,是一種純軟件技術,它為存儲器結構創建并存儲唯一的驗證碼,以幫助應用避免意外和未經授權的訪問。
一旦開發人員打開PDV,PX5 RTOS會在將值加載到敏感數據位置時自動創建驗證碼。在應用程序使用敏感數據之前,RTOS會再次生成驗證碼,并將其與存儲的值進行比較。如果這兩個代碼不匹配,PX5 RTOS會調用一個中央錯誤處理函數來執行開發人員指定的操作。
開發人員可以定義生成驗證碼的公式,或者使用PX5 RTOS提供的默認機制。默認驗證碼是傳遞給RTOS的秘密運行時標識(例如來自真隨機數生成器的結果)、敏感數據的值以及存儲生成代碼的地址的組合。默認公式如下:Verification Code = ((Data Value) + (Address to Store Code) + (Secret)) ^ (Secret)
開發者如何使用PDV
開發人員如何使用PDV保護敏感數據結構的一個例子是函數指針驗證(FPV)。當使用PX5 RTOS構建應用程序時,開發人員可以使用PX5 _ FUNCTION _ POINTER _ VERIFY _ ENABLE標志來確保在使用之前驗證所有函數指針。以使用PX5 RTOS支持的POSIX線程(pthreads) API創建應用程序的啟動例程函數指針為例:
假設編譯器按照表1中指定的方式分配內存。讓我們進一步說明,entry_routine函數指針的計算驗證碼是0x9D919C7D。圖1顯示了線程創建后的線程控制塊,包括原始內存格式和數據觀察。
在運行時使用start_routine()函數指針時,PX5 RTOS會重新計算驗證碼,并將其與存儲的驗證碼0x9D919C7D進行比較。如果新計算的代碼與存儲的代碼匹配,則認為函數指針有效,并調用函數start_routine()。如果代碼不匹配,函數指針或存儲的驗證碼中很可能存在內存損壞,因此PX5 RTOS調用中央錯誤處理函數。
通過這種方法,試圖遠程改變程序執行的黑客將會失敗,因為他們注入的代碼不能生成匹配的驗證碼。
從根本上防止內存損壞
PDV是一項正在申請專利的技術,它為開發人員提供了強大的內存損壞檢測和緩解功能,而不會影響應用性能或資源預算。PX5 RTOS本身是超小型的(最少使用時不到1 KB),超便攜的(具有完全兼容的pthreads API),并且經過嚴格測試(每個版本都有100%的C語句和分支決策覆蓋),這使它成為需要可靠確定性、安全性和安全性的系統的理想基礎。
雖然PDV是為沒有存儲器保護硬件的MCU環境設計的,但是它也可以為具有MPU和/或MMU功能的更健壯的處理器補充代碼安全和安全實踐。