互聯嵌入式系統在我們的日常生活中變得越來越普遍,也更容易受到攻擊。嵌入式軟件安全測試的現有技術依賴于源代碼或二進制文件。但是,測試二進制代碼是檢測漏洞的困難方法,因為源代碼語義會丟失。這使得識別內存安全違規和損壞變得困難。在嵌入式系統中,高級源代碼往往與手寫匯編代碼混合在一起,當前基于源代碼的工具無法直接處理這些代碼。
但是,有一個新框架可用,使您能夠對嵌入式系統軟件執行系統范圍的安全測試。開源的 Inception 框架引入了嵌入式系統中符號執行的新技術。簡而言之,符號執行是一種實現高代碼覆蓋率并在檢測到錯誤時生成測試用例的技術。我的EURECOM同事Giovanni Camurati和Aurélien Francillon,以及我將在論文中更多地談論Inception。
Inception背后的動機是幫助開發人員發現其連接的嵌入式系統中的漏洞。畢竟,嵌入式軟件中的漏洞可能會產生可怕的后果。例如,用于越獄某些智能手機的引導ROM漏洞無法在軟件中修補,因為引導加載程序在掩碼ROM中是硬編碼的。因此,能夠徹底測試此類低級嵌入式軟件至關重要。與僅使用二進制代碼相比,基于源代碼的測試可以更好地檢測錯誤。但是,高級編程語言 (C/C++) 通常與手寫匯編混合(以執行手動優化或啟用硬件功能)。在某些情況下,為板級支持包或專有庫代碼提供二進制代碼。由于這些原因,測試嵌入式系統軟件需要對所有這些語言的大量支持。
Inception 如何發現漏洞
初始由三個關鍵組件組成:
Inception 轉換器從高級源代碼、手寫程序集、二進制庫和部分處理器硬件行為生成和合并 LLVM 位代碼。
基于 KLEE 的 Inception 符號虛擬機執行符號執行。它使用多種策略來管理不同級別的內存抽象、與外圍設備的交互和中斷。
Inception Debugger是一個高性能的JTAG調試器,它將內存訪問重定向到真實硬件。
Camurati,Francillon和我使用53,000個測試驗證了我們的實現,這些測試將Inception執行與Arm Cortex-M3芯片上的具體執行進行了比較。在 USENIX 的演講中,我們將討論我們如何在 1624 個合成易受攻擊的程序、4 個真實的開源和工業應用程序以及 20 個演示的基準上展示 Inception 的優勢。在這次檢查中,我們發現了八個崩潰和兩個以前未知的漏洞,這突出了Inception框架在嵌入式設備固件測試方面的效果。
在實際的產品開發方案中,Inception 框架對于商業引導加載程序非常有用,因為它們具有低級代碼并且經常解析不受信任的輸入。當真正的硬件尚不可用時,引導加載程序很難測試。我們分析了一個安全引導加載程序,它支持存儲在一次性可編程(OTP)內存中的多個引導選項。在特定模式下執行時,引導加載程序會填充一個結構,其中包含有關要加載的應用程序的信息。結構位置保存在未初始化的SRAM位置(未初始化的指針稱為p_header)。如果無效寫入未觸發任何其他錯誤,引導加載程序仍可以在start_address時執行并成功加載應用程序,這使得問題難以在實際硬件上檢測到。它不會在FPGA原型上崩潰,因為SRAM在啟動時初始化為0,而硅片上的情況并非如此。此外,稍后嘗試檢測錯誤(例如在硅片上)將付出高昂的代價。因此,攻擊者可以獲得對p_header值的部分控制權。我們還在商用芯片的軟件開發工具包上測試了Inception。硬件原型尚不可用,因此我們將外設讀取配置為返回不受約束的符號值。Inception 發現了一個測試用例,其中逐位移位依賴于不受信任的值;該錯誤會導致外圍設備配置錯誤和意外行為。最后,我們將 Inception 框架應用于正在開發的商業支付終端。我們 使用 其 FPGA 原型 來 重新 定向 大多數 外 設 和 其 中斷。Inception檢測到八個潛在漏洞。
增強嵌入式軟件測試
在嵌入式應用程序中,手寫匯編和第三方二進制庫的使用相當普遍。通常,即使內存變得更便宜并且編譯器效率提高,也有必要手動優化代碼。程序集還用于直接與一些低級處理器功能交互。但是,這限制了傳統的基于源代碼的測試框架的使用。Inception 框架提供了一種強大的方法,可以在源代碼可用時增強嵌入式軟件測試。
審核編輯:郭婷
-
處理器
+關注
關注
68文章
19291瀏覽量
229906 -
嵌入式
+關注
關注
5083文章
19129瀏覽量
305404 -
源代碼
+關注
關注
96文章
2945瀏覽量
66755
發布評論請先 登錄
相關推薦
評論