周建華 李 豐 湛藍(lán)藍(lán) 杜躍進(jìn) 霍 瑋
1(中國科學(xué)院信息工程研究所 北京 100093)2(中國科學(xué)院大學(xué)網(wǎng)絡(luò)空間安全學(xué)院 北京 100049)3(中國科學(xué)院網(wǎng)絡(luò)測評技術(shù)重點(diǎn)實(shí)驗(yàn)室 北京 100195)4(網(wǎng)絡(luò)安全防護(hù)技術(shù)北京市重點(diǎn)實(shí)驗(yàn)室 北京 100195)5(三六零科技集團(tuán)有限公司 北京 100015)
物聯(lián)網(wǎng)設(shè)備在國民經(jīng)濟(jì)中發(fā)揮著日益重要的作用,然而,設(shè)備廠商對網(wǎng)絡(luò)安全的忽視導(dǎo)致物聯(lián)網(wǎng)設(shè)備的安全問題嚴(yán)重突出.根據(jù)公開安全研究報告顯示[1],57%的物聯(lián)網(wǎng)設(shè)備存在中、高危安全漏洞,給互聯(lián)網(wǎng)帶來巨大的安全威脅.其中,家用路由器、網(wǎng)絡(luò)攝像頭等嵌入式設(shè)備由于開放了多種服務(wù)(如Web服務(wù)、DNS服務(wù)),因此,近年來這些嵌入式設(shè)備的安全漏洞頻頻暴露.
污點(diǎn)分析是檢測嵌入式設(shè)備漏洞的重要手段,而無害處理操作(sanitizer)又是污點(diǎn)分析的重要組成部分[2].污點(diǎn)分析的無害處理操作是指檢查程序是否對污點(diǎn)數(shù)據(jù)進(jìn)行了安全操作或者過濾,使污點(diǎn)數(shù)據(jù)不再具有安全風(fēng)險.現(xiàn)有方法通常依賴符號執(zhí)行或者簡單模式匹配識別無害處理操作,然而,前者存在路徑爆炸和耗時的約束求解問題;后者沒有判斷約束表達(dá)式中的變量和污點(diǎn)變量的關(guān)聯(lián)關(guān)系,導(dǎo)致識別結(jié)果存在漏報.
為了解決上述問題,本文分析了無害處理操作的代碼特征,在此基礎(chǔ)上設(shè)計并實(shí)現(xiàn)了一種基于無害處理識別的嵌入式設(shè)備漏洞檢測方法(approach based on sanitizer identification, ASI).該方法首先通過建立污點(diǎn)變量及其長度變量的關(guān)聯(lián)關(guān)系,識別基于路徑條件約束的無害處理操作;同時通過啟發(fā)式方法檢測攻擊字符過濾函數(shù),從而識別基于函數(shù)的無害處理操作;最后,檢查傳入危險函數(shù)的關(guān)鍵變量是否經(jīng)過無害處理,如果不滿足,則報告存在疑似緩沖區(qū)溢出或者命令注入漏洞.
在嵌入式設(shè)備固件程序中,污點(diǎn)傳播過程中的無害處理主要涉及2類操作,分別為基于路徑條件約束對用戶輸入數(shù)據(jù)的長度限制和基于無害處理函數(shù)對用戶輸入數(shù)據(jù)的有效性檢查.當(dāng)用戶輸入傳遞到數(shù)據(jù)訪問類的危險函數(shù)時,如果缺少對輸入數(shù)據(jù)的長度約束,則可能導(dǎo)致緩沖區(qū)溢出漏洞;當(dāng)用戶輸入傳遞到命令執(zhí)行類的危險函數(shù)時,如果缺少對輸入數(shù)據(jù)的有效性檢查(如是否過濾特殊字符或字符串),則可能存在命令注入的風(fēng)險.
為了準(zhǔn)確識別無害處理操作,現(xiàn)有方法在以下2方面進(jìn)行了嘗試[3-9]:一種是基于符號執(zhí)行的路徑約束收集,代表性工作為Karonte[10]和SaTC[11].然而,基于符號執(zhí)行的方法存在路徑爆炸和耗時的約束求解問題,導(dǎo)致漏洞檢測時間開銷高.另一種無害處理識別方法為基于簡單的模式匹配方法,其中代表性工作為Dtaint[12]和EmTaint[13].Dtaint和EmTaint通過檢查傳入危險函數(shù)的關(guān)鍵變量是否經(jīng)過指定模式的約束表達(dá)式,從而確認(rèn)路徑條件約束是否存在,如Dtaint重點(diǎn)關(guān)注“n 通過變量關(guān)聯(lián)關(guān)系進(jìn)行識別是識別無害處理操作的有效手段,然而嵌入式設(shè)備固件程序以二進(jìn)制形態(tài)呈現(xiàn),程序通過寄存器和堆棧對變量進(jìn)行存儲和訪問,因此代表變量類型和名稱的語義信息丟失,使得分析人員無法直觀獲取某變量對應(yīng)的長度變量信息. 本文通過分析無害處理操作的特征,設(shè)計并實(shí)現(xiàn)了基于無害處理識別的嵌入式設(shè)備漏洞檢測方法ASI.ASI通過識別基于路徑條件約束的無害處理操作和基于函數(shù)的無害處理操作,提升污點(diǎn)分析技術(shù)的精度,降低漏洞檢測結(jié)果的誤報.如圖1所示,ASI主要包含基于長度約束的變量關(guān)聯(lián)關(guān)系識別、啟發(fā)式的攻擊字符過濾函數(shù)識別、基于無害處理識別的漏洞檢測3個階段. 在嵌入式設(shè)備固件程序中,基于路徑條件約束的無害處理操作主要是對污點(diǎn)變量的長度進(jìn)行約束.因此,基于路徑條件約束的無害處理識別需要檢查污點(diǎn)變量在傳入危險函數(shù)之前是否進(jìn)行了長度約束.本文基于路徑條件約束的無害處理識別,重點(diǎn)識別變量之間的“內(nèi)容-長度”關(guān)系,并基于這種關(guān)聯(lián)關(guān)系推斷路徑條件約束表達(dá)式中的變量是否為污點(diǎn)變量的長度變量. 該階段首先根據(jù)長度變量被獲取時的3種代碼特征,識別變量之間的長度關(guān)聯(lián)關(guān)系.其次,基于識別出的污點(diǎn)變量及其長度變量,采取2種形式對變量關(guān)聯(lián)關(guān)系進(jìn)行標(biāo)記.最后,進(jìn)行變量關(guān)聯(lián)關(guān)系的傳播. 2.2.1 關(guān)聯(lián)關(guān)系識別 為了識別變量“內(nèi)容-長度”之間的關(guān)聯(lián)關(guān)系,本文總結(jié)了長度變量被獲取時的3種代碼特征:1)根據(jù)常見污點(diǎn)源函數(shù)(如recvmsg)接收數(shù)據(jù)報文并指定報文長度;2)通過特定內(nèi)存訪問模式建立關(guān)聯(lián)關(guān)系,如通過strlen-malloc-memcpy等函數(shù)建立原始變量長度與新申請變量之間的關(guān)聯(lián)關(guān)系;3)根據(jù)長度獲取函數(shù)(如strlen)獲取關(guān)聯(lián)關(guān)系. 根據(jù)上述3種代碼特征,本文采用3種方式識別變量之間的“內(nèi)容-長度”關(guān)聯(lián)關(guān)系. 首先,基于標(biāo)準(zhǔn)污點(diǎn)源函數(shù)原型確定參數(shù)變量之間的關(guān)聯(lián)關(guān)系.本文通過內(nèi)置4種庫函數(shù)的變量關(guān)聯(lián)關(guān)系規(guī)則(如表1所示),標(biāo)記數(shù)據(jù)及其長度的對應(yīng)關(guān)系. 表1 常見的報文接收函數(shù)及其參數(shù)關(guān)聯(lián)關(guān)系 其次,根據(jù)內(nèi)存訪問模式識別變量關(guān)聯(lián)關(guān)系.通過識別“長度獲取-內(nèi)存申請-內(nèi)存賦值”訪問模式,檢查程序是否獲取了污點(diǎn)變量的長度(記為taintLen),并將其和新申請的內(nèi)存變量taintVar進(jìn)行關(guān)聯(lián). 最后,基于標(biāo)準(zhǔn)化的長度獲取函數(shù)識別變量關(guān)聯(lián)關(guān)系.本文根據(jù)標(biāo)準(zhǔn)長度獲取操作,包括sizeof(),strlen()等獲取污點(diǎn)變量的長度信息. 2.2.2 關(guān)聯(lián)關(guān)系標(biāo)記 基于初始識別出的“內(nèi)容-長度”關(guān)聯(lián)關(guān)系,本文采取2種方式進(jìn)行關(guān)聯(lián)關(guān)系的標(biāo)記: 第1種標(biāo)記方式是在污點(diǎn)狀態(tài)中進(jìn)行關(guān)聯(lián)關(guān)系標(biāo)記,即直接在污點(diǎn)狀態(tài)信息中標(biāo)記污點(diǎn)變量對應(yīng)的長度變量; 第2種標(biāo)記方式是利用特定結(jié)構(gòu)標(biāo)記存儲具有長度關(guān)聯(lián)關(guān)系的變量結(jié)構(gòu)體信息.即如果污點(diǎn)變量和長度變量存儲在具備相同基地址和不同偏移的??臻g,則判定2個變量位于該基地址所指向的結(jié)構(gòu)體,并標(biāo)記結(jié)構(gòu)體的偏移信息. 2.2.3 關(guān)聯(lián)關(guān)系傳播 對于標(biāo)記在污點(diǎn)狀態(tài)中的關(guān)聯(lián)關(guān)系,隨著污點(diǎn)傳播實(shí)現(xiàn)對長度關(guān)系的傳播即可.對于標(biāo)記在特定結(jié)構(gòu)體中的關(guān)聯(lián)關(guān)系,如果后續(xù)存在對結(jié)構(gòu)中偏移信息的訪問,則進(jìn)行關(guān)聯(lián)關(guān)系傳播. 當(dāng)污點(diǎn)數(shù)據(jù)傳入命令執(zhí)行類危險函數(shù)時,為了防止命令注入漏洞的發(fā)生,嵌入式設(shè)備廠商常通過無害處理函數(shù)對用戶輸入數(shù)據(jù)的有效性進(jìn)行檢查.無害處理函數(shù)的使用主要體現(xiàn)在2個方面:一是通過對特殊字符串的過濾;二是調(diào)用常見無害處理函數(shù)的包裝函數(shù). 對于特殊字符串過濾函數(shù),ASI基于以下啟發(fā)式方法進(jìn)行識別:1)識別函數(shù)中是否存在對可導(dǎo)致命令執(zhí)行的7種特殊字符或者字符串的過濾,包括“;,.sh,iptables,telnetd,|,’,&”;2)識別函數(shù)體是否包含對字符串匹配后的分支處理;3)函數(shù)功能是否單一.由于過濾函數(shù)的目的是對參數(shù)中出現(xiàn)的特殊字符或者字符串進(jìn)行檢查,因此函數(shù)中包含的基本塊數(shù)量和所調(diào)用的函數(shù)數(shù)量相對較少.根據(jù)經(jīng)驗(yàn),本文設(shè)置函數(shù)基本塊數(shù)量上限為7,所調(diào)用的函數(shù)數(shù)量上限為5. 對于無害處理包裝函數(shù)識別,ASI內(nèi)置了6個常見的無害處理函數(shù)列表,如表2所示.ASI將上述函數(shù)及其包裝函數(shù)識別為無害處理函數(shù). 表2 常見無害處理函數(shù)列表 該過程以獲取的變量關(guān)聯(lián)關(guān)系和攻擊字符過濾函數(shù)為基礎(chǔ),實(shí)現(xiàn)基于路徑條件約束的無害處理識別和基于函數(shù)的無害處理識別,并同步完成漏洞檢測.當(dāng)用戶輸入傳遞到數(shù)據(jù)訪問類的危險函數(shù)時,如果不存在對輸入數(shù)據(jù)的長度約束,則報告存在疑似緩沖區(qū)溢出漏洞;當(dāng)用戶輸入傳遞到命令執(zhí)行類的危險函數(shù)時,如果缺少對輸入數(shù)據(jù)的有效性檢查,則報告存在疑似命令注入漏洞. 對于緩沖區(qū)溢出漏洞檢測,本文關(guān)注路徑約束表達(dá)式中是否存在對傳入危險函數(shù)關(guān)鍵變量的長度變量的判斷,如果滿足則說明存在無害處理操作;否則報告存在疑似緩沖區(qū)溢出漏洞.例如,對于if(n 對于命令注入漏洞檢測,本文主要檢查傳入命令執(zhí)行類函數(shù)的關(guān)鍵變量是否經(jīng)過攻擊字符過濾函數(shù)的無害處理,如果滿足則說明存在無害處理操作;否則認(rèn)為不存在無害處理,并報告存在疑似命令注入漏洞. 本文在已有嵌入式設(shè)備漏洞檢測原型系統(tǒng)ITS[14]的基礎(chǔ)上,設(shè)計并實(shí)現(xiàn)了基于無害處理識別的嵌入式設(shè)備漏洞檢測系統(tǒng)ASI@VARAS.為了驗(yàn)證本文方法的有效性,本文分析了基于無害處理識別的嵌入式設(shè)備漏洞檢測的精度和效率. 本文采用與ITS相同的實(shí)驗(yàn)測試集,包括5個主流的嵌入式設(shè)備廠商的10款設(shè)備固件(如表3所示).本文實(shí)驗(yàn)均在英特爾i7處理器上運(yùn)行,內(nèi)存為32GB的64位的Ubuntu18.04系統(tǒng). 表3 無害處理識別測試集 本節(jié)利用表3所示測試集進(jìn)行了漏洞檢測實(shí)驗(yàn).實(shí)驗(yàn)主要對比在加入基于無害處理識別的嵌入式設(shè)備漏洞檢測技術(shù)前后的漏洞檢測結(jié)果.由于該測試集選取的是ITS全部測試集,且本文方法也是在ITS基礎(chǔ)上進(jìn)行實(shí)現(xiàn)的,因此加入ASI前的漏洞檢測數(shù)據(jù)可以直接采信ITS的結(jié)果. 采用ASI前后的漏洞檢測結(jié)果如表4所示.其中,前3列為選取的測試集信息,第5,6列為采信的ITS的實(shí)驗(yàn)結(jié)果,第7,8列為加入無害處理識別后的漏洞檢測結(jié)果.ASI生成檢測報告中包含可能引入用戶輸入的污點(diǎn)源變量所在位置,以及可能出現(xiàn)緩沖區(qū)溢出、命令注入的漏洞位置.本文對ASI生成的檢測報告逐一進(jìn)行人工審計,采用與ITS相同的誤報判定方式,將從污點(diǎn)源到漏洞位置(匯聚點(diǎn))之間不存在可達(dá)路徑的漏洞報告標(biāo)識為誤報. 表4 漏洞檢測結(jié)果 通過表4中的統(tǒng)計數(shù)據(jù)可以看出,加入基于無害處理識別的嵌入式設(shè)備漏洞檢測技術(shù)前,針對10款設(shè)備固件,系統(tǒng)累計報告了201個漏洞,其中59個經(jīng)人工分析確認(rèn)為誤報,誤報率為29.35%((總結(jié)果-正確結(jié)果)/總結(jié)果).加入無害處理識別技術(shù)后,ASI累計報告了177個漏洞,其中35個經(jīng)人工分析確認(rèn)為誤報,誤報率為19.77%.經(jīng)比較,ASI的誤報率相對于ITS降低了9.58%(從29.35%降低到19.77%). 從實(shí)驗(yàn)數(shù)據(jù)可以看出,Netgear R8300,Tenda W20E等大部分設(shè)備固件在加入基于無害處理識別的嵌入式設(shè)備漏洞檢測技術(shù)后,報告的漏洞均有一定數(shù)量的減少,漏洞檢測結(jié)果的準(zhǔn)確性有所提高.但是對于D-Link DIR859和Tenda AC9固件,漏洞檢測結(jié)果和之前沒有變化.通過人工分析,由于該固件之前的誤報主要是由于將輸入進(jìn)行類型轉(zhuǎn)換后,將字符串類型轉(zhuǎn)為int類型,導(dǎo)致漏洞無法觸發(fā),所以加入無害處理識別后并沒有影響系統(tǒng)對該固件漏洞檢測的準(zhǔn)確率. 表5統(tǒng)計了加入ASI技術(shù)之后,本文系統(tǒng)在表3所示固件測試集上的時間開銷.原有工作ITS在進(jìn)行性能分析時,對嵌入式設(shè)備固件中的所有二進(jìn)制文件進(jìn)行了實(shí)驗(yàn)分析.與ITS不同的是,本文通過人工提取了可能會導(dǎo)致漏洞的二進(jìn)制程序進(jìn)行分析.可以看出,對于10款嵌入式設(shè)備固件,在加入ASI技術(shù)之前,本文系統(tǒng)的平均時間開銷為36.05min,加入ASI技術(shù)之后,系統(tǒng)的平均時間開銷為38.73min.即在加入ASI技術(shù)之后,本文系統(tǒng)的平均分析時間增加了2.68min,占原有系統(tǒng)總時間的7.43%. 表5 漏洞檢測性能分析 min 本文通過分析嵌入式設(shè)備服務(wù)程序中基于路徑條件約束的無害處理以及基于函數(shù)的無害處理操作的代碼特征,實(shí)現(xiàn)了基于無害處理識別的嵌入式設(shè)備漏洞檢測方法ASI,通過對主流廠商的10款設(shè)備固件的實(shí)驗(yàn)結(jié)果顯示,相較于已有嵌入式設(shè)備漏洞檢測方法ITS,ASI的誤報率降低9.58%(從29.35%降低到19.77%),而檢測時間開銷僅增加7.43%.同時,獲取的變量關(guān)聯(lián)關(guān)系信息可以支持為嵌入式設(shè)備廠商提供漏洞修補(bǔ)[15]解決方案.2 方法設(shè)計與實(shí)現(xiàn)
2.1 總體框架
2.2 基于長度約束的變量關(guān)聯(lián)關(guān)系識別
2.3 啟發(fā)式的攻擊字符過濾函數(shù)識別
2.4 基于無害處理識別的漏洞檢測
3 實(shí)驗(yàn)與分析
3.1 實(shí)驗(yàn)配置
3.2 漏洞檢測結(jié)果分析
3.3 漏洞檢測性能分析
4 結(jié) 語