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