《電子技術應用》
您所在的位置:首頁 > 通信與網(wǎng)絡 > 業(yè)界動態(tài) > 在IAR Embedded Workbench開發(fā)工具中如何實現(xiàn)堆棧保護來提高代碼的安全性

在IAR Embedded Workbench開發(fā)工具中如何實現(xiàn)堆棧保護來提高代碼的安全性

2022-05-29
來源:IAR Systems

  隨著越來越多的嵌入式產(chǎn)品連接到外部網(wǎng)絡,嵌入式產(chǎn)品的信息安全性(Security)越來越多地被人們關注。其中既包括直接連接到外部網(wǎng)絡,比如通過Wi-Fi連接;也包括間接連接到外部網(wǎng)絡,比如汽車中的ECU通過CAN總線與T-box相連,而T-box通過移動網(wǎng)絡可以連接到外部網(wǎng)絡。特別是對于一些高功能安全性(Safety)要求的產(chǎn)品,如工業(yè),汽車,醫(yī)療產(chǎn)品等,信息安全成為了功能安全的前提(There Is No Safety Without Security)。

  在C/C++中,堆棧緩存溢出(Stack Buffer Overflow)是一種常見的錯誤:當程序往堆棧緩存(Stack Buffer)寫數(shù)據(jù)時,由于堆棧緩存通常采用固定長度,如果需要寫的數(shù)據(jù)長度超過堆棧緩存的長度時,就會造成堆棧緩存溢出。堆棧緩存溢出會覆蓋堆棧緩存臨近的堆棧數(shù)據(jù),其中可能包含函數(shù)的返回地址,就會造成函數(shù)返回時異常。如果堆棧緩存溢出是攻擊者利用代碼的漏洞蓄意造成的,它就稱為堆棧粉碎(Stack Smashing)。堆棧粉碎是常用的一種攻擊手段。

  堆棧金絲雀(Stack Canaries), 因其類似于在煤礦中使用金絲雀來感測瓦斯等氣體而得名,它可以用于在函數(shù)返回之前檢測堆棧緩存溢出來實現(xiàn)堆棧保護(Stack Protection),從而提高代碼的安全性。

  相對于很多更加關注發(fā)揮器件性能的原廠開發(fā)工具,一些在行業(yè)中被廣泛使用的商用開發(fā)工具更加關注性能和安全性的平衡性和完整性。本文以過去數(shù)十年來在行業(yè)中被廣泛采用的商用工具鏈IAR Embedded Workbench為例,介紹如何在工具中實現(xiàn)堆棧保護,從而提高代碼的安全性。

  堆棧粉碎

  在C/C++中,堆棧(Stack)用于保存程序正常運行(比如函數(shù)調(diào)用或者中斷搶占)的臨時數(shù)據(jù),可能包含如下數(shù)據(jù):

  沒有存儲在寄存器中的函數(shù)參數(shù)和局部變量

  沒有存儲在寄存器中的函數(shù)返回值和函數(shù)返回地址

  CPU和寄存器狀態(tài)

  由于堆棧保存的是保證程序正常運行的臨時數(shù)據(jù),堆棧緩存溢出會覆蓋堆棧緩存臨近的堆棧數(shù)據(jù),這些數(shù)據(jù)可能包含函數(shù)的返回地址,如果發(fā)生時一般會造成程序運行異常。攻擊者經(jīng)常利用這一點來進行堆棧粉碎攻擊。

  下面通過一個簡單的例子來說明堆棧粉碎攻擊:

  void foo(char *bar)

  {

  char c[12];

  strcpy(c, bar);  // no bounds checking

  }

  foo()函數(shù)將函數(shù)參數(shù)輸入復制到本地堆棧變量c。如下圖B所示:當函數(shù)參數(shù)輸入小于12個字符時,foo()函數(shù)會正常工作。如下圖C所示:當函數(shù)參數(shù)輸入大于11個字符時,foo()函數(shù)會覆蓋本地堆棧的數(shù)據(jù),將函數(shù)返回地址覆蓋為0x80C03508,當foo()函數(shù)返回時,會執(zhí)行地址0x80C03508對應的代碼A,代碼A有可能包含攻擊者提供的shell代碼,從而使攻擊者獲得操作權限。

  

1.jpg

  圖:堆棧粉碎示例

  堆棧保護

  因其功能類似于在煤礦中用來發(fā)現(xiàn)瓦斯的金絲雀而得名的堆棧金絲雀(Stack Canaries),可以用于在函數(shù)返回執(zhí)行惡意代碼之前檢測堆棧緩存溢出。其檢測原理是:當調(diào)用函數(shù)時,將需要保存的臨時數(shù)據(jù)保存到堆棧,然后放置一個堆棧金絲雀,當函數(shù)返回時,檢查堆棧金絲雀的值是否發(fā)生改變;如果發(fā)生改變,說明堆棧已被篡改,否則說明堆棧沒有被篡改。

  下面介紹如何在IAR Embedded Workbench這種廣受歡迎的商用工具鏈中實現(xiàn)堆棧保護,從而提高代碼的安全性:

  在IAR Embedded Workbench中,會使用啟發(fā)模式(Heuristic)來決定函數(shù)是否需要堆棧保護: 如果函數(shù)局部變量包含數(shù)組類型或者結構體成員包含數(shù)組類型,或者局部變量的地址在該函數(shù)外被使用,該函數(shù)需要堆棧保護。

  IAR Embedded Workbench安裝目錄下面\src\lib\runtime包含stack_protection.c,里面包含了__stack_chk_guard變量和__stack_chk_fail函數(shù),可以作為模板使用:其中__stack_chk_guard變量就是堆棧金絲雀的值,在函數(shù)返回時,如果檢測到堆棧金絲雀的值被篡改,就會調(diào)用__stack_chk_fail函數(shù)。

  1.將IAR Embedded Workbench安裝目錄下面\src\lib\runtime文件夾的stack_protection.c拷貝并添加到工程。

  2.在IAR Embedded Workbench中啟用堆棧保護。

  2.png

  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ù)入口處入棧操作之后額外將堆棧金絲雀保存:

  

3.png

4.png

  在函數(shù)出口處打斷點,然后運行程序,在函數(shù)返回時,會先檢測堆棧金絲雀的值是否還是__stack_chk_guard,如果不是,說明堆棧被篡改,會調(diào)用__stack_chk_fail函數(shù)。

  

5.png

  改變堆棧金絲雀的值使之與__stack_chk_guard不一致,然后運行程序,函數(shù)返回時將會調(diào)用__stack_chk_fail函數(shù):

 

6.png

  總結

  本文主要介紹了堆棧粉碎攻擊如何利用堆棧緩存溢出來影響代碼的安全性。通過在IAR Embedded Workbench中實現(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)





圖片.jpg


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權者。如涉及作品內(nèi)容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
午夜视黄欧洲亚洲| 欧美精品粉嫩高潮一区二区| 亚洲国产一区在线观看| 亚洲免费中文字幕| 中文在线一区| 99re66热这里只有精品3直播| 在线观看日韩av电影| 国语自产精品视频在线看8查询8 | 欧美色图首页| 欧美黄污视频| 男女激情久久| 欧美成年人网| 欧美肥婆bbw| 欧美精品在线一区| 欧美破处大片在线视频| 欧美人与禽猛交乱配| 欧美日韩xxxxx| 欧美日本在线观看| 欧美三级网址| 国产精品久久久久久五月尺| 欧美色图天堂网| 国产精品乱码人人做人人爱| 国产精品人人做人人爽| 国产农村妇女毛片精品久久莱园子| 国产精品捆绑调教| 国产精品自拍在线| 黄色av日韩| 亚洲高清资源| 日韩写真在线| 亚洲一区制服诱惑| 欧美在线视频一区二区| 亚洲电影免费观看高清| 亚洲精品国产精品国自产观看浪潮| 99天天综合性| 亚洲欧美日韩中文播放| 久久精品官网| 欧美.日韩.国产.一区.二区| 欧美精品久久久久久久久老牛影院| 欧美日韩伦理在线免费| 国产精品激情| 国产一区二区剧情av在线| 一区在线播放| 日韩亚洲欧美一区二区三区| 亚洲女人天堂成人av在线| 久久精品视频va| 一本色道**综合亚洲精品蜜桃冫| 午夜久久美女| 久久午夜激情| 欧美三级视频| 国产一区二区激情| 亚洲欧洲在线播放| 亚洲一级免费视频| 久久狠狠婷婷| 一区二区三区黄色| 欧美中文字幕精品| 欧美福利电影在线观看| 国产精品va在线播放| 国内精品视频一区| 亚洲乱码一区二区| 欧美一区二区精品| 99精品久久久| 久久久久一区二区| 欧美日韩国产小视频在线观看| 国产欧美一区二区三区沐欲 | 久久精彩免费视频| 一本一本a久久| 久久er精品视频| 欧美激情第9页| 国产免费观看久久黄| 亚洲精品乱码久久久久久按摩观| 亚洲在线视频观看| 亚洲精品一区二区三区福利| 欧美一区二区三区日韩| 欧美国产综合| 国产婷婷精品| 亚洲免费观看高清完整版在线观看| 午夜精彩视频在线观看不卡| 日韩午夜激情av| 久久九九久精品国产免费直播| 欧美日韩国产首页在线观看| 一区二区在线视频观看| 午夜精品婷婷| 亚洲一区二区在线免费观看| 欧美成人按摩| 国产亚洲精品一区二区| 亚洲视频一区二区在线观看| 亚洲精品日韩精品| 久久综合伊人| 国产一区二区三区最好精华液| 国产精品99久久久久久久女警| 亚洲精品免费一区二区三区| 欧美有码在线观看视频| 国产精品videossex久久发布| 亚洲激情偷拍| 亚洲国产欧洲综合997久久| 欧美一区二区三区四区高清 | 亚洲福利一区| 久久精品视频免费观看| 国产精品日日摸夜夜添夜夜av| 99国产精品久久久久久久| 亚洲人成77777在线观看网| 久久久噜噜噜久久中文字免| 国产精品日韩专区| 在线视频欧美日韩| 一区二区激情视频| 欧美激情片在线观看| 亚洲成人直播| 亚洲高清视频在线| 久久亚洲精品一区| 国产午夜亚洲精品羞羞网站| 亚洲在线1234| 亚洲尤物在线| 欧美视频精品一区| 日韩视频免费在线观看| 99亚洲精品| 欧美日韩高清在线观看| 91久久综合| 夜夜嗨av一区二区三区| 欧美日韩国产成人高清视频| 亚洲精品视频一区| 一区二区三区四区五区精品| 欧美日本韩国一区| 亚洲精品欧美| 日韩一区二区精品葵司在线| 欧美久久一区| 亚洲看片一区| 亚洲天堂激情| 国产精品久久久久久久久果冻传媒 | 日韩视频一区| 欧美激情乱人伦| 日韩一级黄色片| 亚洲网站在线观看| 国产精品永久免费观看| 午夜精品久久一牛影视| 久久久久久久久综合| 伊人精品成人久久综合软件| 亚洲人成人一区二区在线观看| 欧美精品一区二区三区蜜桃 | 亚洲精选国产| 欧美日韩视频在线| 一本久道久久久| 亚洲免费在线播放| 国产欧美在线观看一区| 欧美综合国产精品久久丁香| 六月丁香综合| 亚洲精品黄色| 亚洲欧美日韩精品久久久久| 国产一区二区三区久久| 亚洲国产一区在线观看| 欧美另类一区| 亚洲伊人第一页| 久久久视频精品| 亚洲电影在线看| 亚洲一区二区三区午夜| 国产三级精品在线不卡| 亚洲欧洲一区二区在线播放| 欧美日韩播放| 亚洲欧美日韩人成在线播放| 久久久久99| 亚洲日本无吗高清不卡| 亚洲欧美日韩另类精品一区二区三区| 国产日韩精品在线| 亚洲精品人人| 国产精品久久久久aaaa樱花| 欧美一区二区三区在线观看| 欧美成人一二三| 亚洲一区视频| 欧美~级网站不卡| 中文高清一区| 久久天堂成人| 日韩亚洲视频| 久久免费国产| 日韩天堂在线观看| 久久精品噜噜噜成人av农村| 亚洲精品久久久久久久久久久久久| 亚洲欧美在线网| 亚洲高清不卡在线| 亚洲欧美清纯在线制服| 在线观看视频欧美| 亚洲欧美中文日韩v在线观看| 亚洲成色777777女色窝| 久久精品国产久精国产思思| 午夜一级久久| 国产裸体写真av一区二区| 欧美一区视频在线| 久久久久久久久久码影片| 日韩天堂av| 亚洲欧洲日韩综合二区| 欧美大色视频| 香蕉成人久久| 久久久www免费人成黑人精品| 亚洲综合清纯丝袜自拍| 久久这里只有精品视频首页| av成人黄色| 蜜臀av性久久久久蜜臀aⅴ| 宅男在线国产精品| 欧美xxx成人| 午夜欧美精品| 欧美日韩一区二区视频在线观看| 亚洲第一色中文字幕|