專利名稱:基于程序切片技術(shù)的Web服務(wù)安全分析方法
技術(shù)領(lǐng)域:
本發(fā)明給出了一種基于程序切片技術(shù)的Web服務(wù)安全分析方案,主要分析Java語言開發(fā)的Web服務(wù)源代碼中可能存在的安全漏洞,并對漏洞進行修復(fù),屬于Web服務(wù)安全的領(lǐng)域。
背景技術(shù):
隨著Internet的迅速發(fā)展,大量網(wǎng)絡(luò)應(yīng)用體系結(jié)構(gòu)應(yīng)運而生,主要可分為B/S(Browser/Server)結(jié)構(gòu)的純Web應(yīng)用方式和傳統(tǒng)桌面程序的分布式應(yīng)用。這些體系在當前都得到了大量的應(yīng)用,并取得了較大的成功。Web服務(wù)使應(yīng)用程序的集成比以前更快、更容易而且更便宜。Web服務(wù)集成在協(xié)議棧中較高層,可以實現(xiàn)業(yè)務(wù)功能的松散集成。很多企業(yè)之間和企業(yè)內(nèi)部都可以通過Web來連接業(yè)務(wù)。企業(yè)內(nèi)外都可以使用一致化編程模型的方法,通過基礎(chǔ)設(shè)施并以ー種通用的方法進行應(yīng)用程序集成。在利用現(xiàn)有的語言和平臺以及舊應(yīng)用程序的情況下,可以以ー種增量的方式來集成和應(yīng)用Web服務(wù)。引領(lǐng)業(yè)界的許多公司,例如IBM、Microsoft以及Sun公司等,都支持Web服務(wù),他們不僅在市場上推廣Web服務(wù),而且還各自開發(fā)和發(fā)布了自己的Web服務(wù)產(chǎn)品。此外,現(xiàn)有的許多工程應(yīng)用類的產(chǎn)品都將Web服務(wù)的功能集成到它們的特征集中,這就意味著我們現(xiàn)在擁有大量的Web服務(wù)平臺和可供利用的Web服務(wù)開發(fā)工具。隨著Web服務(wù)的大規(guī)模使用,其安全問題卻日益凸顯。自從1988年的Morris病毒襲擊應(yīng)用程序以來,應(yīng)用程序中存在的安全問題就呈幾何級數(shù)增長,特別是近年來,隨著Web 2.0的普及,互聯(lián)網(wǎng)應(yīng)用中的安全問題也越來越多,導致的損失也日益巨大。因此不管是從經(jīng)濟角度還是安全角度來考慮,怎樣消除應(yīng)用程序中存在的安全問題已經(jīng)成為業(yè)界關(guān)注的重要課題。一般情況下,可以針對軟件開發(fā)過程的不同階段,包括需求分析、設(shè)計、編碼、測試、維護等階段,分別添加安全措施來減少軟件中的安全問題,此過程有助于軟件抵御外部惡意攻擊。Web服務(wù)作為一種網(wǎng)絡(luò)應(yīng)用軟件,構(gòu)建在XML(Extensible Markup Language,可擴展標記語言)基礎(chǔ)之上,提供了ー種面向服務(wù)的架構(gòu)(Services Oriented Architecture,簡稱S0A)。在ー個分布式的計算環(huán)境中,Web服務(wù)器動態(tài)地描述、發(fā)布、發(fā)現(xiàn)和調(diào)用Web服務(wù)。隨著Web服務(wù)普及程度越來越高,越來越多的攻擊者將注意力都放到了對Web服務(wù)及服務(wù)器的攻擊方面。攻擊目的主要是試圖惡意訪問數(shù)據(jù)或者服務(wù)。Web服務(wù)安全問題引起了企業(yè)的注意,企業(yè)關(guān)注如何構(gòu)建安全方案來保障企業(yè)間的Web服務(wù)的安全數(shù)據(jù)傳輸;研究如何既提高數(shù)據(jù)交互效率,又能提高安全性能。在保護Web服務(wù)的安全性方面,可以利用一些已經(jīng)成熟的安全技術(shù)來實現(xiàn),如基于防火墻的保護、使用SSL(Secure Sockets Layer,安全套接字層)、使用VPN(Virtual Private Network,虛擬私有網(wǎng)絡(luò))等。對于已經(jīng)發(fā)布的Web服務(wù),考慮到外部用戶的攻擊,可以設(shè)計入侵檢測系統(tǒng)對外部用戶身份進行驗證;對于尚未發(fā)布的Web服務(wù),可以考慮分析Web服務(wù)的源碼,分析安全漏洞及它的傳播與擴散情況,并采取相應(yīng)的解決方案,達到增強安全性的目的。
Web服務(wù)被設(shè)計成能夠通過防火墻的一種應(yīng)用,這就導致Web服務(wù)暴露了更多的功能接口。Web服務(wù)允許連接不同的應(yīng)用程序,使得Web服務(wù)面臨很多的威脅和攻擊,而且通常在一個Web服務(wù)的源代碼中的許多接口可能有一些是其他一些重要接口的輔助函數(shù),也可能是一些只能被Web服務(wù)管理員調(diào)用的一些重要接口。對于是輔助函數(shù)的接口,如果將其發(fā)布出去,不會造成嚴重的后果,但是如果將一些只能被管理員調(diào)用的重要接口發(fā)布出來,那么就是一個嚴重的Web服務(wù)安全漏洞。如果該接口被攻擊者惡意使用,那么就會造成嚴重的后果。在實際發(fā)布的過程中,發(fā)布者往往使用一些工具直接對Web服務(wù)源代碼進行發(fā)布,缺少必要的對待發(fā)布的Web服務(wù)源代碼進行檢測分析的過程,如果這些服務(wù)代碼中就存在上述說的有安全漏洞的接口,發(fā)布這些接口就會產(chǎn)生安全漏洞,就會被攻擊者利用。這樣的安全問題往往難以被察覺,因此對于一個達到功能要求的Web服務(wù)來說,往往可能他的可靠性并沒有達到設(shè)計者的要求。盡管Web服務(wù)發(fā)展很迅速,但是傳統(tǒng)的一些Web服務(wù)安全技術(shù)并不能有效地保證Web服務(wù)的安全性,這阻礙了 Web服務(wù)更進一步的發(fā)展。傳統(tǒng)的技術(shù)只是在Web服務(wù)發(fā)布以后進行一些保護措施,而實際上引發(fā)Web服務(wù)安全的漏洞并沒有徹底被解決,存在安全漏洞的接口仍然暴露給用戶,只是通過其他方法使得用戶暫時不能訪問,如果攻擊者通過其他一些方法間接調(diào)用了存在安全漏洞的接口,同樣可以對Web服務(wù)進行破壞。因此,需要在根源上對Web服務(wù)進行安全分析檢測。由于Web服務(wù)的安全問題日益凸顯,因此很多研究學者也對Web服務(wù)安全進入了深入的研究,提出了許多不同的方法,對Web服務(wù)各個層次的安全都進行了研究,包括Web服務(wù)的協(xié)議層、Web服務(wù)的實現(xiàn)層以及Web服務(wù)的應(yīng)用層等等。有學者對現(xiàn)有的Web服務(wù)安全技術(shù)如XML簽名、XML加密和ws-Security規(guī)范進行了詳細的研究,在此基礎(chǔ)上對網(wǎng)上商店的業(yè)務(wù)進行了安全設(shè)計。有學者實現(xiàn)了具有一定通用性的安全模型,能夠提供一種端到端的安全解決方案,如加密機制、簽名機制、安全管理、存取控制等等。有學者提出的安全措施既利用了一系列最新的、基于XML消息的Web服務(wù)安全技術(shù),又包含了法律法規(guī)、管理制度、教育培訓等非技術(shù)性措施。也有的學者著重分析研究了 XML加密解密、XML簽名驗證和XML密鑰管理規(guī)范,介紹了基本原理和處理流程,提出了 Web服務(wù)安全性模型,這個基于消息層的Web服務(wù)安全模型不僅保證了 S0AP(Simple Object Access Protocol,簡單對象訪問協(xié)議)消息的機密性和完整性,還提供了端到端的安全性和可擴展性,對Web服務(wù)提供了全面的安全保障。在本發(fā)明中,我們創(chuàng)新性地使用了程序切片技術(shù)。程序切片的思想是于1979年在Mark Weiser博士論文中首次被建立的,程序切片在程序理解、分析、調(diào)試以及軟件的測試、度量和維護等方面有著廣泛的應(yīng)用。程序切片可以被劃分為前向切片和后向切片前向切片包含受該變量影響的所有語句和斷言;后向切片包含影響該變量的所有語句和斷言。程序切片還可分為靜態(tài)切片和動態(tài)切片方法靜態(tài)切片僅僅在靜態(tài)程序中被使用,動態(tài)切片考慮輸入值所帶來的影響,更方便分析切片,但是存在著有效性的限制。直觀上講,程序切片技術(shù)可以根據(jù)服務(wù)間的依賴關(guān)系來發(fā)現(xiàn)服務(wù)所依賴的其他服務(wù)。在Web服務(wù)中,服務(wù)是與語言無關(guān)的,理論上,這個服務(wù)可以是使用任意語言編寫的,可以是C,Java, Haskell等等一系列的語言。其中Haskell是現(xiàn)代的、描述式的、高價的 、純函數(shù)式程序設(shè)計語言,具有代碼簡潔、安全可靠、無副作用、易擴展、易理解、高組合性等特性,它還擁有表達力強的語法,以及豐富的內(nèi)置數(shù)據(jù)類型,包括任意精度的整數(shù)和有理數(shù)。國內(nèi)外已有越來越多的程序設(shè)計愛好者使用該語言,用該語言實現(xiàn)的軟件系統(tǒng)也越來越多,規(guī)模也越來越大??紤]到該Web服務(wù)分析方法的安全性和易用性,采用Haskell語言來實現(xiàn)本發(fā)明中的安全分析方法。參考文獻[I]Web-Service website,2009. http://en. wikipedia. org/wiki/ffeb_service.[2]張迎周,徐寶文.一種新型形式化程序切片方法.中國科學E輯信息科學,2008,38 (2) :161-176.
發(fā)明內(nèi)容
技術(shù)問題本發(fā)明提出一種基于程序切片技術(shù)的Web服務(wù)安全分析方法,主要目的是提供一種切實可行且有效的分析方法對Web服務(wù)的安全進行檢 測及分析。技術(shù)方案該分析方案從Java開發(fā)的Web服務(wù)的源代碼入手,對Java源碼進行分析,構(gòu)建基于程序切片技術(shù)的Web服務(wù)安全分析方法。一般的安全分析方法只對發(fā)布后的Web服務(wù)進行安全分析,但是有時候很多漏洞的源頭是存在于源代碼中的,并且往往這樣的漏洞又是很危險的,因此我們提出了針對Web服務(wù)源代碼的安全分析方法,對Web服務(wù)源代碼分析并得到它的方法依賴圖,根據(jù)方法依賴圖,使用程序切片技術(shù)對Web服務(wù)安全漏洞進行分析,希望能從根本上去發(fā)現(xiàn)安全漏洞并對漏洞進行修復(fù)。最終使用服務(wù)發(fā)布和服務(wù)測試功能對本發(fā)明中的安全分析方法分析過的Web服務(wù)進行發(fā)布和測試,驗證使用該方法修復(fù)過并發(fā)布的Web服務(wù)的安全漏洞是否存在。本發(fā)明提出了一種基于程序切片技術(shù)的Web服務(wù)安全分析方法,對Web服務(wù)源代碼中存在的安全漏洞進行檢測和修復(fù),旨在將提高Web服務(wù)安全性能。本發(fā)明中的安全分析方法包含漏洞分類模塊、代碼分析模塊、切片模塊、漏洞修復(fù)模塊、服務(wù)發(fā)布模塊以及服務(wù)測試模塊。本發(fā)明先通過漏洞分類模塊對漏洞進行分類,然后使用代碼分析模塊對代碼進行分析,得到Java代碼中方法之間的依賴關(guān)系(即方法之間的調(diào)用關(guān)系),生成方法依賴圖。之后使用切片模塊對源代碼和方法依賴圖進行切片分析,檢測源代碼中每一種漏洞,并使用漏洞修復(fù)模塊對漏洞進行修復(fù),使Web服務(wù)具有更高的安全性。然后再使用服務(wù)發(fā)布模塊將修復(fù)過的Web服務(wù)源代碼進行發(fā)布。最后可以使用服務(wù)測試模塊對修復(fù)過的Web服務(wù)進行安全性驗證,證明本發(fā)明的安全分析方法的正確性以及有效性。每個模塊的具體功能如下(I)漏洞分類模塊這個模塊對Web服務(wù)中的安全漏洞進行分類。我們認為一個Web服務(wù)源代碼中肯定會存在一些存儲私有信息的變量,我們將這些變量稱作為關(guān)鍵信息。如果這些關(guān)鍵信息被修改的話,那么就有可能產(chǎn)生安全漏洞。一個Java方法可以直接修改關(guān)鍵信息的值(在定義中直接定義修改關(guān)鍵信息的語句,直接修改關(guān)鍵信息值),也可以間接修改關(guān)鍵信息的值(在定義中調(diào)用了修改關(guān)鍵信息的其他方法,間接修改關(guān)鍵信息值)。本模塊根據(jù)關(guān)鍵信息被修改的方式,將安全漏洞分為顯式漏洞(直接修改)和隱式漏洞(間接修改)。由此可見,通過方法之間的調(diào)用關(guān)系,顯式漏洞可以導致隱式漏洞。(2)代碼分析模塊這個模塊對Web服務(wù)的源代碼進行分析,生成方法依賴圖。方法依賴圖是記錄Web服務(wù)源代碼中每個方法之間依賴關(guān)系的一個有向圖。當一個方法被另一個方法調(diào)用了,這兩個方法就會被記錄在方法依賴圖中,并用一個有向的直線連接它們,方向是從被調(diào)用的方法指向調(diào)用的方法。這個模塊詳細介紹了方法依賴圖的概念以及方法依賴圖中存在的依賴關(guān)系的類型(直接依賴,間接依賴)。這個模塊中還給出了方法依賴圖的生成方法以及詳細的生成步驟。(3)切片模塊在這個模塊中,根據(jù)不同類型的安全漏洞,我們將切片方法分為語句級別的切片和方法級別的切片。對于顯式漏洞,我們使用語句級別的切片對源代碼中每ー個語句進行分析,抽取出那些直接修改關(guān)鍵信息值的語句,以此來檢測出存在顯式漏洞的方法。對于隱式漏洞,我們使用方法級別的切片對代碼分析模塊中得到的方法依賴圖進行分析,分析顯式漏洞在方法之間的傳播與擴散情況,以此來檢測存在隱式漏洞的方法。(4)漏洞修復(fù)模塊在這個模塊中,對切片模塊中檢測出來的具有顯式和隱式漏洞的方法進行漏洞修復(fù),保證這些不安全的方法在Web服務(wù)發(fā)布期間被隱藏,不被發(fā)布成服務(wù)接ロ,用戶也就無法調(diào)用此方法對關(guān)鍵信息進行惡意篡改,進ー步提高Web服務(wù)的安全性。 (5)服務(wù)發(fā)布模塊此模塊使用Axis2對漏洞修復(fù)后的Web服務(wù)源代碼進行發(fā)布。Axis2是ー個目前比較流行的Web服務(wù)引擎,使用Axis2可以實現(xiàn)Web服務(wù)發(fā)布。默認的Axis2發(fā)布流程包含的步驟比較多且過程比較繁瑣,本模塊借助源代碼分析模塊分析所得的信息以及用戶所提供的基本信息,簡化了發(fā)布過程,實現(xiàn)了服務(wù)的快速自動發(fā)布。(6)服務(wù)測試模塊此模塊主要用于對已經(jīng)發(fā)布的Web服務(wù)進行測試并驗證漏洞修復(fù)是否成功。對發(fā)布后的Web服務(wù)的WSDL文件(Web Services Description Language,Web服務(wù)描述語言)進行分析,自動生成測試數(shù)據(jù)、測試用例以及SOAP請求消息,然后把SOAP請求消息發(fā)送到Web服務(wù)器,獲取SOAP反饋消息,根據(jù)反饋的結(jié)果來分析存在安全漏洞的服務(wù)操作的訪問情況。如果存在安全漏洞的服務(wù)操作不能被訪問,則說明本發(fā)明的安全分析方法的修復(fù)功能是可行的。具體方法如下該方法對安全漏洞進行分類,分為顯式漏洞和隱式漏洞,針對顯式漏洞,使用程序切片技術(shù)對Web服務(wù)的Java源代碼中的語句進行語法解析,以此來檢測顯式漏洞;針對隱式漏洞,以圖論知識為理論基礎(chǔ),以程序切片為技術(shù)手段,根據(jù)Web服務(wù)的Java源代碼中的方法之間的依賴關(guān)系,生成方法依賴圖并對其切片,以此來檢測隱式漏洞;該安全漏洞檢測方法包括漏洞分類模塊、代碼分析模塊、切片模塊、漏洞修復(fù)模塊、服務(wù)發(fā)布模塊以及服務(wù)測試模塊;該方法從Java語言開發(fā)的Web服務(wù)著手,根據(jù)Web服務(wù)Java源代碼中的語法結(jié)構(gòu)以及Java方法之間的依賴關(guān)系,結(jié)合切片技術(shù)對其中的安全漏洞進行檢測與修復(fù),并實現(xiàn)對修復(fù)后的Web服務(wù)進行發(fā)布以及測試功能;該方法具體包含以下步驟步驟I :將用戶提供的Web服務(wù)的Java源代碼作為輸入;步驟2 :用代碼分析模塊對Web服務(wù)的Java源代碼進行語法解析,得到一個中間類型結(jié)構(gòu)以及記錄Java方法之間依賴關(guān)系的ー個Method類型的列表;步驟3 :根據(jù)步驟2中的中間類型結(jié)構(gòu)記錄的方法之間的調(diào)用關(guān)系,使用依賴圖生成算法生成依賴關(guān)系集合S1 ;步驟4 :根據(jù)步驟2中的Method類型的列表中記錄的方法之間的依賴關(guān)系,使用依賴圖生成算法生成方法依賴關(guān)系集合S2 ;步驟5 :對步驟3和4中的兩個集合S1和S2使用并集操作,得到一個新的依賴關(guān)系集合,根據(jù)該集合生成Web服務(wù)源代碼的方法依賴圖;步驟6 :檢測顯式漏洞,使用程序切片技術(shù)對Java源代碼中修改了關(guān)鍵信息的語句進行語法解析,得到一個包含顯式漏洞的不安全方法的列表;步驟7 :檢測隱式漏洞,使用程序切片技術(shù),將步驟6中得到的包含顯式漏洞的不安全方法的列表作為切片節(jié)點,對步驟5中生成的方法依賴圖進行切片,得到的最終結(jié)果是一個包含隱式漏洞的不安全方法列表;步驟8 :合并步驟6和步驟7中的不安全方法列表得一個新的不安全方法列表,這個列表就是安全檢測得到的最終的不安全方法的列表;步驟9 :根據(jù)步驟8中的不安全方法列表,使用漏洞修復(fù)模塊對源代碼中的不安全方法的關(guān)鍵詞進行修改,如果不安全方法的關(guān)鍵詞是public,則改為private,如果不安全方法的關(guān)鍵詞是除了 public以外的關(guān)鍵詞,則保持不變,最終將修改后的代碼作為Web服務(wù)新的源代碼;步驟10 :用戶提供Axis2平臺所在的路徑、Web服務(wù)的名稱以及相應(yīng)的描述信息;步驟11 :根據(jù)用戶在步驟10提供的信息,使用Axis2平臺和服務(wù)發(fā)布模塊,實現(xiàn)對Web服務(wù)的自動發(fā)布;步驟12 :對發(fā)布后的Web服務(wù)進行測試,使用服務(wù)測試模塊的功能生成測試用例并對Web服務(wù)中發(fā)布的操作進行自動測試,驗證被修復(fù)過的漏洞是否還存在。有益效果本發(fā)明中的Web服務(wù)安全分析方法從Web服務(wù)的源代碼著手,分析源代碼中的方法對關(guān)鍵信息的修改情況以及方法之間的依賴關(guān)系,使用程序切片技術(shù)檢測安全漏洞,并提供修復(fù)、發(fā)布以及測試功能。本發(fā)明具有以下的一些特點及創(chuàng)新之處 根據(jù)對關(guān)鍵信息的修改方式的不同進行安全漏洞的分類本發(fā)明根據(jù)Web服務(wù)Java源代碼中方法對關(guān)鍵信息的修改方式的不同,將安全漏洞分為顯式漏洞和隱式漏洞。包含顯式或者隱式漏洞的方法都是不安全方法。本發(fā)明中的安全分析方法針對這兩種類型的漏洞對代碼進行全面分析,可以有效提高漏洞分析結(jié)果的全面性,降低漏洞檢測過程中發(fā)生漏檢和錯檢的概率。 基于方法調(diào)用關(guān)系的依賴圖生成算法本發(fā)明著重對方法之間的調(diào)用關(guān)系進行分析,將這種調(diào)用關(guān)系看成是一種依賴關(guān)系,并提出使用方法依賴圖對方法之間的依賴關(guān)系進行記錄。本發(fā)明中詳細介紹了方法依賴圖的概念以及性質(zhì),并將依賴關(guān)系分為直接依賴和間接依賴。除此之外,還詳細地介紹了依賴圖的生成算法,即如何從源代碼生成該源代碼的方法依賴圖。先對源代碼進行分析,對其中的方法調(diào)用語句進行抽取,然后根據(jù)這些語句生成方法依賴二元組的集合,最后根據(jù)這個方法依賴二元組集合中的記錄生成方法依賴圖。方法依賴圖可以很好的反應(yīng)方法之間的調(diào)用和被調(diào)用的關(guān)系,可以更好的幫助我們的安全分析方法對源程序進行分析和理解。 為不同類型的安全漏洞設(shè)計不同的切片方法本發(fā)明中,針對不同類型的安全漏洞,設(shè)計了不同類型的切片方法。對于存在顯式漏洞的方法,其在修改關(guān)鍵信息的時候是直接修改的,因此在檢測此類安全漏洞的時候,只需要對方法定義體中的語句進行檢測,看其是否修改了關(guān)鍵信息的值,所以在檢測顯式漏洞的時候,本發(fā)明使用的是語法級別的切 片,就是傳統(tǒng)對語句進行分析和抽取的切片方法,根據(jù)切片結(jié)果判斷是否存在顯式漏洞。對于存在隱式漏洞的方法,其在修改關(guān)鍵信息的時候是間接修改的,即通過方法之間的調(diào)用關(guān)系進行間接修改,因此在檢測此類安全漏洞的時候,需要對方法之間的調(diào)用關(guān)系進行分析,本發(fā)明中使用的是方法級別的切片,對分析源代碼后得到的方法依賴圖進行切片,根據(jù)切片后的依賴子圖判斷是否存在隱式漏洞。
基于代碼重寫方法的安全漏洞的修復(fù)在本發(fā)明中,使用Axis2進行Web服務(wù)的發(fā)布。Axis2是用Java語言開發(fā)的ー個簡單、方便使用的Web服務(wù)引擎,用來完成Web服務(wù)的發(fā)布以及部署。而我們的安全分析方法也是主要針對Java語言開發(fā)的Web服務(wù),因此從語言的兼容性以及使用方便程度等因素考慮,選擇Axis2作為本發(fā)明中的Web服務(wù)發(fā)布平臺。在發(fā)布前,我們首先要將檢測出的安全漏洞進行修復(fù)。根據(jù)Axis2平臺只發(fā)布“public”方法的特點,使用代碼重寫方法將Web服務(wù)源代碼中存在安全漏洞的方法的關(guān)鍵詞由“public”修改為“private”,達到在Web服務(wù)發(fā)布階段屏蔽不安全方法的目的。 便捷的發(fā)布過程以及自動測試功能使用Axis2發(fā)布時,需要手動配置ー些文件,步驟比較繁瑣,甚至還需要一定的XML技術(shù)基礎(chǔ),例如在配置過程中需要編寫XML文件。本發(fā)明實現(xiàn)了 Web服務(wù)的自動發(fā)布,用戶只需提供例如服務(wù)名等這些簡單的信息就可以實現(xiàn)Web服務(wù)發(fā)布。在服務(wù)發(fā)布之后,本發(fā)明還給出了 Web服務(wù)自動測試方法,可以對修復(fù)后的服務(wù)進行驗證,驗證漏洞修復(fù)成功與否。
圖I是本發(fā)明中的安全分析方法的一個整體的流程框架圖。圖2描述了分析Method類型列表的算法流程圖。圖3描述了語句級別的切片算法的算法流程圖。圖4描述了方法級別的切片算法的算法流程圖。圖5描述了漏洞修復(fù)模塊的流程圖。圖6給出了服務(wù)發(fā)布模塊的流程圖。
具體實施例方式本發(fā)明中的Web服務(wù)安全分析方法包含漏洞分類模塊、代碼分析模塊、切片模塊、漏洞修復(fù)模塊、服務(wù)發(fā)布模塊以及服務(wù)測試模塊。圖I給出了本發(fā)明平臺的一個整體的流程框架,描述了各個模塊的工作流程。下面的內(nèi)容是對本發(fā)明中的各個模塊在實現(xiàn)上的詳細描述。I,漏洞分類模塊在Web服務(wù)的源代碼中,或多或少會存在一些存儲與服務(wù)相關(guān)的私有變量,這些變量如果被惡意修改后,可能就會導致ー些嚴重后果,因此除了 Web服務(wù)的開發(fā)者或者管理者,其他人員是無權(quán)修改這些變量的。在本發(fā)明中,我們將這些變量稱作關(guān)鍵信息。Java源代碼中可能存在很多方法會調(diào)用或者修改這些關(guān)鍵變量,對于僅僅只是調(diào)用這些變量的方法來說,發(fā)布后不會造成嚴重后果,因為用戶通過這個方法無法修改關(guān)鍵信息的值,但是對于那些修改關(guān)鍵變量的方法,發(fā)布后就會造成嚴重后果,因為用戶可以通過調(diào)用這個方法達到惡意篡改關(guān)鍵信息的目的。因此,這些修改了關(guān)鍵信息的方法就是存在安全漏洞的方法。這些不安全的方法在進行安全分析的時候,要被檢測出來并進行修復(fù)。在本發(fā)明中,我們根據(jù)方法對關(guān)鍵信息的修改方式,將Web服務(wù)源代碼中的安全漏洞分為顯式漏洞和隱式漏洞。定義I :顯式漏洞(直接修改關(guān)鍵信息)當Web服務(wù)源代碼中的方法的定義體中直接包含修改關(guān)鍵信息的語句時,就會導致顯式漏洞,這個方法就是一個包含顯式漏洞的不安全方法。其實這樣的安全漏洞還是比較容易被發(fā)現(xiàn)的,因為直接修改關(guān)鍵信息的語句可以在方法的定義里面找到,但是當代碼量巨大的時候,還是需要使用程序自動進行分析的。定義2 隱式漏洞(間接修改關(guān)鍵信息)當Web服務(wù)源代碼中的方法的定義體中并不包含直接修改關(guān)鍵信息的語句,但是這個方法的定義中卻包含調(diào)用其他方法的語句,而被調(diào)用的方法是一個可以修改關(guān)鍵信息的方法時,就會導致隱式漏洞,這個方法就是一個包含隱式漏洞的不安全方法??梢姵酥苯有薷年P(guān)鍵信息外,Web服務(wù)源代碼中的方法也可以間接修改關(guān)鍵信息。這種間接修改往往很難被發(fā)現(xiàn),因其是通過調(diào)用其他方法而修改關(guān)鍵信息的。 通過對安全漏洞進行分類可以使得我們的安全分析方法在檢測安全漏洞的時候能夠定制不同的方法對不同的漏洞進行檢測,使得檢測過程更有目的性,減少錯檢和漏檢的概率。2,代碼分析模塊代碼分析模塊的主要作用就是生成Web服務(wù)源代碼的方法依賴圖。首先介紹一下方法依賴圖的概念以及相關(guān)定義。定義I :方法依賴圖(method dependence graph, MDG)方法依賴圖是一個表示方法依賴關(guān)系二元組集合的有向圖。一個依賴關(guān)系二元組(a, b)表示的是方法b調(diào)用方法a,可以說成方法b依賴方法a或者a被依賴于b,在圖中用一條有向直線連接方法a和方法b,并且直線方向是由被調(diào)用方法指向調(diào)用它的方法,也就是由a指向b。方法依賴圖顯示了 Java源代碼中方法之間的調(diào)用與被調(diào)用關(guān)系。在方法依賴圖中,方法之間的關(guān)系可以被分為兩種基本的依賴關(guān)系直接依賴關(guān)系和間接依賴關(guān)系。定義2 :直接依賴關(guān)系(direct dependence relation, DDR)如果方法b的定義中直接調(diào)用了方法a,那么方法a、b之間的依賴關(guān)系就稱為直接依賴關(guān)系,用二元組(a,b)表示,在圖中用一個帶有箭頭的實線連接a、b,箭頭方向為a指向b,表示b依賴a。定義3 :間接依賴關(guān)系(indirect dependence relation, I DR)因直接依賴關(guān)系而產(chǎn)生依賴的兩個方法之間的關(guān)系稱為間接依賴關(guān)系。例如方法c直接調(diào)用b,方法b直接調(diào)用方法a,那么方法c就會通過方法b間接調(diào)用方法a,方法a和c之間的關(guān)系就是間接依賴關(guān)系。間接依賴關(guān)系其實就是直接依賴關(guān)系之間的傳遞。例如,由直接依賴關(guān)系(a,b)和(b,c),可以得出a和c之間的關(guān)系是間接依賴關(guān)系。本發(fā)明使用Haskell的語言對Java源碼進行預(yù)處理,得到方法之間的依賴關(guān)系二元組集合,最后通過繪圖軟件生成最終的方法依賴圖。我們定義了一個processMethods函數(shù)去處理Java代碼中的方法,并得到依賴關(guān)系二元組集合[(BeCalled, Calling)]。該函數(shù)的定義如下
processMethods::[Methodlnvocation]- > [(BeCalled, Calling)]使用該函數(shù)可以生成依賴關(guān)系ニ元組集合,但是為了生成的結(jié)果盡量準確,我們還使用了另ー種方法對其進行生成。在此方法中,通過分析源代碼文件,生成了ー個遞歸類型Method的列表,Method類型的定義如下data Method = {Name, Paras, Return, Location, Method}這個Method類型中記錄了方法的名稱,方法的參數(shù),方法的返回類型,方法在代碼中的位置以及該方法定義中調(diào)用的其他方法。我們對Method類型的列表進行分析,就可以得到依賴關(guān)系ニ元組集合。Method類型是ー個遞歸類型,設(shè)計ー個遞歸算法對Method類型進行分析。這個遞 歸算法的具體步驟如下步驟I :先建立ー個集合S (初始值為空)來儲存得到的依賴關(guān)系ニ元組集合;建立一個變量η,記錄Method類型的個數(shù),Method類型指針指在Method列表的第一個元素;步驟2 :如果η的值為0,則表示所有的Method類型已經(jīng)分析結(jié)束,返回集合S,否則執(zhí)行步驟3 ;步驟3 :檢查Method類型指針所指的元素,看這個元素中的Method定義是否為空,如果為空,那么η的值減1,Method類型指針往后移動ー個,然后繼續(xù)執(zhí)行步驟2,如果不為空,則根據(jù)Method的記錄生成一個關(guān)系ニ元組,并將其加入到步驟I中的集合S中,然后η的值減1,Method類型指針往后移動ー個,繼續(xù)執(zhí)行步驟2。圖2給出了此算法的算法流程圖。在圖2中,M是ー個指向Method列表的第一個Method元素的指針。一般情況下,使用processMethods函數(shù)得到的依賴圖集合應(yīng)該和使用對Method列表進行分析的方法所得到的依賴關(guān)系集合相等,但是為了保證依賴集合的正確性與全面性,我們對兩個集合進行并集操作。在得到關(guān)系依賴ニ元組集合后,需要根據(jù)它來生成方法依賴圖。文中使用了第三方軟件Graphviz進行方法依賴圖的繪制。Graphviz是開源可視化圖形軟件,實現(xiàn)了圖的布局與生成。文中主要使用的是Graphviz中的dot工具。dot是ー個根據(jù)文本信息生成有向圖的工具。只要用戶遵循一定的規(guī)則編寫ー個dot格式的腳本文件,然后就可以使用dot工具進行畫圖。既然選擇使用dot來繪制方法依賴圖,那么就需要將關(guān)系依賴ニ元組集合記錄到dot腳本文件中。為了更好的表示依賴關(guān)系ニ元組,定義了ー個關(guān)系類型,定義如下type Rel a b = Set (a, b)定義了ー個Rel類型。ー個Rel類型就表示ー個集合。依賴關(guān)系ニ元組中記錄的是方法名稱,因此可以用Rel String String來表示依賴關(guān)系ニ元組集合Set (String,String)。對Java源代碼進行分析后得到的是ー個依賴關(guān)系ニ元組的列表[(BeCalled,Calling)],因此須先將此列表轉(zhuǎn)化為上述的關(guān)系類型。在此,使用了 IistToSet函數(shù),此函數(shù)的聲明如下IistToSet: : [a]- > Set aa表示任意類型,在處理依賴關(guān)系ニ元組集合吋,IistToSet的類型就是[(BeCalled, Calling)] - > Set (BeCalled, Calling)。又定義了 createEadges,用來生成dot文件中邊的相關(guān)信息,其定義如下createEdge::(String, String)- > StringcreateEdges::[(String, String)]- > StringcreateEdges edges = map createEdge edges在createEdges函數(shù)中,使用了 setToList函數(shù)將Rel類型轉(zhuǎn)化為依賴關(guān)系ニ元組集合,然后使用map函數(shù)對集 合中的每ー個關(guān)系ニ元組進行createEdge操作,之后將得到的所有字符串都寫入到文件中,生成dot格式的腳本文件,最后使用dot命令進行圖形的繪制。方法依賴圖的生成總結(jié)起來有如下幾個步驟步驟I :首先獲取源文件,對其進行預(yù)處理,得到中間結(jié)構(gòu)類型以及Method類型列表;步驟2 :對中間類型進行分析,得到依賴關(guān)系ニ元組集合S1 ;步驟3 :對Method類型列表進行分析,得到依賴關(guān)系ニ元組集合S2 ;步驟4 :對S1和S2執(zhí)行并集操作,得到最終的依賴關(guān)系ニ元組集合S ;步驟5 :根據(jù)依賴關(guān)系ニ元組集合S,生成方法依賴關(guān)系圖的dot腳本文件;步驟6 :根據(jù)dot腳本文件,使用dot工具,生成最終的方法依賴關(guān)系圖。3,切片模塊本發(fā)明在切片模塊中針對漏洞分類模塊中的每ー種漏洞都提出了相應(yīng)的切片算法,可以提高漏洞的檢測率。針對顯式漏洞,我們采用語句級別的切片方法,對方法定義中直接修改關(guān)鍵信息的語句進行抽取與分析,針對隱式漏洞,我們采用方法級別的切片對方法之間的依賴關(guān)系進行抽取與分析,以此來發(fā)現(xiàn)間接修改關(guān)鍵信息的方法。3. I語句級別的切片方法針對顯式漏洞,主要是分析代碼中對關(guān)鍵信息直接進行修改的語句,使用語句級別的切片方法將這些語句抽取出來,這些語句就是顯式漏洞,而具有這些語句的方法則是不安全方法。本切片方法以Java源代碼和關(guān)鍵信息作為輸入,輸出的就是存在顯式漏洞的不安全方法,具體切片步驟如下步驟I :分析Java源代碼中各個方法的定義,并將他們的定義存在集合S中;步驟2:分析集合S中的方法的定義,將沒有使用到關(guān)鍵信息的方法的定義從集合S中移去;步驟3 :再分析集合S,將其中只是引用了關(guān)鍵信息而并沒有直接修改關(guān)鍵信息的方法從集合S中移去;步驟4 :對集合S中的定義進行處理,保存集合S中方法的名稱在一個新的集合M中,返回M作為本切片算法的最終結(jié)果。圖3給出了該語法級別切片算法的流程圖。3. 2方法級別的切片針對隱式漏洞,已經(jīng)不能單純使用傳統(tǒng)的語句級別的切片對其進行分析了,因為語句級別的切片只能分析語法,不能分析方法之間的依賴關(guān)系,所以我們使用方法級別的切片,將切片算法的研究對象擴大到方法上,通過分析方法之間的調(diào)用依賴關(guān)系,對生成的方法依賴圖進行切片,進而完成隱式漏洞的檢測。在該切片算法的步驟中,輸入是原始依賴關(guān)系集合,輸出是切片依賴關(guān)系集合,該集合中記錄的元素就是存在隱式漏洞的不安全方法,算法的具體步驟如下步驟I :創(chuàng)建一個集合S (初始值為空)存儲切片得到的依賴關(guān)系二元組集合,一個集合D(D的初始值為切片起點)存儲節(jié)點的直接依賴節(jié)點;步驟2 :如果集合D為空,則返回集合S作為切片的結(jié)果。如果集合D不為空,則對于集合D中的所有節(jié)點搜索它們的直接依賴關(guān)系(假設(shè)存儲在集合R中),以及所有節(jié)點的直接依賴節(jié)點(假設(shè)存儲在集合N中,如果已經(jīng)到達最底層的葉子節(jié)點,則集合為空,表明最底層葉子節(jié)點不再存在直接依賴關(guān)系以及直接依賴節(jié)點);步驟3 :將步驟2中得到的直接依賴關(guān)系二元組集合R加入到集合S中。將步驟2中得到的直接依賴節(jié)點集合N賦值給D,再次執(zhí)行步驟2。此切片算法的算法流程圖如圖4所示。4,漏洞修復(fù)模塊此模塊的主要用途是對利用切片模塊檢測到的不安全漏洞進行修復(fù)。本發(fā)明中用到的發(fā)布平臺是Axis2平臺。Axis2是目前比較流行的Web服務(wù)引擎。使用Axis2,可以將Java源代碼發(fā)布為Web服務(wù)。Axis2默認發(fā)布的是公有類中的公有方法,即被定義在public類中的被public修飾的方法是默認被發(fā)布的,而被其他關(guān)鍵詞修飾的方法是默認不被發(fā)布的,因此我們可以采用代碼重寫的方法,對存在安全漏洞的方法的關(guān)鍵詞進行改寫,將public改為private,即可完成漏洞的修復(fù)。為了實現(xiàn)這樣的功能,定義了如下的函數(shù)modifyJFile::[MethodName]- > FilePath- > String參數(shù)[MethodName]是存在安全漏洞的不安全方法的列表,參數(shù)Filepath是Java源代碼文件,返回類型是修改后的Java代碼的字符串。這個函數(shù)在執(zhí)行的時候,首先分析Java源文件,獲取所有方法的定義,然后修改存在安全漏洞的方法的定義,將它們的關(guān)鍵詞修改為private。具體步驟如下,其中輸入是Java源代碼以及不安全的方法,輸出是經(jīng)過漏洞修復(fù)后的代碼。該模塊的流程圖如圖5所示。步驟I :使用切片模塊對源代碼進行分析,檢測其中的不安全方法,記錄在集合S中;步驟2 :分析集合S中方法的定義,如果其關(guān)鍵詞是public,則修改為private ;步驟3 :分析集合S中方法的定義,如果其關(guān)鍵詞是其他的,則保持不變;步驟4 :用修改后的定義代替原來的定義,并將修改后的代碼作為輸出。5,服務(wù)發(fā)布模塊本模塊使用Axis2平臺進行服務(wù)發(fā)布。Axis2官方手冊中關(guān)于使用Axis2進行發(fā)布的步驟過于繁瑣,其中需要人工進行參與的工作也很多,而且很多工作是需要有一定XML技術(shù)基礎(chǔ)的人才能完成的,例如build, xml以及services, xml文件的編寫。因此,在此模塊中,我們設(shè)計了一個自動發(fā)布方法,使得普通用戶能夠很方便快捷的發(fā)布Web服務(wù)。該方法只需用戶提供Web服務(wù)的Java源文件所在的路徑,Axis2平臺所在的路徑以及服務(wù)的描述及服務(wù)的名稱。具體的發(fā)布步驟如下步驟I :分析java源程序,獲得這個Java文件的package定義(使用services,xml進行發(fā)布的java源程序必須存在package定義); 步驟2 :根據(jù)用戶提供的信息生成一個build, xml的配置信息。這些信息包括源文件目錄,Axis2目錄以及要發(fā)布的Java方法;步驟3 :使用基于切片的安全分析方法對待發(fā)布Web服務(wù)源代碼進行分析,得到不安全方法的列表,并使用代碼重寫技術(shù)對源代碼進行修改,屏蔽不安全方法;步驟4 :分析build, xml文件,生成ServiceInfo類型,獲得Java源代碼目錄以及Axis2的目錄;步驟5 :根據(jù)ServiceInfo記錄的信息來生成services, xml,并新建META-INF目錄,并將services, xml保存到該目錄下;步驟6 :編譯Java源代碼(代碼重寫方法修改過的源代碼),保存在classes目錄下; 步驟7 :將classes和META-INF目錄進行打包,生成后綴名為.arr的文件,并將這個文件移動到Axis2的目錄下,實現(xiàn)Web服務(wù)的發(fā)布。其中步驟3是對Web服務(wù)源代碼進行安全檢測,使Web服務(wù)在自動被發(fā)布的前提下能夠達到安全性能的要求。圖6給出了服務(wù)發(fā)布模塊的流程圖。6,服務(wù)測試模塊該模塊主要實現(xiàn)了對已經(jīng)發(fā)布的Web服務(wù)進行測試的功能。該測試模塊可以測試在本發(fā)明中已經(jīng)被修復(fù)的漏洞是否還存在,以此來驗證本發(fā)明的安全分析方法的正確性。該模塊包含WSDL分析器、測試數(shù)據(jù)生成器、測試用例生成器以及Web服務(wù)自動測試器。> WSDL分析器對發(fā)布的服務(wù)的WSDL文件進行分析,獲取服務(wù)接ロ的參數(shù)類型。>測試數(shù)據(jù)生成器根據(jù)WSDL分析器得到的結(jié)果,自動生成與類型相符合的參數(shù)值。>測試用例生成器自動生成Web服務(wù)的測試用例。>自動測試器自動將生成的測試用例發(fā)送到Web服務(wù)器端,并解析反饋消息,返回測試結(jié)果。
權(quán)利要求
1.一種基于程序切片技術(shù)的Web服務(wù)安全漏洞檢測方法,其特征在于該方法對安全漏洞進行分類,分為顯式漏洞和隱式漏洞;針對顯式漏洞,使用程序切片技術(shù)對Web服務(wù)的Java源代碼中的語句進行語法解析,以此來檢測顯式漏洞;針對隱式漏洞,以圖論知識為理論基礎(chǔ),以程序切片為技術(shù)手段,根據(jù)Web服務(wù)的Java源代碼中的方法之間的依賴關(guān)系,生成方法依賴圖并對其切片,以此來檢測隱式漏洞;該安全漏洞檢測方法包括漏洞分類模塊、代碼分析模塊、切片模塊、漏洞修復(fù)模塊、服務(wù)發(fā)布模塊以及服務(wù)測試模塊;該方法從Java語言開發(fā)的Web服務(wù)著手,根據(jù)Web服務(wù)Java源代碼中的語法結(jié)構(gòu)以及Java方法之間的依賴關(guān)系,結(jié)合切片技術(shù)對其中的安全漏洞進行檢測與修復(fù),并實現(xiàn)對修復(fù)后的Web服務(wù)進行發(fā)布以及測試功能;該方法具體包含以下步驟 步驟I :將用戶提供的Web服務(wù)的Java源代碼作為輸入; 步驟2 :用代碼分析模塊對Web服務(wù)的Java源代碼進行語法解析,得到ー個中間類型結(jié)構(gòu)以及記錄Java方法之間依賴關(guān)系的ー個Method類型的列表; 步驟3 :根據(jù)步驟2中的中間類型結(jié)構(gòu)記錄的方法之間的調(diào)用關(guān)系,使用依賴圖生成算法生成依賴關(guān)系集合S1 ; 步驟4 :根據(jù)步驟2中的Method類型的列表中記錄的方法之間的依賴關(guān)系,使用依賴圖生成算法生成方法依賴關(guān)系集合S2 ; 步驟5 :對步驟3和4中的兩個集合S1和S2使用并集操作,得到一個新的依賴關(guān)系集合,根據(jù)該集合生成Web服務(wù)源代碼的方法依賴圖; 步驟6 :檢測顯式漏洞,使用程序切片技術(shù)對Java源代碼中修改了關(guān)鍵信息的語句進行語法解析,得到ー個包含顯式漏洞的不安全方法的列表; 步驟7 :檢測隱式漏洞,使用程序切片技木,將步驟6中得到的包含顯式漏洞的不安全方法的列表作為切片節(jié)點,對步驟5中生成的方法依賴圖進行切片,得到的最終結(jié)果是一個包含隱式漏洞的不安全方法列表; 步驟8 :合并步驟6和步驟7中的不安全方法列表得一個新的不安全方法列表,這個列表就是安全檢測得到的最終的不安全方法的列表; 步驟9 :根據(jù)步驟8中的不安全方法列表,使用漏洞修復(fù)模塊對源代碼中的不安全方法的關(guān)鍵詞進行修改,如果不安全方法的關(guān)鍵詞是public,則改為private,如果不安全方法的關(guān)鍵詞是除了 public以外的關(guān)鍵詞,則保持不變,最終將修改后的代碼作為Web服務(wù)新的源代碼; 步驟10 :用戶提供Axis2平臺所在的路徑、Web服務(wù)的名稱以及相應(yīng)的描述信息; 步驟11 :根據(jù)用戶在步驟10提供的信息,使用Axis2平臺和服務(wù)發(fā)布模塊,實現(xiàn)對Web服務(wù)的自動發(fā)布; 步驟12 :對發(fā)布后的Web服務(wù)進行測試,使用服務(wù)測試模塊的功能生成測試用例并對Web服務(wù)中發(fā)布的操作進行自動測試,驗證被修復(fù)過的漏洞是否還存在。
全文摘要
本發(fā)明給出了一種基于程序切片技術(shù)的Web服務(wù)安全分析方法,該發(fā)明以Java開發(fā)的Web服務(wù)為研究對象,以Java源代碼中的關(guān)鍵信息作為研究出發(fā)點,將Java源代碼中的漏洞分為顯式漏洞和隱式漏洞兩種。對于顯式漏洞的檢測,可以通過傳統(tǒng)的語句級別的切片對源代碼進行分析和抽取,得到顯式漏洞的分析結(jié)果。對于隱式漏洞的檢測,該方法首先分析了源代碼中方法之間的依賴關(guān)系,生成了方法依賴圖,并使用方法級別的切片對方法依賴圖進行切片,得到隱式漏洞的分析結(jié)果。結(jié)合對顯式和隱式漏洞的分析,使用漏洞修復(fù)模塊對漏洞進行修復(fù),并使用服務(wù)發(fā)布模塊對修復(fù)過的Web服務(wù)進行發(fā)布。
文檔編號G06F21/22GK102622556SQ20111043543
公開日2012年8月1日 申請日期2011年12月22日 優(yōu)先權(quán)日2011年12月22日
發(fā)明者劉玲玲, 周國強, 張衛(wèi)豐, 張迎周, 朱憲庭, 符煒, 許曉曼, 鄒德國, 鄭梁須, 顧帥帥 申請人:南京郵電大學