欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種程序內(nèi)存布局信息泄露行為的檢測方法與流程

文檔序號:11199828閱讀:414來源:國知局
本發(fā)明涉及一種程序運(yùn)行過程中內(nèi)存布局信息泄露行為的識別和檢測方法,具體涉及一種基于程序的輸出操作來識別和檢測內(nèi)存信息泄露行為的方法。本發(fā)明屬于計(jì)算機(jī)安全保護(hù)領(lǐng)域。
背景技術(shù)
::代碼復(fù)用攻擊不需要注入攻擊代碼,因而具有較強(qiáng)的隱蔽性和危害性。程序的內(nèi)存布局信息是發(fā)動代碼復(fù)用攻擊的基礎(chǔ)信息之一。內(nèi)存布局信息泄露有助于攻擊者對系統(tǒng)的完成攻擊,因此防止內(nèi)存信息泄露是保護(hù)程序安全的一種有效措施。隨著細(xì)粒度地址空間布局隨機(jī)化技術(shù)的運(yùn)用,攻擊者找到構(gòu)造攻擊所需的代碼片段變得較為困難,而通過程序中存在的內(nèi)存暴露漏洞來獲取內(nèi)存布局信息,使得攻擊者能輕易定位所需的代碼片段,因此可大幅提高攻擊者攻擊成功的概率。為此,需要有效地識別程序在運(yùn)行過程中發(fā)生的內(nèi)存布局信息泄露行為,從而采取有效處理措施阻止和避免攻擊者獲取足夠的信息、發(fā)動進(jìn)一步的攻擊行動。程序的輸出操作,可能產(chǎn)生內(nèi)存布局信息泄露,是攻擊者可能實(shí)施代碼復(fù)用攻擊常用手段。目前,已有一些對于內(nèi)存布局信息泄露行為的檢測方法。但是,對于頻繁輸入輸出的程序行為,現(xiàn)有檢測方法會產(chǎn)生大量的誤報(bào),從而對系統(tǒng)性能會有較大的損失。技術(shù)實(shí)現(xiàn)要素:為解決現(xiàn)有技術(shù)的不足,本發(fā)明的目的在于提供一種程序內(nèi)存布局信息泄露行為的檢測方法,從而阻止和避免內(nèi)存布局信息的泄露,降低了攻擊者成功實(shí)施代碼復(fù)用攻擊的風(fēng)險(xiǎn)。為了實(shí)現(xiàn)上述目標(biāo),本發(fā)明采用如下的技術(shù)方案:一種程序內(nèi)存布局信息泄露行為的檢測方法,其特征在于,包括如下步驟:步驟一:獲取目標(biāo)程序及其動態(tài)鏈接庫;步驟二:識別與提取目標(biāo)程序的安全敏感區(qū)域;步驟三:確定目標(biāo)程序安全敏感區(qū)域運(yùn)行時(shí)的地址;步驟四:動態(tài)管理安全敏感區(qū)域;步驟五:程序運(yùn)行時(shí),監(jiān)控輸出操作,檢測內(nèi)存信息是否泄漏。前述的一種程序內(nèi)存布局信息泄露行為的檢測方法,其特征在于,步驟一包括:找到受保護(hù)程序及其動態(tài)鏈接的共享庫,并將它們的二進(jìn)制文件所處的完整路徑加入目標(biāo)路徑集合protectset;步驟二包括:對目標(biāo)路徑集合protectset包含的每個(gè)二進(jìn)制文件,通過分析其段表和節(jié)表得到安全敏感區(qū)域的大小和其相對于加載位置的偏移量,將結(jié)果存放到auxiliaryinfo文件中;步驟三包括:在程序裝載完成后,程序自身和裝載時(shí)鏈接的共享庫最終位置已經(jīng)確定,根據(jù)anxiliaryinfo中的信息,確定相應(yīng)安全敏感區(qū)域在進(jìn)程地址空間中的起始地址和終止位置,將其加入到boundinfo;步驟四包括:在程序運(yùn)行過程中,對安全敏感區(qū)域進(jìn)行動態(tài)管理,以更新boundinfo中的邊界信息;步驟五包括:在程序運(yùn)行時(shí),對輸出操作添加鉤子,檢查其訪問的區(qū)域是否和安全敏感區(qū)域有重合部分;若重合,則說明檢測到內(nèi)存布局信息泄露,終止程序的運(yùn)行并提醒用戶;若沒有與任意一個(gè)安全敏感區(qū)域重合,程序正常運(yùn)行。前述的一種程序內(nèi)存布局信息泄露行為的檢測方法,其特征在于,步驟一包括:步驟20:初始動作;步驟21:從集合中取出一條未經(jīng)處理的目標(biāo)程序或共享庫的路徑信息;步驟22:判斷是否得到,若得到轉(zhuǎn)步驟23,否則轉(zhuǎn)步驟28;步驟23:使用ldd命令處理得到的程序;步驟24:逐條獲取ldd的分析結(jié)果,其中每條結(jié)果表示共享庫的路徑信息;步驟25:判斷是否得到,若得到轉(zhuǎn)步驟26,否則轉(zhuǎn)步驟21;步驟26:判斷分析結(jié)果是否已存在于protectset集合中,若是,轉(zhuǎn)步驟24,否則轉(zhuǎn)步驟27;步驟27:將尚未加入集合的共享庫路徑信息添加到protectset集合中;步驟28:結(jié)束狀態(tài)。前述的一種程序內(nèi)存布局信息泄露行為的檢測方法,其特征在于,步驟二包括:步驟30:初始動作;步驟31:從protectset集合中取出未被處理的一項(xiàng);步驟32:判斷是否取到,若取到,轉(zhuǎn)步驟33,否則,轉(zhuǎn)步驟3c;步驟33:對目標(biāo)二進(jìn)制文件進(jìn)行取段表的操作;步驟34:對目標(biāo)二進(jìn)制文件進(jìn)行取節(jié)表的操作;步驟35:從段表中逐一取出可裝載段的段表項(xiàng);步驟36:判斷是否取到,若取到,轉(zhuǎn)步驟37,否則轉(zhuǎn)步驟31;步驟37:根據(jù)段表項(xiàng)標(biāo)記的節(jié)信息,從節(jié)表中取出對應(yīng)的節(jié)表項(xiàng);步驟38:判斷是否取到,若取到轉(zhuǎn)步驟39,否則轉(zhuǎn)步驟3a;步驟39:根據(jù)取到的節(jié)偏移信息和節(jié)大小信息記錄節(jié)首尾位置相對于段的偏移信息;步驟3a:將同一個(gè)段中相鄰的節(jié)進(jìn)行合并;步驟3b:合并后的節(jié)信息存入auxiliaryinfo文件;步驟3c:結(jié)束狀態(tài)。前述的一種程序內(nèi)存布局信息泄露行為的檢測方法,其特征在于,步驟三包括:步驟40:初始動作;步驟41:使用cat/proc/<pid>/maps命令來獲取指定進(jìn)程的內(nèi)存布局信息,其中pid為目標(biāo)進(jìn)程的pid,可以通過psaux命令來獲得;步驟42:判斷是否獲得進(jìn)程內(nèi)存布局信息,若得到,則轉(zhuǎn)步驟43,否則轉(zhuǎn)步驟49;步驟43:逐條讀取/proc/pid/maps的輸出,每條輸出給出了該段的映射地址、權(quán)限及對應(yīng)的映射文件等信息;步驟44:是否讀取完所有輸出,若是,則轉(zhuǎn)步驟49,否則轉(zhuǎn)步驟45;步驟45判斷該映射是否為文件映射,若是,轉(zhuǎn)步驟46,否則轉(zhuǎn)步驟43;步驟46:根據(jù)輸出信息的名稱和權(quán)限在auxiliaryinfo中找到其所對應(yīng)的安全敏感區(qū)域;步驟47:根據(jù)最終映射地址及安全敏感區(qū)相對于最終映射地址的偏移量計(jì)算出安全敏感區(qū)域在進(jìn)程地址空間中的起始地址和終止地址;步驟48:把計(jì)算結(jié)果存入boundinfo;步驟49:結(jié)束狀態(tài)。前述的一種程序內(nèi)存布局信息泄露行為的檢測方法,其特征在于,步驟四包括:提取加載的共享庫輔助信息;動態(tài)添加安全敏感區(qū)域;動態(tài)刪除安全敏感區(qū)域。前述的一種程序內(nèi)存布局信息泄露行為的檢測方法,其特征在于,步驟四中,提取加載的共享庫輔助信息包括如下步驟:步驟50:開始狀態(tài);步驟51:判斷open系統(tǒng)調(diào)用的調(diào)用者是否是目標(biāo)程序,若是,轉(zhuǎn)步驟52,否則轉(zhuǎn)步驟58;步驟52:判斷打開的文件是否是共享庫,若是,轉(zhuǎn)步驟53,否則轉(zhuǎn)步驟58;步驟53:判斷系統(tǒng)調(diào)用是否成功執(zhí)行,若是,轉(zhuǎn)步驟54,否則轉(zhuǎn)步驟58;步驟54:將記錄打開文件的路徑和其對應(yīng)的文件描述符,將鍵值對存入openfile映射中;步驟55:判斷新打開的共享庫是否已經(jīng)被分析,若是,轉(zhuǎn)步驟58,否則轉(zhuǎn)步驟56,如果共享庫已經(jīng)被分析,則其路徑一定已經(jīng)存在于protectset中,否則,該共享庫還未被分析;步驟56:對共享庫進(jìn)行分析,分析結(jié)果將存入auxiliaryinfo中;步驟57:將共享庫路徑添加到protectset中;步驟58:結(jié)束狀態(tài)。前述的一種程序內(nèi)存布局信息泄露行為的檢測方法,其特征在于,步驟四中,動態(tài)添加安全敏感區(qū)域包括如下步驟:步驟60:開始狀態(tài);步驟61:判斷mmap系統(tǒng)調(diào)用的調(diào)用者是否是目標(biāo)程序,若是,轉(zhuǎn)步驟62,否則轉(zhuǎn)步驟68;步驟62:判斷打開的文件是否是共享庫,若是,轉(zhuǎn)步驟63,否則轉(zhuǎn)步驟68;步驟63:判斷系統(tǒng)調(diào)用是否成功執(zhí)行,若是,轉(zhuǎn)步驟64,否則轉(zhuǎn)步驟68;步驟64:將記錄映射的起始位置;步驟65:根據(jù)文件路徑信息和該映射的權(quán)限信息從auxiliaryinfo中找到對應(yīng)的安全敏感區(qū)域輔助信息;步驟66:計(jì)算安全敏感區(qū)域的最終起始位置和終止位置;步驟67:將新的安全敏感區(qū)域加入boundinfo;步驟68表示結(jié)束狀態(tài)。前述的一種程序內(nèi)存布局信息泄露行為的檢測方法,其特征在于,步驟四中,動態(tài)刪除安全敏感區(qū)域包括如下步驟:步驟70:開始狀態(tài);步驟71:判斷munmap系統(tǒng)調(diào)用的調(diào)用者是否是目標(biāo)程序,若是,轉(zhuǎn)步驟72,否則轉(zhuǎn)步驟75;步驟72:判斷系統(tǒng)調(diào)用是否成功執(zhí)行,若是,轉(zhuǎn)步驟73,否則轉(zhuǎn)步驟75;步驟73:將記錄取消映射的起始位置和大小來計(jì)算起止位置;步驟74:從boundinfo中刪除和解除映射區(qū)域?qū)?yīng)的安全敏感區(qū)域;步驟75:結(jié)束狀態(tài)。前述的一種程序內(nèi)存布局信息泄露行為的檢測方法,其特征在于,步驟五包括:步驟80:開始狀態(tài);步驟81:判斷輸出操作是否由目標(biāo)程序調(diào)用,若是則轉(zhuǎn)到步驟82,否則轉(zhuǎn)到步驟86;步驟82:從boundinfo中逐條取出安全敏感區(qū)域信息;步驟83:判斷是否取到安全敏感區(qū)域的信息,即獲取該區(qū)域在進(jìn)程地址空間中的開始和結(jié)束的地址,若成功,則轉(zhuǎn)步驟84,否則轉(zhuǎn)步驟86;步驟84:將輸出操作要訪問的區(qū)域同取出的敏感區(qū)域進(jìn)行對比,檢測是否重合,若是,轉(zhuǎn)步驟85,否則轉(zhuǎn)步驟82,具體判斷流程由圖9給出;步驟85:檢測到內(nèi)存布局信息泄露;步驟86:結(jié)束狀態(tài);步驟90:開始狀態(tài);步驟91:從boundinfo中逐條取出安全敏感區(qū)域的信息,主要是對應(yīng)區(qū)域的起始地址和終止地址;步驟92:是否取到敏感區(qū)域信息,若取到,轉(zhuǎn)步驟93,否則轉(zhuǎn)步驟97;步驟93:檢查writebegin是否在敏感區(qū)域內(nèi),若在則轉(zhuǎn)步驟96,否則轉(zhuǎn)步驟94;步驟94:檢查writeend在不在敏感區(qū)域里,若在,則轉(zhuǎn)步驟96,否則轉(zhuǎn)步驟95;步驟95:檢查writebegin、writeend所表示的區(qū)域是否包含了安全敏感區(qū)域,若是轉(zhuǎn)步驟96,否則轉(zhuǎn)步驟91;步驟96:檢測到了內(nèi)存信息泄露;步驟97:終止?fàn)顟B(tài)。本發(fā)明的有益之處在于:本發(fā)明提供了一種基于程序輸出操作模式的檢測方法,從而阻止和避免內(nèi)存布局信息的泄露,降低了攻擊者成功實(shí)施代碼復(fù)用攻擊的風(fēng)險(xiǎn)。附圖說明圖1是本發(fā)明基于程序輸出操作的內(nèi)存信息泄露檢測流程示意圖;圖2是本發(fā)明目標(biāo)程序及其動態(tài)鏈接庫獲取流程圖;圖3是本發(fā)明程序安全敏感區(qū)域輔助信息提取流程圖;圖4是本發(fā)明程序安全敏感區(qū)域加載地址提取流程圖;圖5是本發(fā)明運(yùn)行時(shí)加載共享庫輔助信息提取流程圖;圖6是本發(fā)明動態(tài)添加安全敏感區(qū)域流程圖;圖7是本發(fā)明動態(tài)刪除安全敏感區(qū)域流程圖;圖8是本發(fā)明程序輸出操作檢測流程圖;圖9是本發(fā)明輸出操作邊界檢測流程圖。具體實(shí)施方式以下結(jié)合附圖和具體實(shí)施例對本發(fā)明作具體的介紹。本發(fā)明提供基于程序輸出操作模式的內(nèi)存信息泄露行為檢測方法,主要包括程序安全敏感區(qū)域集合的建立和運(yùn)行時(shí)檢測等方法。本發(fā)明的核心內(nèi)容主要有5點(diǎn):(1)目標(biāo)程序及其動態(tài)鏈接庫的獲??;(2)目標(biāo)程序安全敏感區(qū)域的識別與提??;(3)目標(biāo)程序安全敏感區(qū)域運(yùn)行時(shí)地址的確定;(4)安全敏感區(qū)域的動態(tài)管理;(5)程序運(yùn)行時(shí)監(jiān)控。下面結(jié)合附圖對本發(fā)明進(jìn)行詳細(xì)說明。圖1所示為本內(nèi)存信息泄露行為檢測方法實(shí)施的整體結(jié)構(gòu)和工作流程。本方案在程序運(yùn)行過程中對程序中涉及寫操作的系統(tǒng)調(diào)用添加鉤子,以檢查其將要訪問的內(nèi)存區(qū)域;如果發(fā)現(xiàn)該訪問區(qū)域與安全敏感區(qū)域有重合部分,則認(rèn)為攻擊者在利用程序中與寫操作相關(guān)的系統(tǒng)調(diào)用進(jìn)行內(nèi)存布局信息泄露,因此會提醒用戶并終止程序的運(yùn)行。如果受訪問區(qū)域沒有與任何安全敏感區(qū)域重合,則認(rèn)為與寫操作相關(guān)的系統(tǒng)調(diào)用正常,程序不受影響、繼續(xù)運(yùn)行。受監(jiān)控的與寫操作相關(guān)的系統(tǒng)調(diào)用包括以下幾項(xiàng):write()、pwrite64()、writev()、sendto()、sendmsg()、mq_timedsend、pwritev()、sendmmsg()。如果有新的系統(tǒng)調(diào)用執(zhí)行將內(nèi)存內(nèi)容進(jìn)行輸出的操作,則也可將被列入受監(jiān)控范圍。在本方法后續(xù)的說明中,將以輸出操作指代所有的與寫相關(guān)的系統(tǒng)調(diào)用。安全敏感區(qū)域被定義為代碼和能被用來推測代碼布局的數(shù)據(jù)(例如全局偏移量表),有關(guān)詳細(xì)信息在后續(xù)章節(jié)給出。本方法適用的系統(tǒng)平臺為linux,所用linux內(nèi)核需支持kprobe機(jī)制來實(shí)現(xiàn)對系統(tǒng)調(diào)用添加鉤子。方法中所需的分析程序通常集成在linux的發(fā)行版中或易于下載得到。本方法整體上分為兩部分,即收集管理安全敏感區(qū)域的信息和運(yùn)行時(shí)針對輸出操作的檢查。大致流程如下:找到受保護(hù)程序及其動態(tài)鏈接的共享庫,并將它們的二進(jìn)制文件所處的完整路徑加入目標(biāo)路徑集合protectset。對protectset包含的每個(gè)二進(jìn)制文件,通過分析其段表(segmenttable)和節(jié)表(sectiontable)得到安全敏感區(qū)域的大小和其相對于加載位置的偏移量,將結(jié)果存放到auxiliaryinfo文件中。在程序裝載完成后,程序自身和裝載時(shí)鏈接的共享庫最終位置已經(jīng)確定,根據(jù)anxiliaryinfo中的信息,可以確定相應(yīng)安全敏感區(qū)域在進(jìn)程地址空間中的起始地址和終止位置,將其加入到boundinfo。程序在運(yùn)行過程中也會加載和卸載共享庫,因此會引入和刪除安全敏感區(qū)域,需要對安全敏感區(qū)域進(jìn)行動態(tài)管理,以更新boundinfo中的邊界信息。最終,在程序運(yùn)行時(shí),對輸出操作添加鉤子,檢查其訪問的區(qū)域是否和安全敏感區(qū)域有重合部分;若重合,則說明檢測到內(nèi)存布局信息泄露,終止程序的運(yùn)行并提醒用戶。若沒有與任意一個(gè)安全敏感區(qū)域重合,程序正常運(yùn)行。圖2表示目標(biāo)程序及其裝載時(shí)鏈接的共享庫的獲取流程。共享庫根據(jù)鏈接時(shí)間的不同可分為兩類,分別是裝載時(shí)鏈接的共享庫和運(yùn)行時(shí)鏈接的共享庫。程序在裝載時(shí)鏈接的共享庫可以通過ldd命令的運(yùn)行結(jié)果知曉,ldd的使用方式是在終端命令行中輸入lddprogram,其中program參數(shù)表示文件名。然而ldd命令運(yùn)行結(jié)果中不包含程序運(yùn)行時(shí)鏈接的共享庫。有關(guān)程序運(yùn)行中引入的共享庫的信息,可通過對open系統(tǒng)調(diào)用添加鉤子進(jìn)行分析來獲得,有關(guān)詳細(xì)信息在后續(xù)章節(jié)給出。本過程輸入為protectset集合,protectset的初始值中只包含用戶提供的目標(biāo)程序的路徑。本過程結(jié)束后,protectset中將包含目標(biāo)程序及其裝載時(shí)鏈接的共享庫的路徑信息。具體流程如下:步驟20是初始動作;步驟21表示從集合中取出一條未經(jīng)處理的目標(biāo)程序或共享庫的路徑信息;步驟22判斷是否得到,若得到轉(zhuǎn)步驟23,否則轉(zhuǎn)步驟28;步驟23使用ldd命令處理得到的程序;步驟24表示逐條獲取ldd的分析結(jié)果,其中每條結(jié)果表示共享庫的路徑信息;步驟25判斷是否得到,若得到轉(zhuǎn)步驟26,否則轉(zhuǎn)步驟21;步驟26判斷分析結(jié)果是否已存在于protectset集合中,若是,轉(zhuǎn)步驟24,否則轉(zhuǎn)步驟27;步驟27將尚未加入集合的共享庫路徑信息添加到protectset集合中;步驟28是結(jié)束狀態(tài)。圖3表示用來構(gòu)造目標(biāo)程序及其依賴的共享庫的安全敏感區(qū)域的輔助信息提取流程圖。安全敏感區(qū)域被定義為輸出操作在程序運(yùn)行過程中不應(yīng)當(dāng)訪問的區(qū)域。通過readelf-lprogram(program代表文件名)命令可以獲得指定程序的段表(segmenttable),段表是被用來指導(dǎo)程序裝載的數(shù)據(jù)結(jié)構(gòu)。標(biāo)識為load的段表?xiàng)l目表示該段將在程序裝載時(shí)被映射到進(jìn)程地址空間。段由相應(yīng)的節(jié)(section)組成,段表按順序給出了相應(yīng)段中所包含的所有節(jié)??裳b載的段通常有兩段,可分別稱為代碼段和數(shù)據(jù)段。代碼段中除了.rodata節(jié)以外全部被標(biāo)記位安全敏感區(qū)域,數(shù)據(jù)段中除了.data和.bss節(jié)以外全部標(biāo)記為安全敏感區(qū)域。需要注意的是,在c++程序中會存在虛函數(shù)表,該數(shù)據(jù)結(jié)構(gòu)是相當(dāng)重要的,有關(guān)虛函數(shù)表位置的分析并不在本文關(guān)注范圍內(nèi),但是通過分析得到的虛函數(shù)表同樣包含在安全敏感區(qū)域內(nèi)。通過readelf-sprogram命令可以獲得指定程序的節(jié)表(sectiontable)信息,節(jié)表中每個(gè)條目對應(yīng)二進(jìn)制文件中的一個(gè)節(jié),節(jié)表?xiàng)l目中的偏移條目被用來計(jì)算該節(jié)相對于段的偏移,節(jié)表?xiàng)l目中的大小條目表示了該節(jié)的大小。通過這兩條信息可以得到節(jié)的起始位置和結(jié)束位置相對于所屬段起始位置的偏移量。如果節(jié)在二進(jìn)制文件中位置相鄰,則可以將相鄰的節(jié)合并為一個(gè)節(jié)以減少安全敏感區(qū)域的數(shù)量,合并節(jié)的首尾偏移量分別由第一節(jié)起始位置的偏移量和最后一個(gè)節(jié)結(jié)束位置的偏移量表示。本過程的輸入是protectset集合,通過對集合中的程序逐一進(jìn)行分析,將分析結(jié)果輸出到auxiliaryinfo文件。auxiliaryinfo文件中存放和安全敏感區(qū)域有關(guān)的信息,其中每一行代表一個(gè)安全敏感區(qū)域信息,包括一個(gè)安全敏感區(qū)域所屬文件的文件名、所屬段以及首尾位置相對于段加載位置的偏移量。具體流程如下:步驟30是初始動作;步驟31表示從protectset集合中取出未被處理的一項(xiàng);步驟32判斷是否取到,若取到,轉(zhuǎn)步驟33,否則,轉(zhuǎn)步驟3c;步驟33表示對目標(biāo)二進(jìn)制文件進(jìn)行取段表的操作;步驟34表示對目標(biāo)二進(jìn)制文件進(jìn)行取節(jié)表的操作;表中35表示從段表中逐一取出可裝載段的段表項(xiàng);步驟36判斷是否取到,若取到,轉(zhuǎn)步驟37,否則轉(zhuǎn)步驟31;步驟37表示根據(jù)段表項(xiàng)標(biāo)記的節(jié)信息,從節(jié)表中取出對應(yīng)的節(jié)表項(xiàng);步驟38判斷是否取到,若取到轉(zhuǎn)步驟39,否則轉(zhuǎn)步驟3a;步驟39根據(jù)取到的節(jié)偏移信息和節(jié)大小信息記錄節(jié)首尾位置相對于段的偏移信息;步驟3a表示將同一個(gè)段中相鄰的節(jié)進(jìn)行合并;步驟3b表示合并后的節(jié)信息存入auxiliaryinfo文件。步驟3c表示結(jié)束狀態(tài);圖4表示安全敏感區(qū)域的加載地址提取流程圖。不是地址無關(guān)可執(zhí)行文件/地址無關(guān)代碼(pie/pic)的程序其加載地址通常是固定的,對攻擊者來說易于分析從而構(gòu)造分析。現(xiàn)在主流操作系統(tǒng)中大多部署了地址空間布局隨機(jī)化防御方案,同時(shí)很多程序出于安全因素的考慮被編譯為pie/pic,因此,程序的最終加載地址通常等到程序裝載完成后才能確定。在程序加載完成后,通過cat/proc/<pid>/maps命令可以得到指定pid進(jìn)程的內(nèi)存映射情況。通過得到的映射情況,可以得到每個(gè)段最終被加載的位置,結(jié)合上一節(jié)中獲得的安全敏感區(qū)域相對于對應(yīng)段加載位置偏移量信息,進(jìn)而可以計(jì)算出安全敏感區(qū)域在進(jìn)程地址空間中起始地址和結(jié)束地址,最終存入boundinfo中。這部分信息會被用來進(jìn)行運(yùn)行時(shí)檢查。本過程所需的信息是程序裝載完成后的內(nèi)存布局以及安全敏感區(qū)域的輔助信息auxiliaryinfo,最終會得到安全敏感區(qū)域在進(jìn)程地址空間中的邊界信息boundinfo。具體流程如下:步驟40表示初始動作;步驟41表示使用cat/proc/<pid>/maps命令來獲取指定進(jìn)程的內(nèi)存布局信息,其中pid為目標(biāo)進(jìn)程的pid,可以通過psaux命令來獲得;步驟42判斷是否獲得進(jìn)程內(nèi)存布局信息,若得到,則轉(zhuǎn)步驟43,否則轉(zhuǎn)步驟49;步驟43表示逐條讀取/proc/pid/maps的輸出,每條輸出給出了該段的映射地址、權(quán)限及對應(yīng)的映射文件等信息;步驟44表示是否讀取完所有輸出,若是,則轉(zhuǎn)步驟49,否則轉(zhuǎn)步驟45;步驟45判斷該映射是否為文件映射,若是,轉(zhuǎn)步驟46,否則轉(zhuǎn)步驟43;步驟46表示根據(jù)輸出信息的名稱和權(quán)限在auxiliaryinfo中找到其所對應(yīng)的安全敏感區(qū)域;步驟47表示根據(jù)最終映射地址及安全敏感區(qū)相對于最終映射地址的偏移量計(jì)算出安全敏感區(qū)域在進(jìn)程地址空間中的起始地址和終止地址;步驟48表示把計(jì)算結(jié)果存入boundinfo;步驟49表示結(jié)束狀態(tài)。圖5表示運(yùn)行時(shí)加載共享庫輔助信息提取流程圖。程序在運(yùn)行時(shí)會使用dlopen來動態(tài)加載共享庫,并且使用dlopen函數(shù)加載的共享庫不會在ldd命令的結(jié)果中顯示,因此需要在運(yùn)行時(shí)對其進(jìn)行分析。系統(tǒng)會使用open系統(tǒng)調(diào)用來打開文件,因此對open系統(tǒng)調(diào)用添加鉤子能夠獲取運(yùn)行時(shí)加載共享庫的信息。內(nèi)核提供了kprobe機(jī)制來對系統(tǒng)調(diào)用添加鉤子,通過kprobe機(jī)制,能夠獲取系統(tǒng)調(diào)用參數(shù)、返回值以及添加系統(tǒng)調(diào)用的功能。本方法中對系統(tǒng)調(diào)用添加鉤子都是基于kprobe實(shí)現(xiàn)。本過程通過對open系統(tǒng)調(diào)用添加鉤子來獲得打開共享庫的路徑和文件描述符,并將結(jié)果存放到openfile映射中,同時(shí)分析打開的共享庫的安全敏感區(qū)域信息,將分析結(jié)果添加到auxiliaryinfo文件中。openfile是一個(gè)映射,關(guān)鍵字為文件描述符,值為其對應(yīng)的文件路徑。open系統(tǒng)調(diào)用的第一個(gè)參數(shù)表示想要打開的文件的路徑,如果路徑中存在.so關(guān)鍵字,則想要打開的文件為共享庫。當(dāng)open系統(tǒng)調(diào)用成功執(zhí)行時(shí),會返回文件描述符,否則返回-1,通過返回值可以判斷文件是否成功打開。具體流程如下:步驟50表示開始狀態(tài);步驟51表示判斷open系統(tǒng)調(diào)用的調(diào)用者是否是目標(biāo)程序,若是,轉(zhuǎn)步驟52,否則轉(zhuǎn)步驟58;步驟52判斷打開的文件是否是共享庫,若是,轉(zhuǎn)步驟53,否則轉(zhuǎn)步驟58;步驟53判斷系統(tǒng)調(diào)用是否成功執(zhí)行,若是,轉(zhuǎn)步驟54,否則轉(zhuǎn)步驟58;步驟54將記錄打開文件的路徑和其對應(yīng)的文件描述符,將鍵值對存入openfile映射中;步驟55判斷新打開的共享庫是否已經(jīng)被分析,若是,轉(zhuǎn)步驟58,否則轉(zhuǎn)步驟56,如果共享庫已經(jīng)被分析,則其路徑一定已經(jīng)存在于protectset中,否則,該共享庫還未被分析;步驟56表示對共享庫進(jìn)行分析,分析結(jié)果將存入auxiliaryinfo中,具體分析過程如圖3所示;步驟57表示將共享庫路徑添加到protectset中;步驟58表示結(jié)束狀態(tài)。圖6表示動態(tài)添加安全敏感區(qū)域流程圖。程序運(yùn)行過程中加載的共享庫會引入新的安全敏感區(qū)域,運(yùn)行時(shí)釋放的共享庫也會導(dǎo)致安全敏感區(qū)域的減少,因此需要進(jìn)行動態(tài)管理。操作系統(tǒng)使用mmap系統(tǒng)調(diào)用來完成對文件的映射,對mmap系統(tǒng)調(diào)用添加鉤子,可以得到文件描述符、映射區(qū)域的權(quán)限和映射的起始地址。文件描述符用來在openfile映射中檢索文件路徑信息,若文件描述符對應(yīng)的文件是共享庫,則以該文件描述符為關(guān)鍵字的鍵值對存在于openfile映射中。mmap成功執(zhí)行時(shí)返回映射地址,否則返回-1。通過文件路徑信息和映射區(qū)域的權(quán)限可在auxiliaryinfo中找到對應(yīng)的安全敏感區(qū)域,輔助信息和映射結(jié)果可以計(jì)算得到安全敏感區(qū)域的最終地址,將其加入檢查集合boundinfo來支持運(yùn)行時(shí)檢查。本過程對mmap函數(shù)添加鉤子,獲得映射的地址,以此來計(jì)算新引入的安全敏感區(qū)域的最終地址同時(shí)更新boundinfo。具體流程如下:步驟60表示開始狀態(tài);步驟61表示判斷mmap系統(tǒng)調(diào)用的調(diào)用者是否是目標(biāo)程序,若是,轉(zhuǎn)步驟62,否則轉(zhuǎn)步驟68;步驟62判斷打開的文件是否是共享庫,若是,轉(zhuǎn)步驟63,否則轉(zhuǎn)步驟68;步驟63判斷系統(tǒng)調(diào)用是否成功執(zhí)行,若是,轉(zhuǎn)步驟64,否則轉(zhuǎn)步驟68;步驟64將記錄映射的起始位置;步驟65表示根據(jù)文件路徑信息和該映射的權(quán)限信息從auxiliaryinfo中找到對應(yīng)的安全敏感區(qū)域輔助信息;步驟66表示計(jì)算安全敏感區(qū)域的最終起始位置和終止位置;步驟67表示將新的安全敏感區(qū)域加入boundinfo;步驟68表示結(jié)束狀態(tài)。圖7表示動態(tài)刪除安全敏感區(qū)域流程圖。munmap系統(tǒng)調(diào)用會取消指定地址范圍的映射,對該系統(tǒng)調(diào)用添加鉤子可獲得取消映射區(qū)域的首尾地址,如果安全敏感區(qū)域和取消映射區(qū)域?qū)?yīng),則從安全敏感區(qū)域中刪除此區(qū)域。munmap成功執(zhí)行返回0,否則返回-1。本過程對munmap系統(tǒng)調(diào)用添加鉤子,獲得取消映射區(qū)域的起止位置,并刪除boundinfo中對應(yīng)的安全敏感區(qū)域。具體流程如下:步驟70表示開始狀態(tài);步驟71表示判斷munmap系統(tǒng)調(diào)用的調(diào)用者是否是目標(biāo)程序,若是,轉(zhuǎn)步驟72,否則轉(zhuǎn)步驟75;步驟72判斷系統(tǒng)調(diào)用是否成功執(zhí)行,若是,轉(zhuǎn)步驟73,否則轉(zhuǎn)步驟75;步驟73將記錄取消映射的起始位置和大小來計(jì)算起止位置;步驟74表示從boundinfo中刪除和解除映射區(qū)域?qū)?yīng)的安全敏感區(qū)域;步驟75表示結(jié)束狀態(tài)。圖8表示程序輸出操作檢測流程圖。程序的輸出操作會通過與寫相關(guān)的系統(tǒng)調(diào)用來實(shí)現(xiàn),因此,對系統(tǒng)中所有的寫操作系統(tǒng)調(diào)用添加鉤子可以發(fā)現(xiàn)程序任意時(shí)刻的輸出。每當(dāng)系統(tǒng)中有輸出操作被使用時(shí),會首先檢查該輸出操作是不是被保護(hù)程序調(diào)用的,若不是,則程序正常運(yùn)行,若是,則觸發(fā)運(yùn)行時(shí)檢查。以write系統(tǒng)調(diào)用為例,該函數(shù)含有三個(gè)參數(shù),其中buf和size分別表示write要訪問區(qū)域的起始地址和訪問的字節(jié)數(shù),據(jù)此可以得到write訪問區(qū)域的開始和結(jié)束地址。對boundinfo中每一個(gè)安全敏感區(qū)域,都會檢查輸出操作想要訪問的區(qū)域是否與該安全敏感區(qū)域重合,若重合,說明檢測到內(nèi)存信息泄露,終止程序運(yùn)行并提醒用戶。若所有的安全敏感區(qū)域檢查完成后發(fā)現(xiàn)都沒有發(fā)生重合,則程序正常運(yùn)行。本過程對輸出操作系統(tǒng)調(diào)用添加鉤子,獲取其要訪問的區(qū)域來判斷是否合法。具體步驟如下:步驟80表示開始狀態(tài);步驟81表示判斷輸出操作是否由目標(biāo)程序調(diào)用,若是則轉(zhuǎn)到步驟82,否則轉(zhuǎn)到步驟86;步驟82表示從boundinfo中逐條取出安全敏感區(qū)域信息;步驟83表示判斷是否取到安全敏感區(qū)域的信息,即獲取該區(qū)域在進(jìn)程地址空間中的開始和結(jié)束的地址,若成功,則轉(zhuǎn)步驟84,否則轉(zhuǎn)步驟86;步驟84表示將輸出操作要訪問的區(qū)域同取出的敏感區(qū)域進(jìn)行對比,檢測是否重合,若是,轉(zhuǎn)步驟85,否則轉(zhuǎn)步驟82,具體判斷流程由圖9給出;步驟85表示檢測到內(nèi)存布局信息泄露;步驟86表示結(jié)束狀態(tài)。圖9表示輸出操作邊界檢查流程圖,該過程的目的是檢測輸出操作所訪問的區(qū)域與安全敏感區(qū)域是否有重合部分。通過有關(guān)輸出操作的函數(shù)參數(shù)可以得到訪問區(qū)域的起始位置,分別記為writebegin和writeend。檢查非常便捷,以單個(gè)敏感區(qū)域?yàn)槔?。首先檢查writebegin在不在敏感區(qū)域里,即檢查writebegin是否大于等于該敏感區(qū)域的起始地址,同時(shí)小于等于該敏感區(qū)域的終止地址,若在,即檢測到內(nèi)存信息泄露,終止程序運(yùn)行并提醒用戶。若不在,進(jìn)行下一步操作。再檢測writeend在不在敏感區(qū)域里,若在,檢測到內(nèi)存信息泄露,終止程序運(yùn)行并提醒用戶。最后,檢查安全敏感區(qū)域是不是在writebegin和writeend包含的范圍里,若是,檢查到內(nèi)存信息泄露,終止程序運(yùn)行并提醒用戶,否則程序正常運(yùn)行。本過程的輸入是輸出操作訪問區(qū)域的上下界和安全敏感區(qū)域信息boundinfo,通過比較邊界信息來判斷是否存在內(nèi)存信息泄露。具體流程如下:步驟90表示開始狀態(tài);步驟91表示從boundinfo中逐條取出安全敏感區(qū)域的信息,主要是對應(yīng)區(qū)域的起始地址和終止地址。步驟92表示是否取到敏感區(qū)域信息,若取到,轉(zhuǎn)步驟93,否則轉(zhuǎn)步驟97;步驟93表示檢查writebegin是否在敏感區(qū)域內(nèi),若在則轉(zhuǎn)步驟96,否則轉(zhuǎn)步驟94;步驟94檢查writeend在不在敏感區(qū)域里,若在,則轉(zhuǎn)步驟96,否則轉(zhuǎn)步驟95;步驟95檢查writebegin、writeend所表示的區(qū)域是否包含了安全敏感區(qū)域,若是轉(zhuǎn)步驟96,否則轉(zhuǎn)步驟91;步驟96表示檢測到了內(nèi)存信息泄露;步驟97表示終止?fàn)顟B(tài)。本發(fā)明通過分析程序在正常運(yùn)行過程中輸出操作的訪問區(qū)域的規(guī)律,以減少對內(nèi)存布局信息泄露行為的誤報(bào),使得基于程序的輸出操作識別內(nèi)存布局信息泄露行為更為準(zhǔn)確。而且,本方法的檢測過程,僅進(jìn)行簡單的輸出操作訪問區(qū)域邊界檢查,提高了檢測處理的效率,減少了系統(tǒng)性能開銷。以上顯示和描述了本發(fā)明的基本原理、主要特征和優(yōu)點(diǎn)。本行業(yè)的技術(shù)人員應(yīng)該了解,上述實(shí)施例不以任何形式限制本發(fā)明,凡采用等同替換或等效變換的方式所獲得的技術(shù)方案,均落在本發(fā)明的保護(hù)范圍內(nèi)。當(dāng)前第1頁12當(dāng)前第1頁12
當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
玛纳斯县| 蒙阴县| 彭州市| 玉屏| 呼玛县| 山丹县| 邻水| 大荔县| 将乐县| 土默特右旗| 宜兰县| 株洲县| 和静县| 科技| 新竹县| 溧阳市| 福安市| 大丰市| 尼木县| 大连市| 丹凤县| 德安县| 淮滨县| 平塘县| 潞西市| 遵义县| 雅安市| 军事| 喀喇| 文登市| 道孚县| 六盘水市| 南陵县| 房山区| 溧水县| 柳林县| 太保市| 饶阳县| 大方县| 教育| 高淳县|