
隨著越來(lái)越多的嵌入式產(chǎn)品連接到外部網(wǎng)絡(luò),嵌入式產(chǎn)品的信息安全(Security)人們?cè)絹?lái)越關(guān)注它。它包括直接連接到外部網(wǎng)絡(luò),如通過(guò)Wi-Fi連接;還包括間接連接到外部網(wǎng)絡(luò),如汽車(chē)ECU通過(guò)CAN總線(xiàn)與T-box相連,而T-box外部網(wǎng)絡(luò)可以通過(guò)移動(dòng)網(wǎng)絡(luò)連接。特別是對(duì)于一些高功能安全性(Safety)信息安全已成為工業(yè)、汽車(chē)、醫(yī)療產(chǎn)品等所需產(chǎn)品功能安全的前提(There Is No Safety Without Security)。
芯片采購(gòu)網(wǎng)專(zhuān)注于整合國(guó)內(nèi)外授權(quán)IC代理商現(xiàn)貨資源,芯片庫(kù)存實(shí)時(shí)查詢(xún),行業(yè)價(jià)格合理,采購(gòu)方便IC芯片,國(guó)內(nèi)專(zhuān)業(yè)芯片采購(gòu)平臺(tái)。
在C/C 堆棧緩存溢出(Stack Buffer Overflow)當(dāng)程序緩存到堆棧時(shí),這是一個(gè)常見(jiàn)的錯(cuò)誤(Stack Buffer)在編寫(xiě)數(shù)據(jù)時(shí),由于堆棧緩存通常采用固定長(zhǎng)度,如果需要編寫(xiě)的數(shù)據(jù)長(zhǎng)度超過(guò)堆棧緩存長(zhǎng)度,則會(huì)導(dǎo)致堆棧緩存溢出。堆棧緩存溢出將覆蓋堆棧緩存附近的堆棧數(shù)據(jù),包括函數(shù)返回地址,導(dǎo)致函數(shù)返回異常。如果堆棧緩存溢出是攻擊者故意使用代碼漏洞造成的,則稱(chēng)為堆棧粉碎(Stack Smashing)。堆棧粉碎是一種常用的攻擊手段。
堆棧金絲雀(Stack Canaries), 由于它類(lèi)似于在煤礦中使用金絲雀來(lái)感知?dú)怏w和其他氣體,它可以用來(lái)檢測(cè)堆棧緩存溢出,以實(shí)現(xiàn)堆棧保護(hù)(Stack Protection),從而提高代碼的安全性。
與許多更關(guān)注設(shè)備性能的原始開(kāi)發(fā)工具相比,一些廣泛應(yīng)用于行業(yè)的商業(yè)開(kāi)發(fā)工具更關(guān)注性能和安全性的平衡和完整性。本文在過(guò)去幾十年中被廣泛應(yīng)用于該行業(yè)IAR Embedded Workbench例如,介紹如何在工具中實(shí)現(xiàn)堆棧保護(hù),從而提高代碼的安全性。
堆棧粉碎
在C/C 中,堆棧(Stack)臨時(shí)數(shù)據(jù)用于保存程序正常運(yùn)行(如函數(shù)調(diào)用或中斷搶占),可包括以下數(shù)據(jù):
● 未存儲(chǔ)在寄存器中的函數(shù)參數(shù)和局部變量
● 寄存器中未存儲(chǔ)的函數(shù)返回值和函數(shù)返回地址
● CPU和寄存器狀態(tài)
由于堆棧保存臨時(shí)數(shù)據(jù),以確保程序的正常運(yùn)行,堆棧緩存溢出將覆蓋堆棧緩存附近的堆棧數(shù)據(jù),這些數(shù)據(jù)可能包含函數(shù)返回地址,如果發(fā)生,通常會(huì)導(dǎo)致程序運(yùn)行異常。攻擊者經(jīng)常一點(diǎn)來(lái)粉碎堆棧。
以下是一個(gè)簡(jiǎn)單的例子來(lái)解釋堆棧粉碎攻擊:
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個(gè)字符時(shí),foo()函數(shù)會(huì)正常工作。如下圖C所示:當(dāng)函數(shù)參數(shù)輸入大于11個(gè)字符時(shí),foo()函數(shù)將覆蓋本地堆棧的數(shù)據(jù),并將函數(shù)返回地址覆蓋0x80C03508,當(dāng)foo()函數(shù)返回時(shí),執(zhí)行地址0x80C03508對(duì)應(yīng)的代碼A,代碼A可能包括攻擊者提供的shell使攻擊者獲得操作權(quán)限的代碼。
C "AAAAAAAAAAAAAAAAAAAAx08x35xC0x80"輸入函數(shù)參數(shù)
圖:堆棧粉碎示例
堆棧保護(hù)
堆棧金絲雀之所以得名,是因?yàn)樗墓δ茴?lèi)似于在煤礦中發(fā)現(xiàn)瓦斯的金絲雀。(Stack Canaries),在函數(shù)返回執(zhí)行惡意代碼之前,可用于檢測(cè)堆棧緩存溢出。檢測(cè)原理是:調(diào)用函數(shù)時(shí),將需要保存的臨時(shí)數(shù)據(jù)保存到堆棧中,然后放置金絲雀。當(dāng)函數(shù)返回時(shí),檢查金絲雀的值是否發(fā)生變化;如果發(fā)生變化,堆棧被篡改,否則堆棧沒(méi)有被篡改。
如何在下面介紹IAR Embedded Workbench堆棧保護(hù)行的商業(yè)工具鏈中實(shí)現(xiàn)堆棧保護(hù),從而提高代碼的安全性:
在IAR Embedded Workbench啟發(fā)模式將用于中間(Heuristic)決定函數(shù)是否需要堆棧保護(hù): 如果函數(shù)的局部變量包含數(shù)組類(lèi)型或結(jié)構(gòu)成員包含數(shù)組類(lèi)型,或在函數(shù)外使用局部變量地址,則需要堆棧保護(hù)。
IAR Embedded Workbench以下是安裝目錄srclibruntime包含stack_protection.c,里面包含了__stack_chk_guard變量和__stack_chk_fail函數(shù),可作為模板使用:__stack_chk_guard變量是金絲雀堆棧的價(jià)值,當(dāng)函數(shù)返回時(shí),如果檢測(cè)到堆棧金絲雀的值被篡改,它將被調(diào)用__stack_chk_fail函數(shù)。
1.將IAR Embedded Workbench以下是安裝目錄srclibruntime文件夾的stack_protection.c復(fù)制并添加到工程中。
2.在IAR Embedded Workbench堆棧保護(hù)在中啟用。
3.在代碼中聲明堆棧保護(hù)__stack_chk_guard變量和__stack_chk_fail函數(shù)。
extern uint32_t __stack_chk_guard;
__interwork __nounwind __noreturn void __stack_chk_fail(void);
4.編譯工程。編譯器將以下操作添加到需要堆棧保護(hù)的函數(shù)中:先進(jìn)入函數(shù)入口的堆棧(Push),然后將金絲雀保存在堆棧中。具體值用戶(hù)可以stack_protection.c中更改__stack_chk_guard;在函數(shù)出口,會(huì)檢測(cè)堆棧金絲雀的值是否還是__stack_chk_guard,如果沒(méi)有,說(shuō)明堆棧被篡改了,會(huì)調(diào)用__stack_chk_fail函數(shù)。
調(diào)試
反匯編斷點(diǎn)到需要堆棧保護(hù)的函數(shù)(Disassembly)入口暫停后,發(fā)現(xiàn)編譯器在函數(shù)入口處進(jìn)入堆棧后,保存了堆棧金絲雀:
在函數(shù)出口處打斷點(diǎn),然后操作程序。當(dāng)函數(shù)返回時(shí),將首先檢測(cè)堆疊金絲雀的值是否__stack_chk_guard,如果沒(méi)有,說(shuō)明堆棧被篡改了,會(huì)調(diào)用__stack_chk_fail函數(shù)。
改變堆棧金絲雀的值使之和__stack_chk_guard操作程序不一致,函數(shù)返回時(shí)會(huì)調(diào)用__stack_chk_fail函數(shù):
總結(jié)
本文主要介紹了如何利用堆棧緩存來(lái)影響代碼的安全性。IAR Embedded Workbench堆棧保護(hù)可以檢測(cè)堆棧的完整性,從而提高代碼的安全性。
參考文獻(xiàn):
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)
- 艾瑞電子任命Kirk Schell全球元器件業(yè)務(wù)總裁
- Software République宣布智能安全可持續(xù)旅行計(jì)劃的初步戰(zhàn)斗
- 激光雷達(dá)迎來(lái)了大考驗(yàn):如何將技術(shù)價(jià)值轉(zhuǎn)化為用戶(hù)價(jià)值?
- 國(guó)產(chǎn)雙尾蝎無(wú)人機(jī)在高海拔地區(qū)完成全網(wǎng)應(yīng)急通信覆蓋試驗(yàn)
- 演奏數(shù)字時(shí)代最強(qiáng)音,IDC中國(guó)未來(lái)企業(yè)獎(jiǎng)卓越獎(jiǎng)在京揭曉
- 儒卓力在福建廈門(mén)設(shè)立辦事處 作為重要的業(yè)務(wù)拓展平臺(tái)
- Digi-Key 全球獨(dú)家現(xiàn)貨銷(xiāo)售 u-blox 的新型 XPLR-IoT-1 套件
- 恩智浦推出了經(jīng)認(rèn)證的全新EdgeLock簡(jiǎn)化物聯(lián)網(wǎng)設(shè)備安全認(rèn)證芯片的安全身份驗(yàn)證
- 多措并舉,Power Integrations使?fàn)恳孀兤鞲踩煽?/a>
- 長(zhǎng)信存儲(chǔ)或于Q2交付17nm DRAM樣品
- 安富利洞察:芯片短缺將徹底改變?cè)O(shè)計(jì)、采購(gòu)和供應(yīng)鏈合作伙伴關(guān)系
- 英特爾與百度攜手推動(dòng)產(chǎn)業(yè)智能化進(jìn)程,共創(chuàng)綠色未來(lái)
