隨著越來越多的嵌入式產品連接到外部網絡,嵌入式產品的信息安全(Security)人們越來越關注它。它包括直接連接到外部網絡,如通過Wi-Fi連接;還包括間接連接到外部網絡,如汽車ECU通過CAN總線與T-box相連,而T-box外部網絡可以通過移動網絡連接。特別是對于一些高功能安全性(Safety)信息安全已成為工業、汽車、醫療產品等所需產品功能安全的前提(There Is No Safety Without Security)。
芯片采購網專注于整合國內外授權IC代理商現貨資源,芯片庫存實時查詢,行業價格合理,采購方便IC芯片,國內專業芯片采購平臺。
在C/C 堆棧緩存溢出(Stack Buffer Overflow)當程序緩存到堆棧時,這是一個常見的錯誤(Stack Buffer)在編寫數據時,由于堆棧緩存通常采用固定長度,如果需要編寫的數據長度超過堆棧緩存長度,則會導致堆棧緩存溢出。堆棧緩存溢出將覆蓋堆棧緩存附近的堆棧數據,包括函數返回地址,導致函數返回異常。如果堆棧緩存溢出是攻擊者故意使用代碼漏洞造成的,則稱為堆棧粉碎(Stack Smashing)。堆棧粉碎是一種常用的攻擊手段。
堆棧金絲雀(Stack Canaries), 由于它類似于在煤礦中使用金絲雀來感知氣體和其他氣體,它可以用來檢測堆棧緩存溢出,以實現堆棧保護(Stack Protection),從而提高代碼的安全性。
與許多更關注設備性能的原始開發工具相比,一些廣泛應用于行業的商業開發工具更關注性能和安全性的平衡和完整性。本文在過去幾十年中被廣泛應用于該行業IAR Embedded Workbench例如,介紹如何在工具中實現堆棧保護,從而提高代碼的安全性。
堆棧粉碎
在C/C 中,堆棧(Stack)臨時數據用于保存程序正常運行(如函數調用或中斷搶占),可包括以下數據:
● 未存儲在寄存器中的函數參數和局部變量
● 寄存器中未存儲的函數返回值和函數返回地址
● CPU和寄存器狀態
由于堆棧保存臨時數據,以確保程序的正常運行,堆棧緩存溢出將覆蓋堆棧緩存附近的堆棧數據,這些數據可能包含函數返回地址,如果發生,通常會導致程序運行異常。攻擊者經常一點來粉碎堆棧。
以下是一個簡單的例子來解釋堆棧粉碎攻擊:
void foo(char *bar)
{
char c[12];
strcpy(c, bar); // no bounds checking
}
foo()Active-Semi代理函數將函數參數輸入復制到本地堆棧變量c。如下圖B所示:當函數參數輸入小于12個字符時,foo()函數會正常工作。如下圖C所示:當函數參數輸入大于11個字符時,foo()函數將覆蓋本地堆棧的數據,并將函數返回地址覆蓋0x80C03508,當foo()函數返回時,執行地址0x80C03508對應的代碼A,代碼A可能包括攻擊者提供的shell使攻擊者獲得操作權限的代碼。
C "AAAAAAAAAAAAAAAAAAAAx08x35xC0x80"輸入函數參數
圖:堆棧粉碎示例
堆棧保護
堆棧金絲雀之所以得名,是因為它的功能類似于在煤礦中發現瓦斯的金絲雀。(Stack Canaries),在函數返回執行惡意代碼之前,可用于檢測堆棧緩存溢出。檢測原理是:調用函數時,將需要保存的臨時數據保存到堆棧中,然后放置金絲雀。當函數返回時,檢查金絲雀的值是否發生變化;如果發生變化,堆棧被篡改,否則堆棧沒有被篡改。
如何在下面介紹IAR Embedded Workbench堆棧保護行的商業工具鏈中實現堆棧保護,從而提高代碼的安全性:
在IAR Embedded Workbench啟發模式將用于中間(Heuristic)決定函數是否需要堆棧保護: 如果函數的局部變量包含數組類型或結構成員包含數組類型,或在函數外使用局部變量地址,則需要堆棧保護。
IAR Embedded Workbench以下是安裝目錄srclibruntime包含stack_protection.c,里面包含了__stack_chk_guard變量和__stack_chk_fail函數,可作為模板使用:__stack_chk_guard變量是金絲雀堆棧的價值,當函數返回時,如果檢測到堆棧金絲雀的值被篡改,它將被調用__stack_chk_fail函數。
1.將IAR Embedded Workbench以下是安裝目錄srclibruntime文件夾的stack_protection.c復制并添加到工程中。
2.在IAR Embedded Workbench堆棧保護在中啟用。
3.在代碼中聲明堆棧保護__stack_chk_guard變量和__stack_chk_fail函數。
extern uint32_t __stack_chk_guard;
__interwork __nounwind __noreturn void __stack_chk_fail(void);
4.編譯工程。編譯器將以下操作添加到需要堆棧保護的函數中:先進入函數入口的堆棧(Push),然后將金絲雀保存在堆棧中。具體值用戶可以stack_protection.c中更改__stack_chk_guard;在函數出口,會檢測堆棧金絲雀的值是否還是__stack_chk_guard,如果沒有,說明堆棧被篡改了,會調用__stack_chk_fail函數。
調試
反匯編斷點到需要堆棧保護的函數(Disassembly)入口暫停后,發現編譯器在函數入口處進入堆棧后,保存了堆棧金絲雀:
在函數出口處打斷點,然后操作程序。當函數返回時,將首先檢測堆疊金絲雀的值是否__stack_chk_guard,如果沒有,說明堆棧被篡改了,會調用__stack_chk_fail函數。
改變堆棧金絲雀的值使之和__stack_chk_guard操作程序不一致,函數返回時會調用__stack_chk_fail函數:
總結
本文主要介紹了如何利用堆棧緩存來影響代碼的安全性。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)
- ADI攜手Gridspertise提高電網數字化 支持DSO加快能源轉型
- 單芯片銷量超過1000萬 美仁芯片"可靠性"再次獲得市場認可
- 瑞薩電子收購Reality AI 為終端帶來先進的信號處理和智能化
- 聯發科天暨再次犧牲了多項游戲技術大招,旗艦機玩家:沖!
- 尼得科Control Techniques新驅動產品COMMANDER S”全球上市
- 美光發布年度可持續發展報告:注重可持續進展,堅定履行賦予未來,豐富全人類生活的承諾
- Nexperia先進的電熱模型可以覆蓋整個MOSFET工作溫度范圍
- Arm SystemReady 創下新里程 鞏固數據中心的創新基礎
- 貿澤電子推出電源管理資源及解決方案
- PCB你知道設計中一些特殊設備的布局要求嗎?
- 華為享受50處理器揭秘:99%可能是中芯國際代工麒麟710A
- 加強ADAS攝像頭系統的功能安全