■文/內(nèi)蒙古能源發(fā)電投資集團(tuán)有限公司電力工程技術(shù)研究院 鮑 靜
Java語言的程序漏洞檢測(cè)與診斷技術(shù)應(yīng)用研究
■文/內(nèi)蒙古能源發(fā)電投資集團(tuán)有限公司電力工程技術(shù)研究院 鮑 靜
Java語言是安卓平臺(tái)的程序設(shè)計(jì)語言,隨著安卓系統(tǒng)的普及,Java語言在移動(dòng)終端占據(jù)的份額越來越大,由此促使Java語言得到快速的發(fā)展,與此同時(shí),Java程序的管理和維護(hù)難度也逐漸增加。Java語言中存在的程序漏洞為用戶帶來非常大的威脅,檢測(cè)與診斷是有效排除程序漏洞的手段,從而保證用戶的使用安全。本文重點(diǎn)研究了Java語言的程序漏洞檢測(cè)與診斷技術(shù)應(yīng)用。
Java語言 程序漏洞 檢測(cè) 診斷
Java語言是一種編程語言,以C、C++語言為基礎(chǔ),具備C、C++語言的多數(shù)優(yōu)點(diǎn),同時(shí),對(duì)其中存在的含混部分進(jìn)行了改良,促使Java語言應(yīng)有獨(dú)特的特點(diǎn)。目前,在PC軟件、手機(jī)軟件中應(yīng)有的比較廣泛。但Java語言中存在程序功能性漏洞、程序安全性漏洞,影響用戶的使用,因此,在應(yīng)用Java語言的過程中,還需利用檢測(cè)與診斷技術(shù)排除潛在的程序漏洞,保證開發(fā)出來的程序滿足用戶要求的同時(shí),具有比較高的安全性。
程序員在編寫程序時(shí),高效并發(fā)程序的編寫一直是一個(gè)難題,主要原因的并發(fā)程序運(yùn)行時(shí),存在不確定性,稱之為并發(fā)錯(cuò)誤[1]。并發(fā)錯(cuò)誤的診斷難度比較大,程序的輸入和運(yùn)行環(huán)境以及線程交叉訪問同一內(nèi)存單元的順序均可決定并發(fā)錯(cuò)誤發(fā)生與否。并發(fā)錯(cuò)誤發(fā)生后,數(shù)據(jù)會(huì)出現(xiàn)丟失,甚至導(dǎo)致系統(tǒng)崩潰。確定性重現(xiàn)系統(tǒng)可有效地解決并發(fā)錯(cuò)誤的問題,因此,Java語言在進(jìn)行程序漏洞診斷時(shí),可利用此系統(tǒng)檢測(cè)并發(fā)錯(cuò)誤。
(一)確定性重現(xiàn)設(shè)計(jì)
Java語言具有垃圾回收的功能,在Java虛擬機(jī)中,垃圾回收屬于一件不確定性事件,因此,確定性重現(xiàn)系統(tǒng)會(huì)受此功能的影響,基于此,在進(jìn)行確定性重現(xiàn)設(shè)計(jì)時(shí),以對(duì)象為中心,記錄和重現(xiàn)Java并發(fā)程序。在多線程程序中,并發(fā)數(shù)據(jù)訪問屬于不確定事件,會(huì)導(dǎo)致程序錯(cuò)誤,Java程序通常會(huì)將數(shù)據(jù)組織起來形成對(duì)象。ORDER在進(jìn)行記錄時(shí),有沖突的數(shù)據(jù)訪問對(duì)和對(duì)象的訪問時(shí)序信息為記錄內(nèi)容,在當(dāng)前線程訪問次數(shù)中,數(shù)據(jù)訪問在信息的指導(dǎo)下進(jìn)行重現(xiàn)。在對(duì)對(duì)象的訪問時(shí)序信息記錄時(shí),將對(duì)象標(biāo)識(shí)符、訪問線程標(biāo)識(shí)符、對(duì)象鎖以及讀寫標(biāo)志添加到對(duì)象頭部結(jié)構(gòu)中[2]。并發(fā)Java程序運(yùn)行時(shí),時(shí)間軸信息的記錄由ORDER的記錄模式進(jìn)行,首先延續(xù)上個(gè)時(shí)間片,當(dāng)時(shí)間發(fā)生變化時(shí),新的時(shí)間片開啟,記錄完成之后,時(shí)間軸終止。當(dāng)出現(xiàn)當(dāng)前時(shí)間片未結(jié)束、當(dāng)前時(shí)間片結(jié)束,切換時(shí)間片、掛起線程重新獲得訪問權(quán)情況時(shí),ORDER模式將重現(xiàn)日志中的記錄信息,從而將Java程序訪問共享對(duì)象的順序重現(xiàn)出來。隨后,將Java虛擬機(jī)中的其他不確定事件記錄下來,時(shí)間軸記錄優(yōu)化之后,完成確定性重現(xiàn)設(shè)計(jì)。
(二)在ORDER系統(tǒng)的實(shí)現(xiàn)
ORDER系統(tǒng)的構(gòu)建以確定性重現(xiàn)設(shè)計(jì)為基礎(chǔ),設(shè)計(jì)完成之后,需要進(jìn)行實(shí)現(xiàn),以便于為確定性重現(xiàn)提供良好的支持。在實(shí)現(xiàn)過程中,首先要對(duì)Harmony編譯流水線進(jìn)行修改,Harmony在對(duì)方法的編譯配置進(jìn)行管理時(shí),通過流水線的方式來進(jìn)行,在流水線中,包含一系列的行為,每個(gè)行為代表會(huì)分析會(huì)優(yōu)化方法,插裝過程在記錄和重現(xiàn)時(shí),采用兩個(gè)單獨(dú)的行為來實(shí)現(xiàn),當(dāng)頻繁的調(diào)用一個(gè)方法時(shí),Harmony會(huì)對(duì)方法進(jìn)行重新編譯,并利用更激進(jìn)的流水線來進(jìn)行管理,自適應(yīng)性編譯選項(xiàng)的開啟與否只會(huì)對(duì)Java應(yīng)用程序的性能產(chǎn)生影響,錯(cuò)誤可重現(xiàn)性并不會(huì)受到任何的影響,因此,在ORDER原型框架中,自適應(yīng)性編譯選項(xiàng)處于關(guān)閉的狀態(tài),編譯程序時(shí)采用單個(gè)的流水線,通過常量折疊、不可達(dá)代碼刪除等優(yōu)化措施,將實(shí)現(xiàn)過程的工程性開銷減少[3];其次要在Harmony中記錄垃圾回收事件,記錄時(shí),垃圾回收機(jī)制的活動(dòng)并不被記錄,而是對(duì)垃圾回收線程與Java線程之間交互的接口進(jìn)行記錄;最后是與Java虛擬機(jī)本地代碼交互,在Harmony中,當(dāng)處于函數(shù)調(diào)用點(diǎn)或特定的系統(tǒng)調(diào)用時(shí),才能夠激活可被阻塞狀態(tài),Java線程工作時(shí),如果與記錄的對(duì)象訪問時(shí)間軸不符合時(shí),該線程即會(huì)被阻塞,當(dāng)超過一定的閾值之后,棧幀信息會(huì)被準(zhǔn)備好,可阻塞狀態(tài)打開,Java線程進(jìn)入此狀態(tài)后,別的線程可輕易的將其掛起。當(dāng)Java線程恢復(fù)到與記錄的時(shí)間軸相符合時(shí),被阻塞狀態(tài)停止,Java線程可正常運(yùn)行。
現(xiàn)如今,人們?cè)絹碓街匾旿ava軟件安全性與正確性的問題,因此,在計(jì)算機(jī)系統(tǒng)研究領(lǐng)域,如何檢測(cè)Java中存在的程序漏洞成為研究的重點(diǎn)問題。符號(hào)化執(zhí)行的搜索能力非常強(qiáng)大,由此促使其廣泛的應(yīng)用到軟件的安全性與正確性檢測(cè)方法中。
(一)導(dǎo)向性符號(hào)化執(zhí)行技術(shù)
安卓運(yùn)用過程中,存在輸入空間爆炸問題,影響安卓的運(yùn)用,為了解決這個(gè)問題,提出了導(dǎo)向性符號(hào)化執(zhí)行技術(shù)。符號(hào)化執(zhí)行時(shí),需要應(yīng)用“導(dǎo)引”信息,該信息采用靜態(tài)分析的手段來進(jìn)行提取,同時(shí),在進(jìn)行符號(hào)化執(zhí)行的搜索時(shí),同樣需要此信息。以隱私泄露為例,分析導(dǎo)向性符號(hào)執(zhí)行的原理。在導(dǎo)向性符號(hào)化執(zhí)行的整體架構(gòu)中,通過兩個(gè)階段來實(shí)現(xiàn)執(zhí)行,首先是提取導(dǎo)引信息,以靜態(tài)程序分析手段,通過數(shù)據(jù)流分析的方法,將與目標(biāo)程序漏洞相關(guān)的程序語句提取出來,而這些從程序語句就屬于導(dǎo)引信息,一是將事件的入口找出,以逆向遍歷函數(shù)函數(shù)調(diào)用圖的方式將關(guān)鍵路徑中的入口序列提取出來,二是對(duì)上下文的信息進(jìn)行提取,三是合并上下文敏感的狀態(tài),將事件序列中的冗余時(shí)間有效的合并,四是在狀態(tài)機(jī)上尋找觸發(fā)事件的最短路徑,將需要重現(xiàn)的事件序列列出來,執(zhí)行只需觸發(fā)的事件[4];其次是使用導(dǎo)引信息引導(dǎo)符號(hào)化執(zhí)行,導(dǎo)引信息提取完成之后,需要限定目標(biāo)程序的搜索空間,在狀態(tài)遷移信息和圖形界面信息的基礎(chǔ)上,重現(xiàn)出已經(jīng)提取的事件序列,符號(hào)化的執(zhí)行包含兩個(gè)步驟,一是指導(dǎo)程序狀態(tài)遷移,程序狀態(tài)改變之后,通過事先設(shè)置好的回調(diào)函數(shù),對(duì)狀態(tài)遷移事件進(jìn)行處理,二是指導(dǎo)圖形界面事件,在上個(gè)步驟的基礎(chǔ)上,將給定的程序狀態(tài)重現(xiàn),并將靜態(tài)分析中的圖像界面事件重現(xiàn),從而將給定的關(guān)鍵程序路徑覆蓋。
(二)在Sym Droid系統(tǒng)的實(shí)現(xiàn)
在Soot程序分析框架、JPF-SE符號(hào)化執(zhí)行框架的基礎(chǔ)上,實(shí)現(xiàn)Sym Droid原型系統(tǒng)。靜態(tài)分析過程中,事件觸發(fā)順序依據(jù)修改Soot分析工具進(jìn)行有效提取,從而將函數(shù)調(diào)用圖構(gòu)建方法和指針分析方法提取出來,以便于完成導(dǎo)引信息的提取。在此之前,還對(duì)安卓程序的dex字節(jié)碼進(jìn)行轉(zhuǎn)化,通過安卓程序反編譯工具,轉(zhuǎn)換為Java字節(jié)碼,保證Soot分析的正確性[5]。在修改JPF-SE符號(hào)化執(zhí)行框架的基礎(chǔ)上,將導(dǎo)引信息的事件重現(xiàn)過程導(dǎo)入,經(jīng)過處理之后進(jìn)行符號(hào)化執(zhí)行。在安卓系統(tǒng)中,采用的圖形界面模型為單線程,通過此模型的特性,Sym Driod歸結(jié)了圖形界面線程與非圖形界面線程,具體包含三種情況,一是當(dāng)圖形界面主線程生成子線程處理部分程序邏輯時(shí),符號(hào)化的執(zhí)行不再主線程中的進(jìn)行,而是轉(zhuǎn)移到子線程中,子線程終止或被掛起后,再次返回;二是圖形界面線程接收到非圖形界面線程的消息,并將此作為處理結(jié)果返回主線程時(shí),這些消息將會(huì)被系統(tǒng)丟棄;三是非圖形界面線程將會(huì)事件發(fā)送給圖形界面線程,以便于返回執(zhí)行界面時(shí),所產(chǎn)生的信息將會(huì)被系統(tǒng)在全局的事件池中進(jìn)行緩存。
隨著智能終端系統(tǒng)的普及,人們?cè)絹碓疥P(guān)注手機(jī)軟件的安全漏洞問題。在手機(jī)軟件存在的安全漏洞中,信息泄露對(duì)手機(jī)用戶的危害最為嚴(yán)重,據(jù)相關(guān)的調(diào)查顯示,超過半數(shù)的官方安卓市場(chǎng)軟件存在不同程度的信息泄露問題。導(dǎo)向性符號(hào)化執(zhí)行技術(shù)是信息泄露檢測(cè)診斷中的有效手段,可良好的對(duì)存在的漏洞進(jìn)行驗(yàn)證。
(一)在Leak Miner系統(tǒng)的實(shí)現(xiàn)
對(duì)于手機(jī)軟件中潛在的信息泄露,Leak Miner系統(tǒng)可依據(jù)以下步驟對(duì)其程序進(jìn)行檢測(cè):第一,預(yù)處理過程,在手機(jī)平臺(tái)上,硬件資源比較有限,為了滿足軟件占據(jù)空間小的要求,在開發(fā)軟件時(shí),采用Java語言,但字節(jié)碼的格式為dex,分析之前,首先將其轉(zhuǎn)換為Java字節(jié)碼,接著在進(jìn)行分析,此外,還需要將權(quán)限申請(qǐng)信息在程序元信息中提取出來,獲得權(quán)限列表[6];第二,構(gòu)建函數(shù)調(diào)用圖,在安裝程序中,統(tǒng)一的程序入口并不具備,而是采用事件驅(qū)動(dòng)模式,對(duì)此,將程序中可能的入口全部提取出來,通過額外的程序入口創(chuàng)建之后,連接所有程序入口及偽入口,變成統(tǒng)一的程序入口;第三,標(biāo)記敏感信息,通過預(yù)設(shè)的系統(tǒng)接口,將系統(tǒng)的敏感信息讀取出來;第四,敏感信息傳播,針對(duì)獲取的敏感信息,將其可能傳播的路徑采用靜態(tài)分析方法分析出來,并將其上傳到網(wǎng)絡(luò)或是記錄在本地日志中,用戶在進(jìn)行相應(yīng)的操作時(shí),給用戶提示,預(yù)防信息泄露[7]。
(二)信息泄露檢測(cè)方法
在安卓系統(tǒng)系統(tǒng),包含的用戶信息比較多,Leak Miner系統(tǒng)將手機(jī)的設(shè)備標(biāo)識(shí)號(hào)、用戶位置信息、手機(jī)號(hào)碼、通訊錄、短信及日歷作為隱私信息[8]。針對(duì)這些隱私信息,將其泄露路徑分析出來,運(yùn)用的分析方法為函數(shù)調(diào)用圖構(gòu)建和指針分析,首先構(gòu)建函數(shù)調(diào)用圖,將安卓各組件代碼輸入之后,獲取函數(shù)調(diào)用圖,隨后對(duì)變量指向關(guān)系進(jìn)行分析,輸入的信息為當(dāng)前函數(shù)的語句集合,經(jīng)過相應(yīng)的處理之后,函數(shù)變量之間的指向關(guān)系就可以有效的分析出來,分析完成后,生成函數(shù)的索引信息。接著利用程序切片和敏感信息傳播將信息泄露的路徑尋找出來,最后對(duì)信息泄露路徑進(jìn)行有效地處理。
結(jié)論:現(xiàn)如今,Java語言在安卓平臺(tái)及服務(wù)器端的應(yīng)用越來越廣泛,在應(yīng)用Java語言的過程中,由于程序漏洞的存在,導(dǎo)致安全性受到比較大的影響,現(xiàn)有的檢測(cè)和診斷方法還存在一定的缺點(diǎn),經(jīng)過確定性重現(xiàn)技術(shù)、符號(hào)化執(zhí)行技術(shù)解決之后,可以有效地避免這些缺點(diǎn),提升檢測(cè)和診斷的正確性,從而有效地保證基于Java語言的軟件開發(fā)具有良好的安全性,避免給用戶造成巨大的損失。
[1]孫鵬.基于計(jì)算機(jī)軟件開發(fā)的JAVA編程語言分析[J].電子制作,2015,(10):94.
[2]陳偉,黃翔,喬曉強(qiáng)等.軟件配置錯(cuò)誤診斷與修復(fù)技術(shù)研究[J].軟件學(xué)報(bào),2015,(06):1285-1305.
[3]羅琴靈,蔣朝惠.多策略軟件代碼缺陷檢測(cè)方法研究[J].貴州大學(xué)學(xué)報(bào)(自然科學(xué)版),2015,(03):113-118.
[4]練坤梅,許靜,田偉等.SQL注入漏洞多等級(jí)檢測(cè)方法研究[J].計(jì)算機(jī)科學(xué)與探索,2011,(05):474-480.
[5]傅卓軍,龍陳鋒.網(wǎng)絡(luò)安全漏洞檢測(cè)軟件的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)與數(shù)字工程,2011,(07):117-119+192.
[6]孫浩,李會(huì)朋,曾慶凱.基于信息流的整數(shù)漏洞插裝和驗(yàn)證[J].軟件學(xué)報(bào),2013,(12):2767-2781.
[7]王一嵐,郭嵩.基于靜態(tài)分析的Java源代碼后門檢測(cè)技術(shù)研究[J].信息網(wǎng)絡(luò)安全,2012,(07):43-45.
[8]李正明.java技術(shù)在設(shè)備遠(yuǎn)程監(jiān)測(cè)診斷系統(tǒng)的應(yīng)用研究[J].科技創(chuàng)新與應(yīng)用,2012,(32):64.