互聯(lián)嵌入式系統(tǒng)在我們的日常生活中變得越來(lái)越普遍,也更容易受到攻擊。嵌入式軟件安全測(cè)試的現(xiàn)有技術(shù)依賴于源代碼或二進(jìn)制文件。但是,測(cè)試二進(jìn)制代碼是檢測(cè)漏洞的困難方法,因?yàn)樵创a語(yǔ)義會(huì)丟失。這使得識(shí)別內(nèi)存安全違規(guī)和損壞變得困難。在嵌入式系統(tǒng)中,高級(jí)源代碼往往與手寫(xiě)匯編代碼混合在一起,當(dāng)前基于源代碼的工具無(wú)法直接處理這些代碼。
但是,有一個(gè)新框架可用,使您能夠?qū)?a href="http://srfitnesspt.com/soft/data/21-22/" target="_blank">嵌入式系統(tǒng)軟件執(zhí)行系統(tǒng)范圍的安全測(cè)試。開(kāi)源的 Inception 框架引入了嵌入式系統(tǒng)中符號(hào)執(zhí)行的新技術(shù)。簡(jiǎn)而言之,符號(hào)執(zhí)行是一種實(shí)現(xiàn)高代碼覆蓋率并在檢測(cè)到錯(cuò)誤時(shí)生成測(cè)試用例的技術(shù)。我的EURECOM同事Giovanni Camurati和Aurélien Francillon,以及我將在論文中更多地談?wù)揑nception。
Inception背后的動(dòng)機(jī)是幫助開(kāi)發(fā)人員發(fā)現(xiàn)其連接的嵌入式系統(tǒng)中的漏洞。畢竟,嵌入式軟件中的漏洞可能會(huì)產(chǎn)生可怕的后果。例如,用于越獄某些智能手機(jī)的引導(dǎo)ROM漏洞無(wú)法在軟件中修補(bǔ),因?yàn)橐龑?dǎo)加載程序在掩碼ROM中是硬編碼的。因此,能夠徹底測(cè)試此類(lèi)低級(jí)嵌入式軟件至關(guān)重要。與僅使用二進(jìn)制代碼相比,基于源代碼的測(cè)試可以更好地檢測(cè)錯(cuò)誤。但是,高級(jí)編程語(yǔ)言 (C/C++) 通常與手寫(xiě)匯編混合(以執(zhí)行手動(dòng)優(yōu)化或啟用硬件功能)。在某些情況下,為板級(jí)支持包或?qū)S袔?kù)代碼提供二進(jìn)制代碼。由于這些原因,測(cè)試嵌入式系統(tǒng)軟件需要對(duì)所有這些語(yǔ)言的大量支持。
Inception 如何發(fā)現(xiàn)漏洞
初始由三個(gè)關(guān)鍵組件組成:
Inception 轉(zhuǎn)換器從高級(jí)源代碼、手寫(xiě)程序集、二進(jìn)制庫(kù)和部分處理器硬件行為生成和合并 LLVM 位代碼。
基于 KLEE 的 Inception 符號(hào)虛擬機(jī)執(zhí)行符號(hào)執(zhí)行。它使用多種策略來(lái)管理不同級(jí)別的內(nèi)存抽象、與外圍設(shè)備的交互和中斷。
Inception Debugger是一個(gè)高性能的JTAG調(diào)試器,它將內(nèi)存訪問(wèn)重定向到真實(shí)硬件。
Camurati,F(xiàn)rancillon和我使用53,000個(gè)測(cè)試驗(yàn)證了我們的實(shí)現(xiàn),這些測(cè)試將Inception執(zhí)行與Arm Cortex-M3芯片上的具體執(zhí)行進(jìn)行了比較。在 USENIX 的演講中,我們將討論我們?nèi)绾卧?1624 個(gè)合成易受攻擊的程序、4 個(gè)真實(shí)的開(kāi)源和工業(yè)應(yīng)用程序以及 20 個(gè)演示的基準(zhǔn)上展示 Inception 的優(yōu)勢(shì)。在這次檢查中,我們發(fā)現(xiàn)了八個(gè)崩潰和兩個(gè)以前未知的漏洞,這突出了Inception框架在嵌入式設(shè)備固件測(cè)試方面的效果。
在實(shí)際的產(chǎn)品開(kāi)發(fā)方案中,Inception 框架對(duì)于商業(yè)引導(dǎo)加載程序非常有用,因?yàn)樗鼈兙哂械图?jí)代碼并且經(jīng)常解析不受信任的輸入。當(dāng)真正的硬件尚不可用時(shí),引導(dǎo)加載程序很難測(cè)試。我們分析了一個(gè)安全引導(dǎo)加載程序,它支持存儲(chǔ)在一次性可編程(OTP)內(nèi)存中的多個(gè)引導(dǎo)選項(xiàng)。在特定模式下執(zhí)行時(shí),引導(dǎo)加載程序會(huì)填充一個(gè)結(jié)構(gòu),其中包含有關(guān)要加載的應(yīng)用程序的信息。結(jié)構(gòu)位置保存在未初始化的SRAM位置(未初始化的指針?lè)Q為p_header)。如果無(wú)效寫(xiě)入未觸發(fā)任何其他錯(cuò)誤,引導(dǎo)加載程序仍可以在start_address時(shí)執(zhí)行并成功加載應(yīng)用程序,這使得問(wèn)題難以在實(shí)際硬件上檢測(cè)到。它不會(huì)在FPGA原型上崩潰,因?yàn)镾RAM在啟動(dòng)時(shí)初始化為0,而硅片上的情況并非如此。此外,稍后嘗試檢測(cè)錯(cuò)誤(例如在硅片上)將付出高昂的代價(jià)。因此,攻擊者可以獲得對(duì)p_header值的部分控制權(quán)。我們還在商用芯片的軟件開(kāi)發(fā)工具包上測(cè)試了Inception。硬件原型尚不可用,因此我們將外設(shè)讀取配置為返回不受約束的符號(hào)值。Inception 發(fā)現(xiàn)了一個(gè)測(cè)試用例,其中逐位移位依賴于不受信任的值;該錯(cuò)誤會(huì)導(dǎo)致外圍設(shè)備配置錯(cuò)誤和意外行為。最后,我們將 Inception 框架應(yīng)用于正在開(kāi)發(fā)的商業(yè)支付終端。我們 使用 其 FPGA 原型 來(lái) 重新 定向 大多數(shù) 外 設(shè) 和 其 中斷。Inception檢測(cè)到八個(gè)潛在漏洞。
增強(qiáng)嵌入式軟件測(cè)試
在嵌入式應(yīng)用程序中,手寫(xiě)匯編和第三方二進(jìn)制庫(kù)的使用相當(dāng)普遍。通常,即使內(nèi)存變得更便宜并且編譯器效率提高,也有必要手動(dòng)優(yōu)化代碼。程序集還用于直接與一些低級(jí)處理器功能交互。但是,這限制了傳統(tǒng)的基于源代碼的測(cè)試框架的使用。Inception 框架提供了一種強(qiáng)大的方法,可以在源代碼可用時(shí)增強(qiáng)嵌入式軟件測(cè)試。
審核編輯:郭婷
-
處理器
+關(guān)注
關(guān)注
68文章
19038瀏覽量
228456 -
嵌入式
+關(guān)注
關(guān)注
5052文章
18912瀏覽量
300777 -
源代碼
+關(guān)注
關(guān)注
96文章
2943瀏覽量
66569
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論