李春秋 何軍 朱靜怡
摘要:隨著云計(jì)算、大數(shù)據(jù)和人工智能的飛速發(fā)展,安全問(wèn)題也日益突出?!皼](méi)有網(wǎng)絡(luò)安全就沒(méi)有國(guó)家安全”,緩沖區(qū)溢出作為網(wǎng)絡(luò)安全漏洞中的高發(fā)地帶,在操作系統(tǒng)和眾多的應(yīng)用軟件中廣泛存在,且很難被主動(dòng)發(fā)現(xiàn)。緩沖區(qū)溢出的學(xué)習(xí)成本較低,造成的破壞力極大。該實(shí)驗(yàn)構(gòu)建兩個(gè)虛擬網(wǎng)絡(luò),模擬搭建含有緩沖區(qū)溢出漏洞的Linux服務(wù)器,使用GDB逆向分析技術(shù),探測(cè)并計(jì)算緩沖區(qū)buffer的長(zhǎng)度,計(jì)算出ESP,手工編寫(xiě)程序,利用緩沖區(qū)溢出漏洞發(fā)起進(jìn)攻的演示。闡述緩沖區(qū)溢出漏洞造成的危害以及如何檢測(cè)和防御緩沖區(qū)溢出漏洞,以降低緩沖區(qū)溢出帶來(lái)的安全風(fēng)險(xiǎn)。
關(guān)鍵詞:逆向分析;緩沖區(qū);漏洞;安全;溢出
中圖分類號(hào):TP311 ? ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2020)31-0240-04
Abstract: With the rapid development of cloud computing, big data and artificial intelligence, security issues are increasingly prominent. "Without network security, there is no national security". As a high incidence area of network security vulnerabilities, buffer overflow exists widely in the operating system and many application software, and it is difficult to be found actively. The learning cost of buffer overflow is low, which causes great damage. In this experiment, we build two virtual networks, simulate the Linux server with buffer overflow vulnerability, use GDB reverse analysis technology to detect and calculate the length of buffer, calculate ESP, write programs manually, and use buffer overflow vulnerability to launch attack demonstration. This paper expounds the harm caused by buffer overflow and how to detect and defend buffer overflow to reduce the security risk brought by buffer overflow.
Key words: reverse analysis;buffer;vulnerability;security;overflow
當(dāng)我們?cè)谟?jì)算機(jī)上執(zhí)行程序時(shí),操作系統(tǒng)會(huì)在內(nèi)存區(qū)域分配一段連續(xù)的區(qū)域用來(lái)存放需要的數(shù)據(jù),然后將計(jì)算機(jī)的外存?zhèn)鬏數(shù)絻?nèi)存中用于等待指令操作,這一段連續(xù)的區(qū)域就是緩沖區(qū)區(qū)域。緩沖區(qū)的區(qū)域由程序本身定義,所以當(dāng)攻擊者探測(cè)出緩沖區(qū)的長(zhǎng)度,并將大于緩沖區(qū)長(zhǎng)度的數(shù)據(jù)惡意寫(xiě)入,就會(huì)觸發(fā)緩沖區(qū)溢出。對(duì)于存在這種問(wèn)題的程序,就有緩沖區(qū)溢出漏洞,攻擊者往往會(huì)根據(jù)緩沖區(qū)溢出漏洞,基于探測(cè)或者逆向分析技術(shù),精準(zhǔn)找出RET的ESP,然后構(gòu)造shellcode,對(duì)目標(biāo)機(jī)器發(fā)起攻擊。攻擊者使用未授權(quán)的管理員權(quán)限,可以對(duì)目標(biāo)機(jī)器執(zhí)行任何操作,如開(kāi)后門(mén)、掛木馬、暴露數(shù)據(jù)庫(kù)、安裝挖礦程序等,更大的威脅是可以對(duì)目標(biāo)機(jī)器的內(nèi)網(wǎng)進(jìn)行滲透,對(duì)整個(gè)單位的數(shù)據(jù)和應(yīng)用程序安全形成巨大的隱患。
緩沖區(qū)溢出已經(jīng)成為十分嚴(yán)重的安全問(wèn)題,產(chǎn)生的原因是馮·諾伊曼結(jié)構(gòu)的計(jì)算機(jī)內(nèi)存中并未對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行校驗(yàn),無(wú)法區(qū)分內(nèi)存中的數(shù)據(jù)和代碼,且現(xiàn)階段去更換計(jì)算機(jī)結(jié)構(gòu)的概率幾乎為零,所以只能從現(xiàn)有的技術(shù)中去發(fā)掘檢測(cè)和防御緩沖區(qū)溢出漏洞的方法,而DEP(數(shù)據(jù)執(zhí)行保護(hù))就能從區(qū)分?jǐn)?shù)據(jù)和代碼這一功能上進(jìn)行防御。
緩沖區(qū)溢出常見(jiàn)類型一般分為棧溢出和堆溢出[1]。堆溢出發(fā)生的主要原因是堆在接收到內(nèi)存分配指令后,沒(méi)有對(duì)寫(xiě)入內(nèi)存中的數(shù)據(jù)進(jìn)行檢查;棧溢出產(chǎn)生的主要原因是C語(yǔ)言的標(biāo)準(zhǔn)庫(kù)中沒(méi)有對(duì)復(fù)制到緩沖區(qū)中數(shù)據(jù)的長(zhǎng)度進(jìn)行檢查[2],所以當(dāng)復(fù)制到緩沖區(qū)中數(shù)據(jù)的長(zhǎng)度大于原本設(shè)定的緩沖區(qū)長(zhǎng)度,就會(huì)觸發(fā)溢出。
1理論分析
1.1緩沖區(qū)溢出
能夠查到記載的緩沖區(qū)溢出漏洞的惡意利用是在1988年,這是Morris蠕蟲(chóng)在互聯(lián)網(wǎng)上少量的幾個(gè)漏洞其中之一,含有漏洞的是一個(gè)叫finger的服務(wù)程序,源自Unix操作系統(tǒng),利用的是棧溢出漏洞。2017年,一個(gè)名為“永恒之藍(lán)”的勒索病毒造成的波及范圍極大,這款病毒同樣也是利用了緩沖區(qū)溢出漏洞[3],較近的CVE2018-6789漏洞是利用Linux上的郵件傳輸代理服務(wù)造成的,該漏洞是由于base64d()函數(shù)中b64decode的緩沖區(qū)長(zhǎng)度沒(méi)有有效檢測(cè),當(dāng)惡意觸發(fā)計(jì)算錯(cuò)誤并無(wú)法解析時(shí),base64字符串則可能會(huì)覆蓋堆內(nèi)存,進(jìn)而覆蓋關(guān)鍵數(shù)據(jù),base64解碼是一種廣泛使用的函數(shù),并且字節(jié)是開(kāi)發(fā)者自行設(shè)計(jì),因此增加了易用性,可以廣泛用于使用遠(yuǎn)程代碼執(zhí)行來(lái)控制目標(biāo)機(jī)器。
2018年OWASP(開(kāi)放式Web應(yīng)用程序安全項(xiàng)目)的Web應(yīng)用十大最嚴(yán)重的安全風(fēng)險(xiǎn)中,使用含有已知漏洞的組件C(Using Components with KnownVulnerabilities)排名第9[5]。2010-2011年,CWE/SANS組織統(tǒng)計(jì)的數(shù)據(jù)中顯示,緩沖區(qū)溢出漏洞在最危險(xiǎn)的程序設(shè)計(jì)錯(cuò)誤中排第3[6],并且,CWE公布自身的軟件脆弱性枚舉庫(kù)中,涉及緩沖區(qū)溢出漏洞的有21條[7]。2018年12月,CNNVD(國(guó)家信息安全漏洞庫(kù))報(bào)告公布新增安全漏洞1275個(gè),其中緩沖區(qū)漏洞就有196個(gè),占比約為15.37%。
1.2 windows緩沖區(qū)溢出
首先,需要了解windows環(huán)境中函數(shù)的執(zhí)行原理。當(dāng)系統(tǒng)需要去調(diào)用某個(gè)函數(shù)的時(shí)候,計(jì)算機(jī)需要按下列步驟執(zhí)行:
(1)首先架設(shè)有4個(gè)參數(shù),名稱分別為parameter1,parameter2、parameter3和parameter4,按照從右到左的順序依次入棧;
(2)EIP(指令寄存器)的數(shù)據(jù)作為RET入棧;
(3)EBP(基址寄存器)的數(shù)據(jù)入棧;
(4)將當(dāng)前ESP的數(shù)據(jù)賦值給EBP;
(5)假設(shè)有兩個(gè)變量var1,var2,其數(shù)據(jù)類型為int,為函數(shù)的變量開(kāi)辟內(nèi)存空間時(shí),var1的變量地址為[EBP-4],var2的變量地址為[EBP-8]。
當(dāng)函數(shù)執(zhí)行周期結(jié)束,根據(jù)先進(jìn)后出的棧規(guī)則,出棧順序?yàn)椋簐ar2,var1,EBP的數(shù)據(jù),EIP的數(shù)據(jù),parameter1,parameter2、parameter3和parameter4。
若定義一個(gè)數(shù)組buffer長(zhǎng)度為8,那么buffer本身8個(gè)元素在內(nèi)存中的地址的從高到低分別是[EBP-4],[EBP-8],…,[EBP-32]。當(dāng)使用函數(shù)strcpy()給buffer數(shù)組賦值時(shí),入棧的順序就是從低地址向高地址,若此時(shí)入棧的字符串長(zhǎng)度大于8個(gè)字符,多出部分的字符串就會(huì)去覆蓋原有的EBP和RET,從而觸發(fā)緩沖區(qū)溢出。
1.3 linux緩沖區(qū)溢出
程序通常都是由代碼和數(shù)據(jù)構(gòu)成的,默認(rèn)情況下代碼和數(shù)據(jù)都是靜態(tài)。需要運(yùn)行程序時(shí),操作系統(tǒng)會(huì)首先創(chuàng)建所需進(jìn)程,接著會(huì)在內(nèi)存中為進(jìn)程開(kāi)辟虛擬地址空間,為代碼段和數(shù)據(jù)段建立映射關(guān)系。程序想要正式運(yùn)行,僅有代碼段和數(shù)據(jù)段是無(wú)法完成的,還需要很多動(dòng)態(tài)環(huán)境,堆和棧就是最重要的環(huán)境。Linux的進(jìn)程地址空間布局見(jiàn)圖1。
首先會(huì)由execve(2)為進(jìn)程的代碼段和數(shù)據(jù)段建立映射關(guān)系,接下來(lái)操作系統(tǒng)的缺頁(yè)異常處理會(huì)將代碼段和數(shù)據(jù)段讀入內(nèi)存,同時(shí)execve(2)會(huì)清零bss段,這也就合理解釋了當(dāng)未賦值的全局變量及靜態(tài)變量默認(rèn)初值為零的原因。進(jìn)程空間的最高位地址用于存放命令參數(shù)和環(huán)境變量等,堆和棧就在中間位置,作為進(jìn)程動(dòng)態(tài)運(yùn)行環(huán)境,棧向下伸展,而堆向上伸展。堆棧中存放了C語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的函數(shù)對(duì)應(yīng)的堆棧幀,當(dāng)需要調(diào)用函數(shù)時(shí),被調(diào)用函數(shù)的堆棧幀被壓入,當(dāng)需要返回時(shí),被壓入的堆棧幀從堆棧中彈出。一般堆棧幀的結(jié)構(gòu)如圖2所示。由高往低,依次是函數(shù)的實(shí)參、函數(shù)的返回地址、前一個(gè)堆棧幀的指針和函數(shù)局部變量使用的空間。一般堆棧幀有兩個(gè)指針,一個(gè)是堆棧幀指針,指向的位置是固定的,一個(gè)是棧頂指針,在函數(shù)運(yùn)行過(guò)程中指向的位置是可變的。所以,在函數(shù)訪問(wèn)實(shí)參和局部變量時(shí),都是以堆棧指針為基礎(chǔ)地址,加上偏移量確定。
函數(shù)調(diào)用的過(guò)程如下:
(1)調(diào)用函數(shù)時(shí),堆棧從由高往低依次是被調(diào)用函數(shù)的實(shí)參、EIP原始值、EBP原始值、被調(diào)用函數(shù)的局部變量。
(2)由于被調(diào)用函數(shù)的局部變量的地址是已知的,EIP原始的位置就和局部變量地址位置較近。
(3)被調(diào)用函數(shù)需要返回時(shí),由返回地址報(bào)對(duì)戰(zhàn)中的EIP原始值重新賦予EIP。所以,只要找到堆棧中的EIP原始值的位置,修改為Shellcode的地址就能觸發(fā)攻擊。
1.4軟件逆向工程
軟件逆向工程(Software Reverse Engineering),又被稱軟件反向工程。泛指從已設(shè)計(jì)成型且可運(yùn)行的程序系統(tǒng)研究開(kāi)始,綜合運(yùn)用密碼學(xué)加密解密、匯編和反匯編、操作系統(tǒng)分析和程序邏輯分析等多種計(jì)算機(jī)技術(shù),對(duì)程序的編程語(yǔ)言、代碼結(jié)構(gòu)、流程算法等方面進(jìn)行逆向分析,從而推導(dǎo)出程序的源代碼、設(shè)計(jì)思想、流程算法、過(guò)程處理等相關(guān)內(nèi)容。這個(gè)綜合分析的過(guò)程一般被統(tǒng)稱為軟件逆向工程技術(shù)。在實(shí)際操作中,推導(dǎo)出源代碼和算法的概率極小,軟件逆向工程的目的是用于研究和學(xué)習(xí)。
2實(shí)驗(yàn)設(shè)計(jì)
本次實(shí)驗(yàn)設(shè)計(jì)使用strcpy()函數(shù)作為產(chǎn)生緩沖區(qū)溢出的不安全因素。strcpy()的API函數(shù)實(shí)現(xiàn)如下:
char* strcpy(char *d, const char *s)
{
char *r=d;
while((*d++=*s++));
return r;
}
可以看出,strcpy這個(gè)函數(shù)通過(guò)while循環(huán)將所有字符依次賦值給了指針d,再將字符指針r指向d的開(kāi)始位置(d[0]的地址),并返回r指針的地址。
舉例說(shuō)明,假設(shè)A值8字符、B值16字符。若使用strcpy()函數(shù)將B賦值給A,由于B的字符串長(zhǎng)度大于A的字符串長(zhǎng)度,就會(huì)產(chǎn)生溢出。若當(dāng)溢出的值剛好覆蓋到ret的返回地址時(shí),再將需要的地址準(zhǔn)確地覆蓋到ret的esp處,就會(huì)執(zhí)行溢出的值。通過(guò)構(gòu)造shellcode,從而獲取計(jì)算機(jī)的控制權(quán)限。
我們將虛擬機(jī)VM1作為服務(wù)器,虛擬機(jī)VM2作為攻擊機(jī)。VM1操作系統(tǒng)為CentOS Linux 5.5,僅安裝工具GCC、GDB和Nginx。VM2操作系統(tǒng)為CentOS Linux 5.5,安裝工具GCC、GDB和Python3/Python2.
2.1網(wǎng)絡(luò)環(huán)境設(shè)計(jì)
為了實(shí)現(xiàn)不同網(wǎng)絡(luò)的拓?fù)湓O(shè)計(jì),我們將VM1的網(wǎng)絡(luò)連接模式設(shè)置為“僅主機(jī)模式”,通過(guò)共享物理網(wǎng)卡信息,連接網(wǎng)絡(luò)。將VM2的網(wǎng)絡(luò)連接模式設(shè)置為“NAT模式”, 將VM2的網(wǎng)卡連接到虛擬交換機(jī)Vmnet8,然后將連接Vmnet8的虛擬NAT設(shè)備與虛擬DHCP服務(wù)器一起連接在物理網(wǎng)卡上,實(shí)現(xiàn)VM2的網(wǎng)絡(luò)連接。這樣就可以虛擬出兩個(gè)不同的網(wǎng)絡(luò),擺脫了局域網(wǎng)實(shí)驗(yàn)的困境。
使用Socket編程中的sockaddr_in結(jié)構(gòu)體完成漏洞程序端口的設(shè)計(jì),首先給sockaddr_in變量賦值,因?yàn)轭愋筒煌?,需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,然后給sockaddr做參數(shù)。sockaddr_in的作用是定義socket和賦值,sockaddr的作用是函數(shù)參數(shù),最后使用accept綁定端口。
使用strcpy()函數(shù)的漏洞缺陷,設(shè)計(jì)buffer長(zhǎng)度為1000,通過(guò)傳參的形式,觸發(fā)緩沖區(qū)溢出漏洞,漏洞程序設(shè)計(jì)如圖3所示。
將端口綁定程序和緩沖區(qū)溢出漏洞程序整合為vuln.c,使用GCC編譯該文件后,執(zhí)行并設(shè)置綁定任意端口,但不得與現(xiàn)有端口重合。同時(shí)將編譯后的文件vuln放置Nginx目錄,因?yàn)槌R?guī)情況下,做逆向分析都會(huì)有原始的安裝程序,此編譯后的程序用于逆向分析,所以必須提供。
2.2 逆向分析探測(cè)設(shè)計(jì)
使用python編寫(xiě)ARP掃描工具,使得VM2可以對(duì)VM1進(jìn)行端口探測(cè),找出Nginx的目錄,下載編譯后的程序,同時(shí)根據(jù)網(wǎng)絡(luò)基礎(chǔ)知識(shí)和社會(huì)工程學(xué)查找含有緩沖區(qū)溢出漏洞的服務(wù)端口。通過(guò)VM2的GDB調(diào)試工具對(duì)可執(zhí)行文件vuln進(jìn)行逆向分析調(diào)試。
#gdbvlun
(gdb) run 666
此時(shí)系統(tǒng)的666端口已經(jīng)自動(dòng)開(kāi)啟監(jiān)聽(tīng)模式,嘗試使用netcat工具進(jìn)行連接。
nc 127.0.0.1 666
這個(gè)探測(cè)過(guò)程可能會(huì)出現(xiàn)中斷信息,可以重新運(yùn)行GDB,開(kāi)啟指定端口。為 "My name is:.." 命令行提供超過(guò)1000個(gè)字節(jié)長(zhǎng)的輸入,發(fā)現(xiàn)已經(jīng)溢出。這個(gè)探測(cè)過(guò)程相對(duì)簡(jiǎn)單,真實(shí)情況下探測(cè)溢出長(zhǎng)度也不需要很多時(shí)間。
根據(jù)GDB調(diào)試得到的緩沖區(qū)長(zhǎng)度信息,構(gòu)造拒絕服務(wù)攻擊代碼dos.c。
執(zhí)行dos腳本,使用GDB工具運(yùn)行666端口,發(fā)現(xiàn)已經(jīng)溢出,找到返回地址。
#./dos 127.0.0.1 666
#gdb vuln
(gdb) run 666
找到返回地址,在本步驟中,盡量選擇中間靠上的位置,使跳轉(zhuǎn)到該地址后,會(huì)順延到shellcode位置。緩沖區(qū)的構(gòu)造如圖所示:
|NOPS|NOPS|NOPS|……|shellcode|RET|RET|……|RET|
構(gòu)造攻擊代碼exploit.c,步驟如下:
(1)使用匯編編寫(xiě)提取或者使用kalilinux生成一個(gè)shellcode代碼;
(2)定義一個(gè)大于1000字節(jié)的緩沖區(qū),比如1088字節(jié),要保證能夠覆蓋EIP;
(3)因?yàn)镹OP填充不影響程序整體執(zhí)行,所以采取NOP填充,執(zhí)行代碼memset(buffer, 0x90, 1088);
(4)將構(gòu)造的shellcode復(fù)制到緩沖區(qū)中,執(zhí)行代碼memcpy(buffer+1001-sizeof(shellcode), shellcode, sizeof(shellcode));
(5)構(gòu)造一個(gè)buffer[1000] = 0x90,因?yàn)镹OP的十六進(jìn)制值為0x90;
(6)將返回地址復(fù)制到到緩沖區(qū)的結(jié)尾,其中RET就是返回地址,前面的代碼中用#define定義過(guò)的。
for(i = 1022; i< 1083; i+=4)
{((int *)&buffer) = RET;}
由于漏洞程序vuln的緩沖區(qū)是1000字節(jié),程序從998開(kāi)始復(fù)制RET,直到1083個(gè)字節(jié)的位置為止。
(7)在緩沖區(qū)的最后以'\0'結(jié)束:buffer[1087] = 0x0;
至此,構(gòu)造的緩沖區(qū)代碼完成。最后使用exploit攻擊服務(wù)器VM1。由于本次生成的shellcode是執(zhí)行cat /etc/passwd ,所以在VM1上顯示結(jié)果如圖2.可以更換shellcode,采用正向獲取或者反向彈射的方式,達(dá)到獲取ROOT權(quán)限的目的。
3緩沖區(qū)檢測(cè)與防御
面對(duì)緩沖區(qū)溢出漏洞的頻發(fā),檢測(cè)和防御成為研究熱點(diǎn),很多世界知名廠商也推出了諸多措施來(lái)預(yù)防該類漏洞。軟件層面,例如Microsoft公司在軟件開(kāi)發(fā)工具中增加了用于檢測(cè)緩沖區(qū)溢出的編譯選項(xiàng),用于開(kāi)發(fā)階段測(cè)試是否存在緩沖區(qū)溢出漏洞;在Windows操作系統(tǒng)中使用了結(jié)構(gòu)化異常處理覆蓋的保護(hù)機(jī)制,通過(guò)監(jiān)測(cè)判斷是否惡意修改數(shù)據(jù)結(jié)構(gòu),進(jìn)而進(jìn)行異常處理,從而阻止惡意修改,增強(qiáng)系統(tǒng)安全性。硬件層面以AMD公司的64位CPU為例,引入了NX機(jī)制,在內(nèi)存空間中將數(shù)據(jù)區(qū)和代碼區(qū)加以區(qū)分,當(dāng)攻擊者利用溢出漏洞執(zhí)行時(shí),會(huì)進(jìn)入數(shù)據(jù)區(qū),進(jìn)行異常處理并終止程序運(yùn)行。
產(chǎn)生緩沖區(qū)溢出漏洞的人為因素,是由軟件開(kāi)發(fā)項(xiàng)目管理不規(guī)范和開(kāi)發(fā)人員安全意識(shí)薄弱引起的。所以想要從根本上防御緩沖區(qū)溢出漏洞,就是需要采用工程的概念,將開(kāi)發(fā)安全的需求加入項(xiàng)目規(guī)劃中,和軟件業(yè)務(wù)功能同步進(jìn)行,并且在信息化建設(shè)活動(dòng)中有關(guān)加強(qiáng)系統(tǒng)安全性活動(dòng)的集合?!吨腥A人民共和國(guó)網(wǎng)絡(luò)安全法》明確指出“建設(shè)關(guān)鍵信息基礎(chǔ)設(shè)施應(yīng)當(dāng)確保其具有支持業(yè)務(wù)穩(wěn)定、持續(xù)運(yùn)行的性能,并保證安全技術(shù)措施同步規(guī)劃、同步建設(shè)、同步使用?!碑?dāng)管理層面的防御問(wèn)題解決后,需要解決技術(shù)層面的防御,因?yàn)榘踩且粋€(gè)相對(duì)概念,所以使用一種技術(shù)防御或者多種技術(shù)防御,都能在一定程度上降低緩沖區(qū)溢出漏洞出現(xiàn)的概率,從而達(dá)到更安全的目的。目前主要的緩沖區(qū)溢出防御措施如下。
3.1 StackGuard 保護(hù)技術(shù)
最早提出StackGuard 防護(hù)理論的是《StackGuard: Automatic Adaptive Detection and Prevention of Buffer-Overflow Attacks》,發(fā)表在1998年的7th USENIX Security Conference上,作者由 Crispan Cowan[4]等 10 人聯(lián)合署名。該文介紹了GCC編譯器上檢測(cè)棧溢出的研究成果,并且首次提出在棧返回地址前加入canary技術(shù),用于防護(hù)檢測(cè),這就是StackGuard技術(shù)的前身。StackGuard技術(shù)檢測(cè)原理是當(dāng)攻擊者使用溢出漏洞去覆蓋函數(shù)返回地址時(shí),必然會(huì)覆蓋其上方地址的空間,這時(shí)canary必然發(fā)生改變,若檢測(cè)到canary發(fā)生改變,則說(shuō)明已經(jīng)發(fā)生了緩沖區(qū)溢出攻擊。
3.2 DEP 保護(hù)技術(shù)
由于產(chǎn)生緩沖區(qū)溢出的根本原因是由于馮·諾依曼結(jié)構(gòu)的計(jì)算機(jī)內(nèi)存中并未對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行校驗(yàn),無(wú)法區(qū)分內(nèi)存中的數(shù)據(jù)和代碼,而DEP(數(shù)據(jù)執(zhí)行保護(hù))就能從區(qū)分?jǐn)?shù)據(jù)和代碼這一功能上進(jìn)行防御。DEP從攻擊者的角度出發(fā),研究攻擊中的共同特征。通過(guò)研究發(fā)現(xiàn),當(dāng)發(fā)動(dòng)緩沖區(qū)溢出時(shí),系統(tǒng)的指令會(huì)跳轉(zhuǎn)到攻擊者構(gòu)造的shellcode的地址開(kāi)始執(zhí)行,若能夠中斷執(zhí)行,就可以保護(hù)程序不受攻擊。所以,DEP標(biāo)記數(shù)據(jù)所在的內(nèi)存頁(yè)為不可執(zhí)行狀態(tài),這樣就有效區(qū)分了數(shù)據(jù)和代碼混淆的問(wèn)題。當(dāng)程序被攻擊者引導(dǎo)進(jìn)入shellcode的時(shí)候,由于數(shù)據(jù)區(qū)域被標(biāo)記為不可執(zhí)行代碼,CPU執(zhí)行到這一段指令時(shí),就會(huì)出現(xiàn)異常錯(cuò)誤,從而中斷執(zhí)行。
DEP主要解決的問(wèn)題是在數(shù)據(jù)區(qū)去執(zhí)行代碼。目前分為硬件DEP和軟件DEP。硬件DEP是目前DEP技術(shù)的核心,由CPU提供硬件支持,操作系統(tǒng)可以通過(guò)對(duì)內(nèi)存頁(yè)的NX/XD屬性標(biāo)記進(jìn)行設(shè)置,將內(nèi)存頁(yè)標(biāo)識(shí)為不可執(zhí)行。而軟件DEP,就是微軟引入了S.E.H 的校驗(yàn)機(jī)制 SafeSEH,主要針對(duì)SHE攻擊,沒(méi)有CPU硬件支持。DEP是一種針對(duì)馮·諾依曼結(jié)構(gòu)計(jì)算機(jī)核心問(wèn)題的解決方法,通過(guò)嚴(yán)格區(qū)分?jǐn)?shù)據(jù)和代碼區(qū)域,限制惡意代碼在函數(shù)堆棧上運(yùn)行,能夠保障緩沖區(qū)的安全。但是由于硬件和操作系統(tǒng)的多樣性,為了更好的兼容,所以DEP保護(hù)是可以設(shè)置的,一旦關(guān)閉了DEP,計(jì)算機(jī)就處在了危險(xiǎn)之中。
3.3 ASLR 保護(hù)技術(shù)
由于所有的緩沖區(qū)溢出漏洞的利用都離不開(kāi)返回地址,因?yàn)橹挥姓业綔?zhǔn)確的地址,才能引導(dǎo)至shellcaode的開(kāi)始地址執(zhí)行,所以為了解決其他緩沖區(qū)溢出保護(hù)措施的問(wèn)題,Microsoft公司提出了ASLR(地址空間配置隨機(jī)化)技術(shù)。ASLR使用隨機(jī)的方式將傳統(tǒng)不變的基址地址打亂,使得跳轉(zhuǎn)地址不再是固定位置,從而干擾攻擊者定位Shellcode。地址隨機(jī)化是ASLR的核心,當(dāng)ASLR硬件支持開(kāi)啟后,攻擊者所需要的返回地址就會(huì)隨時(shí)發(fā)生變換,增大了探測(cè)的困難,也就很難被利用。早在VisualStudio2005 中,Microsoft公司已經(jīng)在編譯程序時(shí)加入了/dynamicbase 鏈接屬性的設(shè)置。若開(kāi)發(fā)者在編譯程序時(shí)添加了此選項(xiàng),編譯后的程序就支持ASLR技術(shù)。目前ASLR技術(shù)主要分為映像隨機(jī)化、堆棧隨機(jī)化、PEB與TEB隨機(jī)化,較為常見(jiàn)的是映像隨機(jī)化和堆棧隨機(jī)化。映像隨機(jī)化是在PE文件映射到內(nèi)存時(shí),對(duì)其加載的虛擬地址進(jìn)行隨機(jī)化分配處理,在系統(tǒng)啟動(dòng)時(shí)才能確定該地址,當(dāng)系統(tǒng)重啟后,該地址會(huì)發(fā)生變化。堆棧隨機(jī)化是將原來(lái)固定的棧堆指針基址進(jìn)行隨機(jī)化處理,當(dāng)程序執(zhí)行時(shí)才能確定該地址,所以一個(gè)程序每次運(yùn)行的時(shí)候,棧堆指針基址都是不相同的。ASRL技術(shù)的出現(xiàn),由于程序每次運(yùn)行的地址是隨機(jī)的,只有在程序運(yùn)行的一次操作中探測(cè)到所有的信息才能攻擊成功,大大增加了攻擊者的難度。有研究數(shù)據(jù)表明,ASLR技術(shù)已經(jīng)成功減少了緩沖區(qū)溢出的攻擊次數(shù)。
4結(jié)語(yǔ)
本實(shí)驗(yàn)?zāi)M了無(wú)任何攻擊工具的情況下,使用GDB的反編譯來(lái)探測(cè)緩沖區(qū)溢出的長(zhǎng)度及返回地址,通過(guò)構(gòu)造Shellcode及攻擊代碼,最終實(shí)現(xiàn)攻擊成功。在現(xiàn)實(shí)中,緩沖區(qū)溢出一直是信息安全領(lǐng)域的熱點(diǎn)。由于其伴隨C語(yǔ)言而來(lái)的屬性,成為不可避免的問(wèn)題,因?yàn)镃語(yǔ)言天生缺少自動(dòng)控制邊界的機(jī)制,并且不能通過(guò)指針控制數(shù)據(jù)元素的個(gè)數(shù)。
當(dāng)《中華人民共和國(guó)網(wǎng)絡(luò)安全法》發(fā)布時(shí),網(wǎng)絡(luò)安全就已經(jīng)上升到國(guó)家戰(zhàn)略的高度。等級(jí)保護(hù)制度、護(hù)網(wǎng)行動(dòng)等,均是管理層面對(duì)網(wǎng)絡(luò)安全的重視。對(duì)于技術(shù)層面,我們需要進(jìn)一步規(guī)范軟件系統(tǒng)的開(kāi)發(fā)規(guī)范,將安全工程和系統(tǒng)工程同步開(kāi)展,針對(duì)有可能出現(xiàn)的漏洞,加強(qiáng)軟件投產(chǎn)前的測(cè)試工作,進(jìn)一步提高安全性。
參考文獻(xiàn):
[1] 唐成華,彭燦,劉猛,等.一種抗地址淹沒(méi)的緩沖區(qū)棧溢出算法[J].計(jì)算機(jī)應(yīng)用研究,2017,34(12):3758-3761.
[2] 邵必林,燕佳芬,邊根慶.緩沖區(qū)溢出漏洞綜合檢測(cè)方法研究[J].微電子學(xué)與計(jì)算機(jī),2015,32(7):99-102.
[3] 李安安,楊德芹,王學(xué)健.軟件系統(tǒng)緩沖區(qū)溢出漏洞防范研究[J].高技術(shù)通訊,2017,27(8):718-726.
[4]Cowan C,Pu C,Maier D,et al.StackGuard:Automatic Adaptive Detection and Prevention ofBuffer-Overflow Attacks[C].Usenix Security,1998,98:63-78.
[5] 邵思豪,高慶,馬森,等.緩沖區(qū)溢出漏洞分析技術(shù)研究進(jìn)展[J].軟件學(xué)報(bào),2018,29(5):1179-1198.
[6]傅建明.計(jì)算機(jī)病毒分析與對(duì)抗(第二版)[M].武漢:武漢大學(xué)出版社2009.
[7] 樂(lè)德廣,章亮,鄭力新,等.面向 RTF 文件的 Word 漏洞分析[J].華僑大學(xué)學(xué)報(bào)(自然科學(xué)版),2015,36(1):17-22.
【通聯(lián)編輯:代影】