国产精品久久精品牛牛影视-国产精品久久精品视-国产精品久久九九-国产精品久久久-国产精品久久久99

芯片采購(gòu),IC采購(gòu),芯片采購(gòu)平臺(tái)
芯片
每日新聞?lì)^條
在IAR Embedded Workbench如何在開(kāi)發(fā)工具中實(shí)現(xiàn)堆棧保護(hù),提高代碼的安全性
(2025年8月23日更新)

隨著越來(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)

芯片采購(gòu)網(wǎng)|IC采購(gòu)|IC代理商 - 國(guó)內(nèi)專(zhuān)業(yè)的芯片采購(gòu)平臺(tái)
芯片采購(gòu)網(wǎng)專(zhuān)注整合國(guó)內(nèi)外授權(quán)IC代理商的現(xiàn)貨資源,輕松采購(gòu)IC芯片,是國(guó)內(nèi)專(zhuān)業(yè)的芯片采購(gòu)平臺(tái)
主站蜘蛛池模板: 精品夜夜春夜夜爽久久| 国产精品免费观在线| 久久国产精品免费专区| 亚洲三页| 一级做a爰片久久毛片唾| 成人欧美在线视频| 欧美日韩亚洲国内综合网俺| 114一级毛片免费| 日本一级作爱片在线观看| 成年网站视频在线观看| 国产一区视频在线播放| 国产综合福利| 欧美五月婷婷| 亚洲国产精| 女人被免费看在线看| 亚洲成a人片在线观| 免费网站看av片| 欧美第二区| 国产成人免费片在线视频观看| 真人午夜a一级毛片| 4hc44四虎在线永久地址| 国产精品成人观看视频网站| 亚洲看片网| 巨乳毛片| 中文福利视频| 成人aaaa| 伊人网国产| 免费一级毛片视频| 国产精品亚洲精品爽爽| 黄色影院免费观看| 91久久青青草原线免费| 国产第一页无线好源| 国拍在线精品视频免费观看| 开心激情站| 美女拍拍拍免费视频观看| 欧美一区二区三区视频| 婷婷 夜夜| 123456成年免费视频| 99视频在线精品| 99热视| 99久久综合九九亚洲|