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