嵌入式軟件是物聯(lián)網(wǎng)的核心,盡管嵌入式應用程序安全通常不被認為是嵌入式開發(fā)人員和物聯(lián)網(wǎng)設備制造商的優(yōu)先事項,這可能是由于缺乏安全編碼知識或團隊代碼庫之外的其他挑戰(zhàn)造成的。
開發(fā)人員面臨的其他挑戰(zhàn)可能包括但不限于原始設計制造商(ODM)供應鏈、有限內存、小堆棧,以及將固件更新安全推送到端點的挑戰(zhàn)。
防止內存損壞漏洞
在使用低級語言(如C)時,如果開發(fā)人員沒有以編程方式正確檢查和驗證邊界,則很有可能出現(xiàn)內存損壞錯誤。防止使用已知的危險函數(shù)和API有助于防止固件中的內存損壞漏洞。例如,已知的、不安全的C函數(shù)的非詳盡列表包括:strcat、strcpy、sprintf、scanf和gets。
常見內存損壞漏洞可能包括堆?;蚨岩绯觥9暨@些特定內存損壞漏洞時的影響因操作系統(tǒng)平臺而異。例如,商用RTOS平臺(如QNX
Neutrino)將每個進程及其堆棧與文件系統(tǒng)隔離,從而最大限度地減少攻擊面。但是,對于常見的嵌入式Linux發(fā)行版,情況可能并非如此。在嵌入式開發(fā)中,嵌入式Linux中的緩沖區(qū)溢出可能導致攻擊者任意執(zhí)行惡意代碼和修改操作系統(tǒng)。
一些內存安全控制方法可用于防止內存損壞漏洞,例如:
使用安全的編譯器標志,例如-fPIE、-fstack-protector-all、-Wl、-z、noexecstack,-Wl、-z、noexecaspect和其他可能取決于特定編譯器版本的標志。
首選包含內存管理單元(MMU)的片上系統(tǒng)(SoC)和微控制器(MCU)。MMUs隔離線程和進程,以在內存漏洞被利用時減少攻擊面。
首選包含內存保護單元(MPU)的片上系統(tǒng)(SoC)和微控制器(MCU)。MPUs強制執(zhí)行內存和獨立進程的訪問規(guī)則,以及強制執(zhí)行特權規(guī)則。
如果沒有MMU或MPU可用,則使用已知位監(jiān)控堆棧,通過確定堆棧中有多少不再包含已知位來監(jiān)控堆棧的消耗量。
使用后,請注意緩沖區(qū)和空閑緩沖區(qū)中放置的內容。
利用地址空間布局隨機化(ASLR)和其他堆??丶膬却媛┒催M行攻擊需要攻擊者付出大量努力。盡管如此,在某些情況下仍然是可能的。確保代碼具有彈性,并對存儲在內存中的數(shù)據(jù)采用深入防御的方法,這將有助于嵌入式開發(fā)設備的安全態(tài)勢。
防止注入攻擊
注入攻擊是任何web應用程序中最常見的漏洞之一,尤其是在物聯(lián)網(wǎng)系統(tǒng)中。有許多類型的注入攻擊,如操作系統(tǒng)(OS)命令注入、跨站點腳本(例如Javascript注入)、SQL注入、日志注入,以及表達式語言注入等。在物聯(lián)網(wǎng)和嵌入式系統(tǒng)中,最常見的注入攻擊類型是操作系統(tǒng)命令注入;應用程序接受不受信任的用戶輸入并傳遞該值以執(zhí)行shell命令,而無需輸入驗證或正確的轉義和跨站點腳本(XSS)。
以下是防止注入攻擊的常見最佳做法和控制措施列表:
如果可能,避免直接調用操作系統(tǒng)調用。
如果需要,白名單接受命令并在執(zhí)行之前驗證輸入值。
使用數(shù)字的查找映射來為可能傳遞到操作系統(tǒng)(如{1:ping-c5})的用戶驅動字符串命令字符串。
對代碼庫執(zhí)行靜態(tài)代碼分析,并在使用OS命令(如os.system())時發(fā)出警報。
將所有用戶輸入視為不可信的,并輸出返回給用戶的數(shù)據(jù)的編碼字符。(例如,Convert&to&,Convert<to<,Convert>to>,等等。)
對于XSS,使用HTTP響應頭,如X-XSS-Protection和Content-Security策略,并配置相應的指令。
確保在生產(chǎn)固件構建上禁用帶有命令執(zhí)行的調試接口。
在生產(chǎn)環(huán)境中使用固件之前,上述控件始終需要進行測試。通過注入攻擊,設備和用戶將面臨被攻擊者和胭脂設備接管的風險。2017年,IoT收割者和Persirai僵尸網(wǎng)絡發(fā)生此類事件,這只是開始。
構成物聯(lián)網(wǎng)(IoT)主干的連接設備存在多個漏洞,可供黑客滲透。為了減輕這些設備中底層固件的威脅,嵌入式開發(fā)人員需要熟悉大量的安全技術。