• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    基于混合分析的Java 反序列化漏洞檢測(cè)方法

    2023-12-16 10:29:42沙樂(lè)天
    計(jì)算機(jī)工程 2023年12期
    關(guān)鍵詞:污點(diǎn)序列化調(diào)用

    鄭 鵬,沙樂(lè)天

    (南京郵電大學(xué) 計(jì)算機(jī)學(xué)院、軟件學(xué)院、網(wǎng)絡(luò)空間安全學(xué)院,南京 210003)

    0 概述

    近年來(lái),基于Web 技術(shù)的互聯(lián)網(wǎng)應(yīng)用日益增多,序列化方法作為數(shù)據(jù)傳輸?shù)囊环N通用方案,涉及用戶信息、數(shù)據(jù)存儲(chǔ)、訪問(wèn)控制等諸多方面,一旦受到威脅,可能導(dǎo)致企業(yè)無(wú)法提供完整服務(wù),用戶信息財(cái)產(chǎn)安全無(wú)法得到有效保障。XStream 于2021 年爆出若干反序列化漏洞[1-2]。攻擊者需要根據(jù)反序列化鏈的傳播特點(diǎn),在類路徑中搜索節(jié)點(diǎn)組裝成反序列化利用鏈,達(dá)到裹挾控制流執(zhí)行危險(xiǎn)函數(shù)的目的。因此,反序列化利用鏈?zhǔn)欠葱蛄谢┒蠢玫年P(guān)鍵,研究如何自動(dòng)化檢測(cè)反序列化利用鏈變得至關(guān)重要。

    因?yàn)榉葱蛄谢梢宰x入任何修改過(guò)的文本,為了分析寫入文件的惡意代碼數(shù)據(jù)是否可以流向危險(xiǎn)函數(shù),需要分析數(shù)據(jù)在系統(tǒng)中是如何傳播和使用的,以確保反序列化過(guò)程不會(huì)被外界操作篡改。信息流分析技術(shù)通過(guò)分析程序中數(shù)據(jù)傳播的合法性以保證信息安全,是防止數(shù)據(jù)的完整性和保密性被破壞的有效手段。

    污點(diǎn)分析[3-4]是一種信息流分析方法,包含靜態(tài)分析方法[5]和動(dòng)態(tài)分析方法[6]。傳統(tǒng)的動(dòng)態(tài)分析方法包括fuzz[7-8]、插樁[9-10]等,此類方法程序精確度高,但是只依靠動(dòng)態(tài)方法無(wú)法跑出所有可執(zhí)行程序,因此可靠性不高;靜態(tài)分析方法雖然可靠性高,但是消耗系統(tǒng)資源多。為了保持可靠性與時(shí)間性能之間的平衡,通常會(huì)對(duì)數(shù)據(jù)流分析中的分支進(jìn)行合并,由此會(huì)產(chǎn)生大量的誤報(bào),通常要結(jié)合動(dòng)態(tài)分析驗(yàn)證結(jié)果。郭帆等[11]提出了一種針對(duì)SQL 注入漏洞的靜態(tài)檢測(cè)和動(dòng)態(tài)驗(yàn)證方法。ZUO 等[12]結(jié)合靜態(tài)和動(dòng)態(tài)方法,基于選擇符號(hào)執(zhí)行實(shí)現(xiàn)了App 的惡意URL 檢測(cè)工具。

    在現(xiàn)有的反序列化鏈分析方法中,KUANG等[13]提出了一種基于抽象語(yǔ)法樹(shù)(AST)的漏洞挖掘方法,但這種方法無(wú)法完全覆蓋語(yǔ)句編寫方式,難以實(shí)現(xiàn)調(diào)用關(guān)系與數(shù)據(jù)流動(dòng)的分析。HAKEN[14]通過(guò)字節(jié)碼分析實(shí)現(xiàn)了反序列化漏洞調(diào)用鏈的挖掘工具Gadget Inspector,但其調(diào)用鏈不完整。杜笑宇等[15]將Gadget Inspector 中的搜索策略從廣度優(yōu)先改良成深度優(yōu)先,挖掘出了一部分新的鏈,但是漏報(bào)率高。武永興等[16]通過(guò)指針?lè)治龇葱蛄谢湆?duì)應(yīng)的數(shù)據(jù)類型,但是指針?lè)治鰰?huì)占用過(guò)多的計(jì)算資源。RASHEED 等[17]提出了一種混合方法,在靜態(tài)分析的基礎(chǔ)上使用堆抽象對(duì)Java 反序列化漏洞進(jìn)行模糊測(cè)試,但是檢出率低。

    本文主要進(jìn)行以下工作:1)將符號(hào)執(zhí)行與污點(diǎn)分析結(jié)合,定義污點(diǎn)傳播規(guī)則對(duì)傳播路徑進(jìn)行約束,構(gòu)建反序列化污點(diǎn)傳播模型;2)采用動(dòng)靜態(tài)結(jié)合的方法還原污點(diǎn)傳播路徑,設(shè)計(jì)并實(shí)現(xiàn)字節(jié)碼級(jí)別的反序列化利用鏈檢測(cè)工具Taint Gadget。

    1 背景知識(shí)

    1.1 Java 反序列化的污點(diǎn)分析

    污點(diǎn)分析是一種跟蹤分析污點(diǎn)數(shù)據(jù)在程序之間流動(dòng)的方法。程序分析將外來(lái)的數(shù)據(jù)當(dāng)作污點(diǎn)信息來(lái)源,然后傳遞給程序內(nèi)部進(jìn)行數(shù)據(jù)監(jiān)控和流向分析,以此判斷程序中是否存在敏感數(shù)據(jù)泄露或者危險(xiǎn)操作等違反數(shù)據(jù)完整性和保密性的安全漏洞。LIVSHITS 等[18]將上下文敏感的別名分析與污點(diǎn)分析相結(jié)合,靜態(tài)檢測(cè)Java 程序漏洞。Multi Flow[19]使用了一種基于多源綁定的方法,結(jié)合污點(diǎn)分析技術(shù)精確判別多組源能否在一次執(zhí)行中綁定。

    污點(diǎn)分析方法可以表示成Source、Sink 和Chain三元組的形式,其中:Source 代表污染源,即引入不受信任或機(jī)密的數(shù)據(jù)到應(yīng)用程序中的地方,這些數(shù)據(jù)可能來(lái)自API 或者網(wǎng)絡(luò)接口;Sink 代表匯聚點(diǎn),即污點(diǎn)數(shù)據(jù)聚集的地方,此處會(huì)發(fā)生違反數(shù)據(jù)完整性、保密性、可用性的敏感操作;Chain 是傳播的中間節(jié)點(diǎn),Source 經(jīng)過(guò)若干Chain 傳播到Sink。污點(diǎn)分析的研究目標(biāo)是進(jìn)行污點(diǎn)傳播路徑分析,即利用程序的依賴信息來(lái)分析污點(diǎn)數(shù)據(jù)在程序中的傳播路徑。利用污點(diǎn)分析可以從源頭跟蹤傳播鏈路。污點(diǎn)分析過(guò)程如圖1 所示。

    圖1 污點(diǎn)分析過(guò)程Fig.1 Process of taint analysis

    用反序列化鏈URLDNS 調(diào)用鏈舉例說(shuō)明,探討如何搜索Java 反序列化的調(diào)用鏈,如圖2 所示。在URLDNS 調(diào)用鏈中,Sink 是Java 內(nèi)置的java.net.URL類,此類在對(duì)URL 對(duì)象進(jìn)行比較時(shí),會(huì)觸發(fā)一次DNS 解析。通過(guò)查看目標(biāo)URL 的DNS 解析是否被解析,可用于判斷目標(biāo)站點(diǎn)是否存在反序列化漏洞。此鏈路中Source 是java.util.HashMap。接下來(lái)利用反射[20]連接HashMap 和URL。

    使用反射可以調(diào)用任意對(duì)象的任意方法和任意屬性,即可以動(dòng)態(tài)調(diào)用對(duì)象方法?;诖藯l件可以構(gòu)造反序列化漏洞的調(diào)用鏈。使用反射將object 變量設(shè)置成URL,使HashMap 中的末尾函數(shù)hash 可以調(diào)用到URL 中的起始函數(shù)hashcode,最終調(diào)用到危險(xiǎn)函數(shù)InetAddress.getByName(host)。如何尋找到這樣的調(diào)用點(diǎn)并將污點(diǎn)的鏈路進(jìn)行連接是反序列化污點(diǎn)分析的難點(diǎn)。

    1.2 符號(hào)執(zhí)行

    符號(hào)執(zhí)行的目的是為了提高程序的效率和覆蓋率,可以用于約束路徑。孫基男等[21]提出一種基于符號(hào)執(zhí)行的注入類漏洞分析方法,輸入符號(hào)構(gòu)造矩陣對(duì)注入類漏洞進(jìn)行檢測(cè)和分析。BALZAROTTI等[22]提出一種自動(dòng)化方法,通過(guò)結(jié)合靜態(tài)檢測(cè)、動(dòng)態(tài)檢測(cè)和符號(hào)執(zhí)行產(chǎn)生能夠繞過(guò)防御的攻擊向量。ALHUZALI 等[23]結(jié)合動(dòng) 態(tài)分析 和靜態(tài)分析,提 出一種自動(dòng)生成攻擊向量的污點(diǎn)分析模型。

    符號(hào)執(zhí)行的思想是使用符號(hào)輸入值取代具體的輸入值,多用于維護(hù)路徑。符號(hào)執(zhí)行為每個(gè)路徑使用符號(hào)狀態(tài)進(jìn)行維護(hù),符號(hào)狀態(tài)包括路徑約束π和符號(hào)狀態(tài)σ,分別用于描述路徑的分支條件和存儲(chǔ)變量到符號(hào)表達(dá)式的映射。符號(hào)執(zhí)行實(shí)例如下:

    符號(hào)執(zhí)行流程如圖3 所示。程序由3 條執(zhí)行路徑分化成4 條路經(jīng),每條路徑對(duì)應(yīng)一個(gè)路徑約束。最終返回true 的有2 條路徑,經(jīng)求解,路徑約束是size>0;返回false 的也有2 條路徑,路徑約束是size≤0。

    圖3 符號(hào)執(zhí)行流程Fig.3 Procedure of symbol execution

    通過(guò)這個(gè)例子可以發(fā)現(xiàn),在使用符號(hào)執(zhí)行分析帶有條件的控制轉(zhuǎn)移語(yǔ)句時(shí),可以將條件語(yǔ)句轉(zhuǎn)化為符號(hào)取值約束,通過(guò)分析約束是否有解判斷路徑的可行性。對(duì)于復(fù)雜的表達(dá)式,路徑求解約束面對(duì)復(fù)雜的約束需要將符號(hào)取值約束求解轉(zhuǎn)化為可滿足性模理 論(Satisfactory Model Theory,SMT)[24]進(jìn) 行求解。SMT 是基于SAT[25]的,SAT 是基于布爾邏輯的,但是程序中的條件判斷參數(shù)和返回值不全是布爾值,因此,SMT 在SAT 的基礎(chǔ)上增加了對(duì)特定類型的條件檢查。

    2 基于混合方法的Java反序列化鏈檢測(cè)模型

    針對(duì)當(dāng)前反序列化漏洞污點(diǎn)分析過(guò)程中如何尋找到這樣的調(diào)用點(diǎn)并將污點(diǎn)的鏈路進(jìn)行連接這一難點(diǎn),本文提出基于符號(hào)執(zhí)行和污點(diǎn)分析的反序列化漏洞檢測(cè)模型,整體框架如圖4 所示。該模型包含靜態(tài)分析、污點(diǎn)傳播規(guī)則定義、污點(diǎn)傳播3 個(gè)模塊。靜態(tài)分析模塊獲取控制流圖,根據(jù)圖數(shù)據(jù)庫(kù)中定義的節(jié)點(diǎn)特征獲取Source 和Sink。污點(diǎn)分析模塊基于傳播規(guī)則進(jìn)行傳播,傳播過(guò)程中遇到約束時(shí),根據(jù)約束規(guī)則進(jìn)行約束求解并動(dòng)態(tài)驗(yàn)證,不滿足條件則丟棄傳播鏈。

    2.1 靜態(tài)分析

    針對(duì)污點(diǎn)分析的重要節(jié)點(diǎn),過(guò)濾Java 字節(jié)碼文件中的無(wú)關(guān)指令得到敏感Java 字節(jié)碼進(jìn)行方法之間的分析,標(biāo)記并追蹤Java 虛擬機(jī)在執(zhí)行方法時(shí)的棧和局部變量表。在調(diào)用方法前對(duì)相關(guān)參數(shù)進(jìn)行入棧,入棧的數(shù)據(jù)在本地變量表中能標(biāo)識(shí)一個(gè)方法內(nèi)部的數(shù)據(jù)流動(dòng)。在此基礎(chǔ)上,通過(guò)遍歷每一個(gè)類觀察字節(jié)碼文件獲取所有的方法信息和類信息進(jìn)行類繼承,實(shí)現(xiàn)關(guān)系的整合分析。通過(guò)獲得的信息,分別利用數(shù)據(jù)流分析、控制流分析和函數(shù)調(diào)用圖(CG)分析得到參數(shù)和返回值之間的關(guān)系、每個(gè)方法的可達(dá)分支、方法與子方法之間的參數(shù)對(duì)應(yīng)關(guān)系,最終生成控制流圖(CFG)。

    函數(shù)調(diào)用圖記錄的是同一個(gè)類中的函數(shù)傳播。擴(kuò)展的調(diào)用圖(ECG)包括跨過(guò)程的隱式流函數(shù)方法調(diào)用。在函數(shù)調(diào)用圖的基礎(chǔ)上,從已有的方法中匹配調(diào)用方法名和被調(diào)用方法名,生成新的調(diào)用關(guān)系以此全面地記錄方法調(diào)用。最終的整合圖如圖5所示。

    圖5 擴(kuò)展的調(diào)用圖Fig.5 Extended call graph

    2.2 污點(diǎn)傳播規(guī)則

    從靜態(tài)分析中已提取出全部的數(shù)據(jù)流、控制流、調(diào)用圖。從已有的3 個(gè)圖中提取頂點(diǎn),包括Source、Sink 和Chain。根據(jù)CFG 衍生出的ECG 得到圖傳播的邊,符號(hào)執(zhí)行提取的是一個(gè)Chain 到另一個(gè)Chain之間函數(shù)傳播(Function fi)的約束,約束的邊求解之后調(diào)用的下一個(gè)符合條件的Chain。使用符號(hào)執(zhí)行確定ECG 傳播過(guò)程中的約束規(guī)則。

    2.2.1 污點(diǎn)節(jié)點(diǎn)定義

    對(duì)于反序列化漏洞,一般是從重寫了readObject等方法的Source 開(kāi)始進(jìn)行相關(guān)的調(diào)用,經(jīng)過(guò)傳播節(jié)點(diǎn)Chain,最終調(diào)用到一些可能造成危害的Sink,如執(zhí)行命令、文件寫入等。Source 節(jié)點(diǎn)和Chain 節(jié)點(diǎn)都必須聲明序列化接口。

    常出現(xiàn)的讀取對(duì)象函數(shù)和代理函數(shù)的入口歸類為Source,一般是重寫讀入函數(shù)。Sink 函數(shù)的特征是調(diào)用命令的函數(shù),常見(jiàn)的Source和Sink 如表1 所示。

    表1 常見(jiàn)的Source 和SinkTable 1 Common Sources and Sinks

    2.2.2 污點(diǎn)傳播約束

    根據(jù)已有的數(shù)據(jù)流和調(diào)用圖標(biāo)記,獲取所有的數(shù)據(jù)流關(guān)系和方法調(diào)用關(guān)系。依據(jù)過(guò)程間調(diào)用規(guī)則生成類圖邊,邊滿足條件語(yǔ)句的約束和過(guò)程間傳播流的約束。對(duì)于路徑中的每個(gè)方法,從ECG 中獲取敏感變量,用符號(hào)執(zhí)行追蹤傳播鏈。

    約束傳播需要提取路徑的約束信息,以生成符合約束的對(duì)象,信息包括對(duì)象敏感信息和成員變量敏感信息,對(duì)象敏感信息為污點(diǎn)分析的調(diào)用函數(shù)建立正確的類,變量敏感信息為類方法中函數(shù)調(diào)用建立正確的參數(shù)。

    函數(shù)調(diào)用傳播類型分為過(guò)程間顯示流調(diào)用和過(guò)程間隱式流調(diào)用,分別在Chain 內(nèi)傳播和Chain 之間傳播,即類中調(diào)用是顯示流調(diào)用,類間調(diào)用是隱式流調(diào)用。過(guò)程間隱式流調(diào)用根據(jù)過(guò)程間的變量位置又分為2 種類型,分別是針對(duì)成員變量的直接賦值的調(diào)用和針對(duì)函數(shù)中變量的非直接賦值的調(diào)用。針對(duì)成員變量和參數(shù)的過(guò)程間傳播可以直接賦值,然而針對(duì)函數(shù)中變量非直接賦值的調(diào)用,不僅要滿足變量能夠遞歸傳播到調(diào)用點(diǎn)的條件,還必須滿足調(diào)用的對(duì)象擁有賦值函數(shù)的條件。

    ECG 傳播流程如下:

    其中:→代表顯示流傳播;->代表隱式流傳播。

    擴(kuò)展函數(shù)調(diào)用圖傳播流程如圖6 所示,其中,var1、var2 是A 類成員變量,可以直接賦值。根據(jù)“(Function)getterObj”表達(dá)式分析繼承關(guān)系,首先根據(jù)要實(shí)現(xiàn)Function 接口和序列化接口的條件找到GetterObj 類,然后發(fā) 現(xiàn)GeterObj 不 是A 類的成員變量,不能直接賦值,需要滿足GetterObj 類存在賦值函數(shù)的條件,最后發(fā)現(xiàn)Getterobj 是GetterSlot 類中的成員變量,GetterSlot 中存在賦值函數(shù),因此可以直接賦值。

    圖6 擴(kuò)展函數(shù)調(diào)用圖傳播流程Fig.6 Propagation procedure of extended function call graph

    根據(jù)以上分析給出以下約束規(guī)則:

    規(guī)則1污點(diǎn)傳播遞歸尋找隱式流傳播中object變量可賦值的類。

    規(guī)則2對(duì)類型限制的條件語(yǔ)句和對(duì)成員變量的值限制的條件語(yǔ)句進(jìn)行污點(diǎn)追蹤和約束。

    為了防止約束求解中的路徑爆炸,只對(duì)類型限制的條件語(yǔ)句和對(duì)成員變量的值限制的條件語(yǔ)句進(jìn)行污點(diǎn)追蹤和約束,根據(jù)規(guī)則生成約束的圖邊,記錄所有成員變量的過(guò)程間傳播條件,到達(dá)類間傳播的調(diào)用點(diǎn)時(shí)求解路徑約束,不滿足約束則無(wú)法傳播。

    2.3 污點(diǎn)傳播與驗(yàn)證

    過(guò)程間污點(diǎn)傳播過(guò)程如算法1 所示,構(gòu)造反序列化鏈從Source 點(diǎn)方法出發(fā),尋找該方法能污染的方法,并從本類的方法中繼續(xù)尋找下一個(gè)能污染的Chain,直到遇到Sink點(diǎn),污點(diǎn)以邊的形式傳播構(gòu)成圖,圖的邊根據(jù)調(diào)用規(guī)則生成,邊的約束根據(jù)規(guī)則生成。將污染傳遞規(guī)則作為邊限制的依據(jù),傳遞到有效的條件語(yǔ)句時(shí)會(huì)根據(jù)規(guī)則對(duì)需要遞歸遍歷的過(guò)程間對(duì)象變量進(jìn)行二次檢查,通過(guò)數(shù)據(jù)流檢查是否可以賦值。

    算法1過(guò)程間污點(diǎn)傳播算法

    動(dòng)態(tài)驗(yàn)證階段使用靜態(tài)分析的輸出,通過(guò)反射重構(gòu)具有與靜態(tài)分析中相同屬性的對(duì)象。從Chain 的調(diào)用點(diǎn)得到另一個(gè)調(diào)用點(diǎn)。從靜態(tài)分析路徑構(gòu)造對(duì)象的過(guò)程如算法2 所示,該過(guò)程以路徑作為輸入,從路徑末尾開(kāi)始反方向遍歷路徑實(shí)例化對(duì)象,每傳播到一個(gè)對(duì)象,為前一個(gè)變量實(shí)例化一個(gè)對(duì)象并將當(dāng)前對(duì)象加載到該字段,然后繼續(xù)遍歷路徑的其余對(duì)象將其實(shí)例化,最后從Source 開(kāi)始遍歷,使用動(dòng)態(tài)污點(diǎn)分析監(jiān)測(cè)能否調(diào)用到Sink,為Sink設(shè)置若干惡意類。

    算法 2對(duì)象構(gòu)造算法

    2.4 實(shí)現(xiàn)

    算法實(shí)現(xiàn)流程如圖7 所示,其中包括污點(diǎn)標(biāo)記模塊、污點(diǎn)傳播與驗(yàn)證模塊。

    圖7 算法實(shí)現(xiàn)流程Fig.7 Implementation procedure of the algorithm

    步驟1污點(diǎn)標(biāo)記

    使用ASM 讀取全部類和方法的信息,解析類的繼承關(guān)系、方法繼承關(guān)系、構(gòu)造類和方法的映射、條件語(yǔ)句等相關(guān)信息。模擬本地變量表和操作數(shù)棧的變化進(jìn)行污點(diǎn)傳播的追蹤,分為以下2 段:

    第1 段是方法內(nèi)的污點(diǎn)傳播,追蹤方法的入?yún)⒛芊裼绊懙椒椒ǚ祷亟Y(jié)果。通過(guò)在模擬的棧頂數(shù)據(jù)打標(biāo)記,并在訪問(wèn)字段和方法時(shí)根據(jù)規(guī)則判斷是否能夠傳播污點(diǎn),對(duì)棧頂數(shù)據(jù)使用打標(biāo)記或清空的方式來(lái)進(jìn)行污點(diǎn)傳播的分析。直到方法return 時(shí),取出棧頂返回?cái)?shù)據(jù)的污點(diǎn)標(biāo)記。

    第2 段是方法間的污點(diǎn)傳播,同樣采用模擬本地變量表和操作數(shù)棧的變化進(jìn)行污點(diǎn)追蹤,使用調(diào)用者的入?yún)⑺饕鳛槲埸c(diǎn),傳播至被調(diào)用者入?yún)r(shí),其可以影響到下一個(gè)方法的調(diào)用。

    將上述信息保存為類圖數(shù)據(jù),保存到Neo4j 數(shù)據(jù)庫(kù)中。

    步驟2污點(diǎn)傳播與驗(yàn)證

    依據(jù)傳播規(guī)則構(gòu)造反序列化鏈從Source 點(diǎn)方法出發(fā),根據(jù)污點(diǎn)傳播規(guī)則利用深度遍歷傳播,深度遍歷過(guò)程中判斷隱式流的傳播對(duì)象是否可控。在傳播過(guò)程中遇到約束時(shí)使用驗(yàn)證模塊,直到遇到Sink 點(diǎn)。類圖1->類圖2->類圖3 正向遍歷直到類圖N。類圖之間的約束根據(jù)以下約束獲得:

    約束1根據(jù)數(shù)據(jù)流分析。判斷隱式流的調(diào)用對(duì)象與其參數(shù)是否可以寫入。若不能直接寫入,根據(jù)數(shù)據(jù)流的參數(shù)流動(dòng)遞歸,直到找到可以直接賦值函數(shù)的可疑類為止。接下來(lái)從數(shù)據(jù)流中提取出可疑類及其參數(shù)的父子樹(shù),通過(guò)數(shù)據(jù)流分析得到繼承關(guān)系,分析父子關(guān)系是否成立,其中包含對(duì)接口的判斷。

    約束2抓取顯示流信息。針對(duì)過(guò)程間傳播變量提取當(dāng)前Chain 中的類型判斷指令的字節(jié)碼,使用Z3 斷言對(duì)約束1 中生成的可疑過(guò)程間對(duì)象判斷。

    將上述約束中的變量表示為Z3-API[26]可以求解的內(nèi)容,將object 表示為object.tostring,其成員變量表示為object.attribute.toString。結(jié)合約束1 和約束2從Neo4j數(shù)據(jù)庫(kù)中獲取ECG 信息,求得下一個(gè)調(diào)用的類。Z3 求解采用惰性計(jì)算的形式,符號(hào)表達(dá)式約束在顯示流傳播中關(guān)聯(lián)并保存,在隱式流傳播時(shí)計(jì)算求解。完整的傳播完成后根據(jù)符號(hào)執(zhí)行的路徑記錄還原object 源,動(dòng)態(tài)分析驗(yàn)證路徑的有效性。根據(jù)約束信息返回對(duì)象和成員變量的值,反射構(gòu)造反序列化類驗(yàn)證從Source 到Sink 的路徑,生成測(cè)試用例。

    3 實(shí)驗(yàn)

    3.1 實(shí)驗(yàn)環(huán)境與結(jié)果分析

    本文選 用1 臺(tái)基于Inter?CoreTMi7-6700H CPU 2.6 GHz 處理器、內(nèi)存8 GB 的主機(jī)進(jìn)行實(shí)驗(yàn),系統(tǒng)為64 位Windows 10。

    實(shí)驗(yàn)選取12 個(gè)包含反序列化漏洞的Java 庫(kù),如表2 所示,其中包括commons-collections-3.2.1、commonscollections-4.0、rome-1.0、groovy-2.3.9 等。實(shí)驗(yàn)工 具包括Taint Gadget、Gadget Inspector 以 及Threedr3am 改進(jìn)后的T-Gadget Inspector,將3 種工具對(duì)于這12 種Java 庫(kù)的反序列化漏洞調(diào)用鏈的檢測(cè)情況進(jìn)行對(duì)比,檢查反序列化漏洞調(diào)用鏈?zhǔn)欠裼行А?/p>

    表2 ysoserial 數(shù)據(jù)集Table 2 ysoserial dataset 單位:個(gè)

    對(duì)3 個(gè)工具檢測(cè)的命中率、漏報(bào)率和時(shí)間進(jìn)行統(tǒng)計(jì),如表3 所示,可以看出:Taint Gadget 對(duì)于反序列化漏洞調(diào)用鏈的檢測(cè)命中率平均為70.6%,效果優(yōu)于T-Gadget Inspector 的23.2% 和Gadget Inspector 的8.5%;Taint Gadget 對(duì)于反序列化漏洞調(diào)用鏈的挖掘漏報(bào)率平均約為4.1%,效果優(yōu)于T-Gadget Inspector 的35% 和Gadget Inspector 的80.2%;Taint Gadget 對(duì)于不同Java 基礎(chǔ)庫(kù)的測(cè)試時(shí)間較為穩(wěn)定,其平均時(shí)間約為 78.4 s,T-Gadget Inspector 平均時(shí) 間約為74.3 s,Gadget Inspector 的平均時(shí)間約為68.7 s。Taint Gadget 消耗更多時(shí)間的原因是路徑約束消耗了更多的系統(tǒng)資源。

    表3 靜態(tài)數(shù)據(jù)對(duì)比Table 3 Static data comparison

    根據(jù)符號(hào)執(zhí)行的求解結(jié)果,利用動(dòng)態(tài)方法構(gòu)造到達(dá)Sink 的對(duì)象組成路徑,與基于動(dòng)靜態(tài)結(jié)合的工具Serhybrid 動(dòng)態(tài)運(yùn)行對(duì)比結(jié)果如表4 所示,其中,TPs 代表路徑存在的數(shù)量,F(xiàn)Ps 代表失敗路徑不存在的數(shù)量。可以看出:Taint Gadget 的動(dòng)態(tài)檢出率平均為90.6%;Serhybridpub 的動(dòng)態(tài)檢出率平均28.5%;Taint Gadget 的動(dòng)態(tài)運(yùn)行時(shí)間約為20.8 s;Serhybridpub 的平均動(dòng)態(tài)運(yùn)行時(shí)間約為1 734.3 s。因?yàn)镾erhybridpub 采用的是非定向的模糊測(cè)試方法,所以時(shí)間消耗遠(yuǎn)超本文的方法,可見(jiàn)本文的動(dòng)態(tài)檢出率和時(shí)間性能都好于Serhybridpub。cc3 中有2 條鏈沒(méi)有檢測(cè)出的原因是沒(méi)有對(duì)動(dòng)態(tài)代理做出約束,groovy 和mozilia 各有一條鏈沒(méi)有檢測(cè)出的原因是路徑的條件過(guò)于苛刻。

    表4 動(dòng)態(tài)數(shù)據(jù)對(duì)比Table 4 Dynamic data comparison

    3.2 CC2 鏈路的傳播過(guò)程分析

    下面將介紹針對(duì)commons-collections4-4.0.jar 包中CC2 反序列化漏洞鏈路進(jìn)行復(fù)現(xiàn)的過(guò)程。首先從靜態(tài)分析的Source 結(jié)果中搜索到有入口函數(shù)readObject 的類PriorityQueue,然后通過(guò)污點(diǎn)分析找到類間傳播的調(diào)用點(diǎn),記錄類中傳播的條件語(yǔ)句,到調(diào)用點(diǎn)根據(jù)約束生成對(duì)象,對(duì)象的成員變量滿足路徑條件。約束求解過(guò)程如圖8 所示。

    圖8 污點(diǎn)分析過(guò)程Fig.8 Process of taint analysis

    根據(jù)路徑條件約束,comparator.compare 是第1 個(gè)隱式 傳播調(diào)用點(diǎn),tansformer.transform 是 第2 個(gè)隱式傳播調(diào)用點(diǎn),method.invoke 是危險(xiǎn)函數(shù)調(diào)用點(diǎn),可以調(diào)用惡意類TeamplatesImpl。記錄類中的路徑約束直到調(diào)用點(diǎn)求解,分別得到PriorityQueue、TransformingComparator、InvokerTransformer 的過(guò)程間傳播約束條件,對(duì)約束求解構(gòu)造3 個(gè)對(duì)象。

    Priority Queue 的初始化需要反射設(shè)置成員變量size、comparator、queue。根據(jù)約束求解的結(jié)果構(gòu)造對(duì) 象Priority Queue,將size 反射設(shè)置為2,將comparator 反射設(shè)置為Transforming Comparator,Tranfroming Comparator 初始化需要將成員變量comparator 設(shè)置為InvokerTransforming,反射創(chuàng) 建Invoker Transformer 對(duì)象,最終成功地將Priority Queue 構(gòu)造為 Priority Queue(2,new Transforming Comparator(Invoker Transforming))。size、comparator 只依賴Priority Queue 中的約 束就可以求解,但queue 的求解還需要依賴Transforming Comparator、Invoker Transformer 中的過(guò) 程間傳 播約束,根據(jù)約束求解的結(jié)果最終設(shè)置queue[0]為惡意類TemplatesImpl。最后生成測(cè)試用例,監(jiān)視對(duì)象Priority Queue 的readObject 方法是否能調(diào)用到惡意類。

    Taint Gadget的靜態(tài)檢測(cè)過(guò)程與T-Gadget Inspector和Gadget Inspector 的區(qū)別體現(xiàn)在靜態(tài)分析、約束條件、污點(diǎn)傳播等3 個(gè)方面。首先,Taint Gadget 靜態(tài)分析過(guò)程中比其他2 種工具多收集了成員變量信息,方法中的參數(shù)傳播信息和條件語(yǔ)句,為約束條件和污點(diǎn)傳播提供條件;其次,Taint Gadget 基于條件語(yǔ)句生成約束條件,其他2 種工具沒(méi)有記錄條件語(yǔ)句,導(dǎo)致沒(méi)有生成約束,所以會(huì)記錄不存在的鏈路,造成路徑爆炸,導(dǎo)致命中率較低;最后,Taint Gadget 污點(diǎn)傳播采用過(guò)程間傳播分析,準(zhǔn)確記錄了類的變量傳播,提高了傳播精度。其他2 種工具采用的是過(guò)程內(nèi)傳播分析方法,只記錄函數(shù)的調(diào)用關(guān)系,不記錄調(diào)用關(guān)系所需的變量信息是否符合調(diào)用要求,丟失污點(diǎn)傳播精度,導(dǎo)致誤報(bào)率較高。

    Taint Gadget 的動(dòng)態(tài)驗(yàn)證過(guò)程與Serhybridpub 的區(qū)別是Serhybridpub 使用Randoop 進(jìn)行模糊測(cè)試,通過(guò)隨機(jī)輸入變量值測(cè)試到達(dá)危險(xiǎn)函數(shù),因此對(duì)類成員變量信息不敏感。如圖8 所示,Taint Gadget 在靜態(tài)的約束求解過(guò)程中已經(jīng)求解出構(gòu)造對(duì)象所需的類成員變量信息。相對(duì)而言,Taint Gadget 對(duì)類成員信息敏感,針對(duì)性更強(qiáng),省去了模糊測(cè)試的時(shí)間。

    4 結(jié)束語(yǔ)

    本文利用符號(hào)執(zhí)行和污點(diǎn)分析技術(shù),針對(duì)污點(diǎn)傳播描述規(guī)則提出約束,實(shí)現(xiàn)Java 反序列化漏洞檢測(cè)和驗(yàn)證工具Taint Gadget。實(shí)驗(yàn)結(jié)果表明,Taint Gadget 在命中率和漏報(bào)率方面性能優(yōu)于現(xiàn)有的工具Gadget Inspector 和T-Gadget Inspector,且沒(méi)有消耗太多的時(shí)間,Taint Gadget 的動(dòng)態(tài)性能也好于Serhybridpub。本文沒(méi)有構(gòu)建動(dòng)態(tài)代理約束,下一步工作將針對(duì)動(dòng)態(tài)代理特性進(jìn)行約束構(gòu)建和求解。

    猜你喜歡
    污點(diǎn)序列化調(diào)用
    基于代碼重寫的動(dòng)態(tài)污點(diǎn)分析
    如何建構(gòu)序列化閱讀教學(xué)
    甘肅教育(2020年14期)2020-09-11 07:58:36
    核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
    LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
    使用Lightroom污點(diǎn)去除工具清理照片中的瑕疵
    基于系統(tǒng)調(diào)用的惡意軟件檢測(cè)技術(shù)研究
    Java 反序列化漏洞研究
    我國(guó)“污點(diǎn)證人”刑事責(zé)任豁免制度的構(gòu)建
    作文訓(xùn)練微格化、序列化初探
    利用RFC技術(shù)實(shí)現(xiàn)SAP系統(tǒng)接口通信
    乌兰县| 扶余县| 连平县| 聂荣县| 曲松县| 宁远县| 呼伦贝尔市| 格尔木市| 舟曲县| 宁都县| 灌云县| 阳东县| 德清县| 察隅县| 乌海市| 安达市| 庆云县| 安乡县| 宣汉县| 民勤县| 邮箱| 安新县| 义乌市| 古丈县| 自治县| 岫岩| 黎城县| 南涧| 容城县| 会东县| 凭祥市| 沅江市| 濮阳县| 诸城市| 黄浦区| 五原县| 沙雅县| 重庆市| 遵义县| 塔城市| 靖西县|