
隨著越來越多的嵌入式產(chǎn)品連接到外部網(wǎng)絡(luò),嵌入式產(chǎn)品的信息安全(Security)人們越來越關(guān)注它。它包括直接連接到外部網(wǎng)絡(luò),如通過Wi-Fi連接;還包括間接連接到外部網(wǎng)絡(luò),如汽車ECU通過CAN總線與T-box相連,而T-box外部網(wǎng)絡(luò)可以通過移動網(wǎng)絡(luò)連接。特別是對于一些高功能安全性(Safety)信息安全已成為工業(yè)、汽車、醫(yī)療產(chǎn)品等所需產(chǎn)品功能安全的前提(There Is No Safety Without Security)。
芯片采購網(wǎng)專注于整合國內(nèi)外授權(quán)IC代理商現(xiàn)貨資源,芯片庫存實時查詢,行業(yè)價格合理,采購方便IC芯片,國內(nèi)專業(yè)芯片采購平臺。
在C/C 堆棧緩存溢出(Stack Buffer Overflow)當(dāng)程序緩存到堆棧時,這是一個常見的錯誤(Stack Buffer)在編寫數(shù)據(jù)時,由于堆棧緩存通常采用固定長度,如果需要編寫的數(shù)據(jù)長度超過堆棧緩存長度,則會導(dǎo)致堆棧緩存溢出。堆棧緩存溢出將覆蓋堆棧緩存附近的堆棧數(shù)據(jù),包括函數(shù)返回地址,導(dǎo)致函數(shù)返回異常。如果堆棧緩存溢出是攻擊者故意使用代碼漏洞造成的,則稱為堆棧粉碎(Stack Smashing)。堆棧粉碎是一種常用的攻擊手段。
堆棧金絲雀(Stack Canaries), 由于它類似于在煤礦中使用金絲雀來感知氣體和其他氣體,它可以用來檢測堆棧緩存溢出,以實現(xiàn)堆棧保護(Stack Protection),從而提高代碼的安全性。
與許多更關(guān)注設(shè)備性能的原始開發(fā)工具相比,一些廣泛應(yīng)用于行業(yè)的商業(yè)開發(fā)工具更關(guān)注性能和安全性的平衡和完整性。本文在過去幾十年中被廣泛應(yīng)用于該行業(yè)IAR Embedded Workbench例如,介紹如何在工具中實現(xiàn)堆棧保護,從而提高代碼的安全性。
堆棧粉碎
在C/C 中,堆棧(Stack)臨時數(shù)據(jù)用于保存程序正常運行(如函數(shù)調(diào)用或中斷搶占),可包括以下數(shù)據(jù):
● 未存儲在寄存器中的函數(shù)參數(shù)和局部變量
● 寄存器中未存儲的函數(shù)返回值和函數(shù)返回地址
● CPU和寄存器狀態(tài)
由于堆棧保存臨時數(shù)據(jù),以確保程序的正常運行,堆棧緩存溢出將覆蓋堆棧緩存附近的堆棧數(shù)據(jù),這些數(shù)據(jù)可能包含函數(shù)返回地址,如果發(fā)生,通常會導(dǎo)致程序運行異常。攻擊者經(jīng)常一點來粉碎堆棧。
以下是一個簡單的例子來解釋堆棧粉碎攻擊:
void foo(char *bar)
{
char c[12];
strcpy(c, bar); // no bounds checking
}
foo()Active-Semi代理函數(shù)將函數(shù)參數(shù)輸入復(fù)制到本地堆棧變量c。如下圖B所示:當(dāng)函數(shù)參數(shù)輸入小于12個字符時,foo()函數(shù)會正常工作。如下圖C所示:當(dāng)函數(shù)參數(shù)輸入大于11個字符時,foo()函數(shù)將覆蓋本地堆棧的數(shù)據(jù),并將函數(shù)返回地址覆蓋0x80C03508,當(dāng)foo()函數(shù)返回時,執(zhí)行地址0x80C03508對應(yīng)的代碼A,代碼A可能包括攻擊者提供的shell使攻擊者獲得操作權(quán)限的代碼。
C "AAAAAAAAAAAAAAAAAAAAx08x35xC0x80"輸入函數(shù)參數(shù)
圖:堆棧粉碎示例
堆棧保護
堆棧金絲雀之所以得名,是因為它的功能類似于在煤礦中發(fā)現(xiàn)瓦斯的金絲雀。(Stack Canaries),在函數(shù)返回執(zhí)行惡意代碼之前,可用于檢測堆棧緩存溢出。檢測原理是:調(diào)用函數(shù)時,將需要保存的臨時數(shù)據(jù)保存到堆棧中,然后放置金絲雀。當(dāng)函數(shù)返回時,檢查金絲雀的值是否發(fā)生變化;如果發(fā)生變化,堆棧被篡改,否則堆棧沒有被篡改。
如何在下面介紹IAR Embedded Workbench堆棧保護行的商業(yè)工具鏈中實現(xiàn)堆棧保護,從而提高代碼的安全性:
在IAR Embedded Workbench啟發(fā)模式將用于中間(Heuristic)決定函數(shù)是否需要堆棧保護: 如果函數(shù)的局部變量包含數(shù)組類型或結(jié)構(gòu)成員包含數(shù)組類型,或在函數(shù)外使用局部變量地址,則需要堆棧保護。
IAR Embedded Workbench以下是安裝目錄srclibruntime包含stack_protection.c,里面包含了__stack_chk_guard變量和__stack_chk_fail函數(shù),可作為模板使用:__stack_chk_guard變量是金絲雀堆棧的價值,當(dāng)函數(shù)返回時,如果檢測到堆棧金絲雀的值被篡改,它將被調(diào)用__stack_chk_fail函數(shù)。
1.將IAR Embedded Workbench以下是安裝目錄srclibruntime文件夾的stack_protection.c復(fù)制并添加到工程中。
2.在IAR Embedded Workbench堆棧保護在中啟用。
3.在代碼中聲明堆棧保護__stack_chk_guard變量和__stack_chk_fail函數(shù)。
extern uint32_t __stack_chk_guard;
__interwork __nounwind __noreturn void __stack_chk_fail(void);
4.編譯工程。編譯器將以下操作添加到需要堆棧保護的函數(shù)中:先進入函數(shù)入口的堆棧(Push),然后將金絲雀保存在堆棧中。具體值用戶可以stack_protection.c中更改__stack_chk_guard;在函數(shù)出口,會檢測堆棧金絲雀的值是否還是__stack_chk_guard,如果沒有,說明堆棧被篡改了,會調(diào)用__stack_chk_fail函數(shù)。
調(diào)試
反匯編斷點到需要堆棧保護的函數(shù)(Disassembly)入口暫停后,發(fā)現(xiàn)編譯器在函數(shù)入口處進入堆棧后,保存了堆棧金絲雀:
在函數(shù)出口處打斷點,然后操作程序。當(dāng)函數(shù)返回時,將首先檢測堆疊金絲雀的值是否__stack_chk_guard,如果沒有,說明堆棧被篡改了,會調(diào)用__stack_chk_fail函數(shù)。
改變堆棧金絲雀的值使之和__stack_chk_guard操作程序不一致,函數(shù)返回時會調(diào)用__stack_chk_fail函數(shù):
總結(jié)
本文主要介紹了如何利用堆棧緩存來影響代碼的安全性。IAR Embedded Workbench堆棧保護可以檢測堆棧的完整性,從而提高代碼的安全性。
參考文獻:
1.https://en.wikipedia.org/wiki/Stack_buffer_overflow
2.https://cwe.mitre.org/data/definitions/121.html
3.https://en.wikipedia.org/wiki/Buffer_overflow_protection
4.https://www.iar.com/knowledge/learn/programming/stack-protection-in-iar-embedded-workbench/
5.IAR C/C Development Guide (Stack protection)
- Diodes 公司的7通道 DMOS 晶體管數(shù)組驅(qū)動電感負(fù)載,同時消耗最小功率
- 英特爾基于5G幫助智能邊緣技術(shù)打造無人駕駛拖拉機,推動產(chǎn)業(yè)創(chuàng)新升級
- 注重長期戰(zhàn)略,不斷創(chuàng)造價值 新基礎(chǔ)設(shè)施布局積極推進創(chuàng)新
- 榮耀聯(lián)合高通深度打磨,榮耀Magic4系列充分釋放驍龍8頂級性能
- 跨境競爭理想L9、特斯拉Model Y和蔚來ET7.誰能打得更好?
- 貿(mào)澤電子攜手提高設(shè)計效率Analog Devices舉辦 下一代高集成度雙波長煙霧傳感器在線研討會
- ST第三代碳化硅技術(shù)問世 針對汽車和工業(yè)市場的應(yīng)用
- Graphcore與新聯(lián)大簽訂代理合同,滿足中國客戶的大規(guī)模部署需求
- 5G和O-RAN:我們面臨三大挑戰(zhàn)
- Velodyne2022年將全棧視覺解決方案亮相XPONENTIAL美國無人機展
- 近地軌道太擁擠了!NASA將聯(lián)合SpaceX測試衛(wèi)星自動避免策略
- 為什么上億像素的時代,為什么汽車頂配才800萬?
