梁 娟
(武漢交通職業(yè)學(xué)院, 武漢 430065)
滲透測(cè)試,是為了證明網(wǎng)絡(luò)防御按照預(yù)期計(jì)劃正常運(yùn)行而提供的一種機(jī)制。滲透測(cè)試(penetration test)并沒有一個(gè)標(biāo)準(zhǔn)的定義,國外一些安全組織達(dá)成共識(shí)的通用說法是:通過模擬惡意黑客的攻擊方法,來評(píng)估計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)安全的一種評(píng)估方法。[1]這個(gè)過程包括對(duì)系統(tǒng)的任何弱點(diǎn)、技術(shù)缺陷或漏洞的主動(dòng)分析,這個(gè)分析是從一個(gè)攻擊者可能存在的位置來進(jìn)行的,并且從這個(gè)位置有條件主動(dòng)利用安全漏洞。廣義上來說覆蓋范圍較廣,可以使用各種端口、漏洞掃描工具掃描系統(tǒng)漏洞,同時(shí)可以開展Fuzzing測(cè)試、DOS攻擊測(cè)試系統(tǒng)抗攻擊能力,[2]也可以針對(duì)產(chǎn)品代碼做白盒分析測(cè)試,從白盒的角度發(fā)現(xiàn)漏洞,分析出系統(tǒng)可能存在的問題,并通過黑盒的方式進(jìn)行漏洞利用。本文主要從白盒的角度,通過代碼走讀的方式,講述如何對(duì)系統(tǒng)進(jìn)行滲透測(cè)試。
容易被程序員忽略,且被黑客利用的主要安全問題包括:[3]內(nèi)存管理問題、字符串操作安全問題、格式化輸出安全問題以及一些高危函數(shù)可能引起的問題。下面從這幾個(gè)方面分析如何對(duì)代碼進(jìn)行滲透測(cè)試,發(fā)現(xiàn)代碼中隱藏的安全問題。
有些函數(shù)如malloc分配出來的內(nèi)存是沒有初始化的,可以使用memset進(jìn)行清零,或者使用calloc進(jìn)行內(nèi)存分配,calloc分配的內(nèi)存是清零的。當(dāng)然,如果后面需要對(duì)申請(qǐng)的內(nèi)存進(jìn)行全部復(fù)制,就不要清零了,但要確保內(nèi)存被引用前是被初始化的。此外,分配內(nèi)存初始化,可以消除之前可能存放在內(nèi)存中的敏感信息,避免信息的泄露。
比如下面的代碼示例:
函數(shù)X_UINT32 X_PIC_Sendmsg中pcSendStr申請(qǐng)的內(nèi)存未初始化,如果傳入的uiLength<X_MSG_MAX_BUF,有部分內(nèi)存沒有被賦值,緩存內(nèi)容作為消息發(fā)送出去,有可能造成攻擊或消息泄露。
在某些函數(shù)中動(dòng)態(tài)申請(qǐng)了內(nèi)存,但后續(xù)沒有對(duì)申請(qǐng)的內(nèi)存進(jìn)行釋放,[4]導(dǎo)致內(nèi)存泄露,系統(tǒng)出現(xiàn)工作一段時(shí)間后異常的問題。
比如下面的代碼示例,每次啟動(dòng)組播丟包診斷功能,動(dòng)態(tài)申請(qǐng)內(nèi)存,但停止診斷后,沒有及時(shí)釋放內(nèi)存,導(dǎo)致反復(fù)進(jìn)行組播丟包診斷功能,內(nèi)存泄露,工作一段時(shí)間后,系統(tǒng)異常。
在下面的代碼示例中,函數(shù)X_WEB_MatchUser InfoByMD5,acCookie的長(zhǎng)度為 512,acPWD 的長(zhǎng)度為128字節(jié),在做cookie解析時(shí),沒有對(duì)uiWordLen進(jìn)行判斷,構(gòu)造報(bào)文使cookie的長(zhǎng)度為512字節(jié),會(huì)導(dǎo)致acPWD內(nèi)存溢出。
第一,關(guān)注復(fù)雜程度較高的重點(diǎn)模塊,有針對(duì)性地進(jìn)行滲透測(cè)試。
第二,注意內(nèi)存分配的代碼,查看是否存在內(nèi)存管理安全:包括引用未初始化的內(nèi)存、訪問已經(jīng)釋放的內(nèi)存、重復(fù)釋放內(nèi)存、釋放非動(dòng)態(tài)申請(qǐng)的內(nèi)存、動(dòng)態(tài)申請(qǐng)內(nèi)存未釋放、對(duì)指定申請(qǐng)內(nèi)存大小的整數(shù)值未進(jìn)行合法性校驗(yàn)、拷貝內(nèi)存長(zhǎng)度超過目的內(nèi)存分配長(zhǎng)度等。[5]
第三,查出疑似問題后,查看輸入來源是否可以外部控制,按照代碼實(shí)現(xiàn)功能構(gòu)造黑盒測(cè)試方法,達(dá)到攻擊目的。
第四,也可以使用大范圍進(jìn)行搜索排查,比如搜索malloc等動(dòng)態(tài)內(nèi)存分配函數(shù)以及內(nèi)存拷貝的代碼(memcpy關(guān)鍵字),一個(gè)個(gè)排查是否存在內(nèi)存管理安全問題。
函數(shù)strncpy(char*dest,const char*src,int n),把src所指向的字符串中以src地址開始的前n個(gè)字節(jié)復(fù)制到dest所指的數(shù)組中,并返回dest。如果沒有對(duì)dest與src長(zhǎng)度進(jìn)行限制,導(dǎo)致src字符串長(zhǎng)度大于dest字符串長(zhǎng)度時(shí),會(huì)出現(xiàn)棧溢出情況,系統(tǒng)異常。比如下面的示例:入?yún)nsurl是一個(gè)512字節(jié)長(zhǎng)度的char數(shù)組(X_CHAR8 dnsurl[512]={0};),進(jìn)行字符串拷貝的時(shí)候,沒有判斷長(zhǎng)度是否小于目的字符串(目的char數(shù)組長(zhǎng)度為128字節(jié)),當(dāng)構(gòu)造特殊的 DNS 報(bào)文,第一個(gè)“:”到第一個(gè)“/”長(zhǎng)度在131~512字節(jié)之間時(shí),會(huì)導(dǎo)致棧溢出,系統(tǒng)異常。
第一,關(guān)注字符串拷貝的代碼(strncpy關(guān)鍵字),特別注意第三個(gè)參數(shù)為變量的地方,考慮第三個(gè)參數(shù)是否可能超過目的緩沖區(qū)大小。對(duì)于strcpy函數(shù),關(guān)注src字符串長(zhǎng)度是否大于dest字符串長(zhǎng)度。
第二,查出疑似問題后,查看輸入來源是否可以外部控制,按照代碼實(shí)現(xiàn)功能構(gòu)造黑盒測(cè)試方法,達(dá)到攻擊目的。
snprintf()函數(shù)第三個(gè)參數(shù)直接引入外部輸入,沒有對(duì)外部輸入?yún)?shù)進(jìn)行格式化處理,導(dǎo)致格式化字符串攻擊。
比如下面的示例:
X_UAM_BuildGetDownloadStatusResponseMsg函數(shù)中X_OSS_Snprintf函數(shù)第三個(gè)參數(shù)直接引入外部輸入,沒有對(duì)外部輸入?yún)?shù)進(jìn)行格式化處理,pcTemp來源于外部AP的回應(yīng)消息,遇到特殊的AP回應(yīng)消息比如(%s%s%s%s%s%s%s%s%s%s%s%s%s),可以造成格式化字符串攻擊導(dǎo)致棧擊穿。
第一,關(guān)注格式化處理函數(shù)的代碼(snprintf),特別注意第三個(gè)參數(shù)直接為外部輸入?yún)?shù)的地方,查看是否存在未格式化處理直接引用的情況。
第二,查出疑似問題后,查看輸入來源是否可以外部控制,按照代碼實(shí)現(xiàn)功能構(gòu)造黑盒測(cè)試方法,達(dá)到攻擊目的。
strcpy()、sprintf()、strcat()這些函數(shù)存在安全隱患,[6]由于src字符串可能小于dst字符串,程序員在寫作的時(shí)候很容易遺漏長(zhǎng)度的判斷,易被攻擊造成系統(tǒng)安全問題,在使用時(shí)需謹(jǐn)慎。另外,可以通過使用其對(duì)應(yīng)的安全版函數(shù)來替換:strncpy()、snprintf()、strncat(),避免出現(xiàn)安全問題。
參考文獻(xiàn):
[1]王曉聰,張冉,黃赪東.滲透測(cè)試技術(shù)淺析[J].計(jì)算機(jī)科學(xué),2012(S1):43-45.
[2]王雷,陳歸,金茂忠.基于約束分析與模型檢測(cè)的代碼安全漏洞檢測(cè)方法研究[J].計(jì)算機(jī)研究與發(fā)展,2011(9):14-17.
[3]謝志鋒.基于木馬的網(wǎng)絡(luò)滲透測(cè)試的研究[D].太原:太原理工大學(xué),2013.
[4]梁業(yè)裕,徐坦,寧建創(chuàng),楊明.代碼審計(jì)工作在整個(gè)安全保障體系中的重要價(jià)值[J].計(jì)算機(jī)安全,2013(12):27-30.
[5]李天博.基于B/S架構(gòu)的網(wǎng)絡(luò)滲透技術(shù)研究與開發(fā)[D].北京:北京郵電大學(xué),2014.
[6]李俊.白盒代碼安全審計(jì)方法淺析[J].牡丹江大學(xué)學(xué)報(bào),2014(10):21-24.