基于二進(jìn)制改寫和動(dòng)態(tài)隨機(jī)化的軟件安全增強(qiáng)方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明屬于計(jì)算機(jī)技術(shù)領(lǐng)域,尤其是系統(tǒng)與軟件安全領(lǐng)域。本發(fā)明提供了一種結(jié) 合二進(jìn)制改寫和動(dòng)態(tài)隨機(jī)化的軟件安全增強(qiáng)方法,用于提高操作系統(tǒng)和應(yīng)用軟件的安全 性。
【背景技術(shù)】
[0002] 計(jì)算機(jī)技術(shù)在生產(chǎn)和生活中起到了舉足輕重的作用,確保計(jì)算機(jī)系統(tǒng)和軟件的安 全性顯得越來越重要。在計(jì)算機(jī)系統(tǒng)與軟件安全的軍備競賽中,先后出現(xiàn)的攻擊方式有: 緩沖區(qū)溢出攻擊(BufferOverflowAttack)、代碼注入攻擊(CodeInjectionAttack)、代 碼復(fù)用攻擊(CodeReuseAttack),信息泄露攻擊(InformationLeakageAttack)等;作 為對(duì)應(yīng),相關(guān)的防御機(jī)制有:不可執(zhí)行(No-eXecute,NX)、地址空間隨機(jī)化(AddressSpace LayoutRandomization,ASLR)等。
[0003] 緩沖區(qū)溢出攻擊:一種被廣泛利用并危害嚴(yán)重的攻擊方式,已經(jīng)成為計(jì)算機(jī)系統(tǒng) 安全亟待解決的重要問題。其中,緩沖區(qū)溢出是指寫入緩沖區(qū)的數(shù)據(jù)量超過緩沖區(qū)的實(shí)際 大小,溢出的數(shù)據(jù)覆蓋了相鄰存儲(chǔ)單元中的數(shù)據(jù)。緩沖區(qū)溢出攻擊主要包括:堆溢出、格式 化字符串溢出、整型溢出和棧溢出等,其中棧溢出最為常見。緩沖區(qū)溢出攻擊常常作為基礎(chǔ) 攻擊方式用來配合其它類型的攻擊,對(duì)系統(tǒng)安全構(gòu)成極大威脅。
[0004] 代碼注入攻擊:攻擊者通過將惡意代碼注入進(jìn)程地址空間并劫取控制流執(zhí)行惡意 代碼來進(jìn)行攻擊。被注入的代碼稱為payload,放在進(jìn)程地址空間的堆或棧上。代碼注入攻 擊一般包括SQL注入,Shell注入等。
[0005] 代碼復(fù)用攻擊:攻擊者通過直接復(fù)用程序中現(xiàn)有的代碼而不是注入代碼來 實(shí)現(xiàn)攻擊。具有代表性的代碼復(fù)用攻擊有R〇P(Return-OrientedProgramming)、 J0P(Jump-OrientedProgramming),Ret-into-Libc;這些攻擊直接復(fù)用二進(jìn)制程序或者共 享庫中的代碼片段,因?yàn)闆]有向進(jìn)程地址空間中注入代碼,所以代碼復(fù)用攻擊可以繞過現(xiàn) 有的不可執(zhí)行防御機(jī)制。
[0006] 信息泄露攻擊:攻擊者利用進(jìn)程地址空間中的指針等信息來逆向分析進(jìn)程地址空 間布局。此攻擊利用現(xiàn)有地址空間隨機(jī)化機(jī)制只能在程序裝載時(shí)做一次隨機(jī)化的特點(diǎn),主 要用來繞過地址空間隨機(jī)化,服務(wù)于其它類型的攻擊。常見的信息泄露類型有堆或棧中的 指針,隱通道(Side-channel)等。
[0007] 不可執(zhí)行(No-eXecute,NX):操作系統(tǒng)將特定內(nèi)存區(qū)域設(shè)置為不可執(zhí)行(NX),這 樣CPU會(huì)拒絕執(zhí)行被標(biāo)記為NX區(qū)域的內(nèi)存代碼。因而,通過將棧、堆、數(shù)據(jù)段等段設(shè)置為不 可執(zhí)行即可有效防御代碼注入攻擊。目前不可執(zhí)行機(jī)制已經(jīng)被Linux、Windows、Android等 主流操作系統(tǒng)采用。
[0008] 地址空間隨機(jī)化:通過使進(jìn)程地址空間布局不可預(yù)測,從而保護(hù)系統(tǒng)和軟件不受 攻擊。地址空間隨機(jī)化的主要原理是通過隨機(jī)排布進(jìn)程地址空間中的各個(gè)內(nèi)存對(duì)象,隱藏 攻擊行為賴以成功的必要信息,增加攻擊成功實(shí)施的難度,從而達(dá)到防御攻擊的目的。地址 空間隨機(jī)化的效果在于1)降低攻擊者成功的概率2)使針對(duì)一臺(tái)計(jì)算機(jī)的攻擊方法不能簡 單地移植到另一臺(tái)計(jì)算機(jī)上。盡管地址空間隨機(jī)化可以有效的降低緩沖區(qū)溢出攻擊和代碼 復(fù)用攻擊的成功率,但是主流商用操作系統(tǒng)(包括Windows,Linux,Android,IOS和PaX) 中的地址空間隨機(jī)化機(jī)制只能在程序裝載階段實(shí)施,裝載階段的隨機(jī)化雖然能使程序啟動(dòng) 時(shí)形成不同的進(jìn)程地址空間布局,但一旦地址空間布局形成,除非重啟進(jìn)程,否則無法在運(yùn) 行時(shí)刻再次改變其地址空間布局。同時(shí),現(xiàn)有的進(jìn)程地址空間隨機(jī)化機(jī)制只能對(duì)程序的代 碼段、數(shù)據(jù)段、棧、堆、共享庫等段的基地址進(jìn)行隨機(jī)化。綜上,現(xiàn)有的地址空間隨機(jī)化機(jī)制 存在隨機(jī)化粒度粗,隨機(jī)化頻率低,產(chǎn)生的隨機(jī)熵不足以在決定性的小概率下隱藏攻擊行 為賴以成功的必要信息等缺陷,尤其在針對(duì)暴力破解和信息泄露攻擊的防御力度上存在不 足。
【發(fā)明內(nèi)容】
[0009] 在現(xiàn)有工作的基礎(chǔ)上,本發(fā)明的目的在于:解決現(xiàn)有地址空間隨機(jī)化機(jī)制中隨機(jī) 化粒度粗、只能在程序裝載階段隨機(jī)化、無法防御信息泄露攻擊等問題,從而有效提高計(jì)算 機(jī)系統(tǒng)和軟件的安全性和可靠性。
[0010] 本發(fā)明的技術(shù)方案為:基于二進(jìn)制改寫和動(dòng)態(tài)隨機(jī)化的軟件安全增強(qiáng)方法,其特 征是靜態(tài)二進(jìn)制改寫,進(jìn)程邏輯頁到邏輯頁、邏輯頁到物理頁雙層(Double-Level)映射, 動(dòng)態(tài)隨機(jī)化機(jī)制周期性以頁為粒度隨機(jī)化進(jìn)程地址空間,邏輯地址映射重定向機(jī)制向進(jìn)程 提供邏輯地址重定向服務(wù);從而在確保程序正確運(yùn)行的前提下杜絕攻擊行為,確保計(jì)算機(jī) 系統(tǒng)與軟件的安全性與可靠性。
[0011] 本發(fā)明具體包括以下模塊:
[0012] 1)靜態(tài)二進(jìn)制改寫模塊,本模塊負(fù)責(zé)將可執(zhí)行文件重構(gòu)為滿足以頁為粒度做動(dòng)態(tài) 隨機(jī)化要求的格式。二進(jìn)制改寫操作主要針對(duì)可執(zhí)行文件代碼段中的跳轉(zhuǎn)類指令和頁末指 令;根據(jù)需要,跳轉(zhuǎn)類指令分為頁間跳轉(zhuǎn)指令和頁內(nèi)跳轉(zhuǎn)指令,改寫操作將頁間跳轉(zhuǎn)指令替 換為特定的系統(tǒng)調(diào)用指令序列,并在頁末指令前插入系統(tǒng)調(diào)用指令序列;其中,頁內(nèi)跳轉(zhuǎn)指 令定義為:跳轉(zhuǎn)指令地址和指令目的地址在同一個(gè)邏輯頁;頁間跳轉(zhuǎn)指令定義為:跳轉(zhuǎn)指 令地址和指令目的地址不在同一個(gè)邏輯頁;頁末指令定義為:邏輯頁的最后一條指令;邏 輯頁定義為:與特定體系結(jié)構(gòu)上物理頁大小相同的、連續(xù)的邏輯塊;
[0013] 2)可執(zhí)行文件加載模塊,本模塊負(fù)責(zé)創(chuàng)建進(jìn)程地址空間、加載可執(zhí)行文件、建立 進(jìn)程地址空間與可執(zhí)行文件段的映射、激活動(dòng)態(tài)隨機(jī)化機(jī)制。操作系統(tǒng)運(yùn)行可執(zhí)行文件 時(shí)首先將可執(zhí)行文件加載至內(nèi)存,然后解析可執(zhí)行文件格式,并根據(jù)可執(zhí)行文件頭提供的 信息,創(chuàng)建進(jìn)程地址空間(如創(chuàng)建用戶棧)并建立進(jìn)程地址空間與可執(zhí)行文件的代碼段、 數(shù)據(jù)段等段的映射關(guān)系,然后激活動(dòng)態(tài)隨機(jī)化機(jī)制,最后將控制流重定向到可執(zhí)行文件的 Entry-Point;
[0014] 3)動(dòng)態(tài)隨機(jī)化機(jī)制自舉模塊,本模塊負(fù)責(zé)進(jìn)程相關(guān)的動(dòng)態(tài)隨機(jī)化模塊的初始 化。創(chuàng)建進(jìn)程地址空間并加載可執(zhí)行文件至進(jìn)程地址空間之后,在進(jìn)程開始執(zhí)行之前, 操作系統(tǒng)激活動(dòng)態(tài)隨機(jī)化機(jī)制,自舉模塊根據(jù)模塊2)的解析結(jié)果初始化動(dòng)態(tài)隨機(jī)化模 塊,具體包括:分配相關(guān)的數(shù)據(jù)結(jié)構(gòu),建立進(jìn)程邏輯頁到邏輯頁、邏輯頁到物理頁雙層 (Double-Level)映射表,創(chuàng)建并激活隨機(jī)化線程等;
[0015] 4)動(dòng)態(tài)隨機(jī)化模塊,本模塊負(fù)責(zé)周期性以頁為粒度隨機(jī)化進(jìn)程的地址空間。在 由模塊2)所創(chuàng)建的進(jìn)程的整個(gè)生命周期中,動(dòng)態(tài)隨機(jī)化模塊會(huì)異步的、透明的、周期性 的以頁為粒度隨機(jī)化進(jìn)程的地址空間、從而保證此進(jìn)程不被攻擊者攻擊,確保進(jìn)程執(zhí)行 的安全性;動(dòng)態(tài)隨機(jī)化主要通過本發(fā)明中的進(jìn)程邏輯頁到邏輯頁、邏輯頁到物理頁雙層 (Double-Level)映射表來實(shí)現(xiàn);其中,隨機(jī)化周期可以根據(jù)需要設(shè)定,例如lms、100ms、Is 等;
[0016] 5)邏輯地址映射重定向模塊,本模塊負(fù)責(zé)向進(jìn)程提供"頁間跳轉(zhuǎn)"相關(guān)的邏輯地址 重定向服務(wù),確保程序原有的靜態(tài)邏輯的正確性。模塊4)隨機(jī)性打亂了由模塊2)所創(chuàng)建 的進(jìn)程地址空間,為了重構(gòu)進(jìn)程地址空間中合法的、原有的、靜態(tài)的邏輯地址關(guān)聯(lián),邏輯地 址映射重定向模塊以系統(tǒng)調(diào)用的形式向進(jìn)程提供邏輯地址重定向服務(wù),此服務(wù)是確保在動(dòng) 態(tài)隨機(jī)化機(jī)制下程序正確運(yùn)行的基礎(chǔ);重定位模塊接受進(jìn)程所提供的靜態(tài)的、隨機(jī)化前目 的地址和地址類型(如,直接尋址、間接尋址、條件跳轉(zhuǎn))作為參數(shù),通過查詢邏輯頁到邏輯 頁映射表,計(jì)算隨機(jī)化之后的地址,并將控制流重定向到此目的地址所對(duì)應(yīng)的隨機(jī)化之后 的地址或者判定為攻擊行為;
[0017] 6)資源回收模塊,本模塊負(fù)責(zé)回收進(jìn)程隨機(jī)化相關(guān)的資源。當(dāng)由模塊2)所創(chuàng)建的 進(jìn)程結(jié)束的時(shí)候,操作系統(tǒng)需要回收進(jìn)程隨機(jī)化相關(guān)的內(nèi)存資源,并根據(jù)需要給出進(jìn)程生 命周期的統(tǒng)計(jì)信息。
[0018] 進(jìn)一步,其中上述模塊1)的具體步驟如下:
[0019] 模塊1)_1:給定可執(zhí)行文件;
[0020] 模塊1)-2 :分析可執(zhí)行文件,抽取指令、基本快、函數(shù)等信息,構(gòu)建控制流圖;
[0021] 模塊1)_3 :識(shí)別跳轉(zhuǎn)類指令和頁末指令,并將跳轉(zhuǎn)類指令劃分為頁內(nèi)跳轉(zhuǎn)指令和 頁間跳轉(zhuǎn)指令;
[0022] 模塊1)_4 :對(duì)于頁內(nèi)跳轉(zhuǎn)指令不做處理;對(duì)于頁間跳轉(zhuǎn)指令,將之替換為系統(tǒng)調(diào) 用指令序列;對(duì)于頁末指令,在其之前插入系統(tǒng)調(diào)用指令序列;
[0023] 模塊1) _5 :重新生成可執(zhí)行文件,新生成的可執(zhí)行文件滿足動(dòng)態(tài)隨機(jī)化的要求;
[0024] 進(jìn)一步,其中上述模塊2)的具體步驟如下:
[0025] 模塊2)-1 :用戶運(yùn)行可執(zhí)行文件;
[0026] 模塊2) -2 :操作系統(tǒng)從磁盤讀取此可執(zhí)行文件,并解析可執(zhí)行文件格式;
[0027] 模塊2)-3:操作系統(tǒng)創(chuàng)建進(jìn)程地址空間;
[0028] 模塊2)-4:操作系統(tǒng)根據(jù)可執(zhí)行文件頭提供的信息將代碼段、數(shù)據(jù)段等段映射到 進(jìn)程地址空間中特定區(qū)域;
[0029] 模塊2)_5:操作系統(tǒng)根據(jù)可執(zhí)行文件頭中的標(biāo)志位判斷此可執(zhí)行文件是否為重 構(gòu)之后的文件;
[0030] 模塊2)-6 :如果此可執(zhí)行文件被重構(gòu)過,則操作系統(tǒng)激活動(dòng)態(tài)隨機(jī)化機(jī)制,并將 進(jìn)程身份信息傳遞給動(dòng)