基于java字節(jié)碼插樁和java方法掛鉤檢測(cè)java沙箱逃逸攻擊的制作方法
【技術(shù)領(lǐng)域】
[0001] 此處所描述的實(shí)施例一般涉及計(jì)算機(jī)安全領(lǐng)域,具體而言,涉及用于檢測(cè)從沙箱 環(huán)境逃逸的應(yīng)用的技術(shù)。
[0002] 背景
[0003] 沙箱是一種受限的環(huán)境,其中不受信任的軟件可能以如下方式執(zhí)行:限制不受信 任的軟件執(zhí)行可能被惡意軟件利用的動(dòng)作的能力。沙箱可以被用作開(kāi)發(fā)環(huán)境,限制可能會(huì) 損壞未受保護(hù)環(huán)境的錯(cuò)誤的影響。類(lèi)似地,沙箱可以用于測(cè)試不受信任的軟件,諸如從不受 信任的源獲取的軟件?;旧?,程序員必須編寫(xiě)只在沙箱內(nèi)"活動(dòng)"的代碼,如同兒童被允 許在現(xiàn)實(shí)沙箱的約束限制內(nèi)做他們希望做的事情,但是不允許獨(dú)立地從沙箱逃逸。
[0004] 某些編程環(huán)境,諸如Oracle America公司所提供的JAVA?平臺(tái),提供沙箱環(huán)境, 作為它們的開(kāi)發(fā)環(huán)境的一部分。("JAVA"是Oracle America公司的注冊(cè)商標(biāo))。在JAVA 開(kāi)發(fā)環(huán)境中,沙箱是建立規(guī)則集合的安全措施,例如,當(dāng)創(chuàng)建在其作為網(wǎng)頁(yè)的一部分發(fā)送時(shí) 防止特定功能的小程序時(shí),使用該組規(guī)則。當(dāng)瀏覽器請(qǐng)求帶有小程序的網(wǎng)頁(yè)時(shí),自動(dòng)地發(fā)送 小程序,一旦頁(yè)面到達(dá)瀏覽器,小程序就可以執(zhí)行。如果小程序被允許對(duì)存儲(chǔ)器和操作系統(tǒng) 資源進(jìn)行無(wú)限的訪問(wèn),則如果小程序是惡意軟件,它會(huì)帶來(lái)危害。沙箱創(chuàng)建一種環(huán)境,在該 環(huán)境中,對(duì)小程序可以請(qǐng)求或訪問(wèn)哪些系統(tǒng)資源有嚴(yán)格的限制。除規(guī)則之外,JAVA語(yǔ)言還 提供代碼檢測(cè)器以保證遵守沙箱的限制。
[0005] 然而,如在每個(gè)安全性環(huán)境中,一旦被發(fā)現(xiàn)從沙箱逃逸并訪問(wèn)處于沙箱中的軟件 不應(yīng)該能夠訪問(wèn)的資源,安全性環(huán)境中的弱點(diǎn)或瑕疵可能會(huì)被利用。入侵預(yù)防系統(tǒng)嘗試防 止操作系統(tǒng)、應(yīng)用或開(kāi)發(fā)環(huán)境中的允許這樣的利用(exploit)成功的漏洞。通常,這樣的入 侵預(yù)防系統(tǒng)使用定制沙箱或虛擬機(jī)來(lái)監(jiān)視利用行為和對(duì)沙箱利用的基于簽名的檢測(cè),類(lèi)似 于傳統(tǒng)的防惡意軟件的軟件。然而,入侵預(yù)防系統(tǒng)常常不能檢測(cè)利用,諸如還沒(méi)有被分析的 利用(常常被稱(chēng)為〇日利用)?;蛘?,某些常規(guī)方法產(chǎn)生假陽(yáng)性指示,將不是利用的某種東 西稱(chēng)為利用。更好的方法將有所幫助。
[0006] 附圖簡(jiǎn)述
[0007] 圖1是示出了根據(jù)一個(gè)實(shí)施例的提供沙箱環(huán)境的可編程設(shè)備的框圖。
[0008] 圖2是示出了根據(jù)一個(gè)實(shí)施例的用于插樁(instrument)沙箱的技術(shù)的流程圖。
[0009] 圖3是示出了根據(jù)一個(gè)實(shí)施例的用于插樁JAVA沙箱的技術(shù)的流程圖。
[0010] 圖4是示出了根據(jù)一個(gè)實(shí)施例的用于插樁JAVA沙箱的技術(shù)的框圖。
[0011] 圖5是示出了根據(jù)一個(gè)實(shí)施例的與本文所描述的技術(shù)一起使用的可編程設(shè)備的 框圖。
[0012] 圖6是示出了根據(jù)另一實(shí)施例的與本文所描述的技術(shù)一起使用的可編程設(shè)備的 框圖。
[0013] 圖7是其中可以實(shí)現(xiàn)本文所描述的技術(shù)的可編程設(shè)備的網(wǎng)絡(luò)的框圖。
【具體實(shí)施方式】
[0014] 在下面的描述中,為了進(jìn)行說(shuō)明,闡述了很多具體細(xì)節(jié)以便提供對(duì)本發(fā)明的透徹 理解。然而,對(duì)本領(lǐng)域技術(shù)人員將顯而易見(jiàn)的是,本發(fā)明可以在沒(méi)有這些具體細(xì)節(jié)的情況下 實(shí)施。在其他情況下,以框圖形式示出結(jié)構(gòu)和設(shè)備,以便不至于使本發(fā)明變得模糊。對(duì)沒(méi)有 下標(biāo)或后綴的標(biāo)號(hào)的引用被理解為引用對(duì)應(yīng)于所引用標(biāo)號(hào)的全部下標(biāo)和后綴實(shí)例。此外, 本公開(kāi)中所使用的語(yǔ)言主要用于可讀性和指導(dǎo)目的,可能并非用于描繪或限定發(fā)明的主 題,而是借助于確定發(fā)明主題所必需的權(quán)利要求。說(shuō)明書(shū)中對(duì)"一個(gè)實(shí)施例"、"實(shí)施例"的 引用意味著結(jié)合該實(shí)施例所描述的特定特征、結(jié)構(gòu)或特性被包括本發(fā)明的至少一個(gè)實(shí)施例 中,對(duì)"一個(gè)實(shí)施例"或"實(shí)施例"的多個(gè)引用不應(yīng)該被理解為一定都引用同一個(gè)實(shí)施例。
[0015] 如此處所使用的,術(shù)語(yǔ)"可編程設(shè)備"可以是指單個(gè)可編程設(shè)備或一起協(xié)作以執(zhí)行 描述為在可編程設(shè)備上執(zhí)行或由可編程設(shè)備執(zhí)行的功能的多個(gè)可編程設(shè)備。
[0016] 雖然下面是就JAVA沙箱環(huán)境描述的,但是,下面所描述的技術(shù)不僅限于這樣的實(shí) 施例,而是可以用于任何沙箱環(huán)境中,其中通用沙箱可以在運(yùn)行時(shí)被修改,以檢測(cè)對(duì)操縱允 許在該環(huán)境中從沙箱逃逸的某些沙箱功能的嘗試。盡管下面的描述是就由JAVA沙箱所提 供的JAVA SecurityManagerO方法和EXECO方法而言給出的,但是,也可以插樁可以被確 定為可能被嘗試從沙箱逃逸的利用所使用的其他方法,以提供對(duì)利用的附加檢測(cè)。
[0017] 下面的有關(guān)的利用是嘗試逃逸由沙箱環(huán)境施加的限制的利用。還可以使用類(lèi)似的 技術(shù)來(lái)檢測(cè)可能利用沙箱環(huán)境的其他弱點(diǎn)但是不嘗試從沙箱逃逸的惡意軟件,不管利用的 本質(zhì)如何,在該技術(shù)中,沙箱實(shí)現(xiàn)大多數(shù)這樣的利用會(huì)使用的功能。然而,不管用于逃逸嘗 試的技術(shù)如何,尋求從沙箱逃逸的惡意軟件都可能需要利用特許的方法來(lái)在沙箱之外運(yùn)行 代碼。因此,下面所描述的技術(shù)插樁惡意軟件所使用的方法,以獲取由沙箱限制的特權(quán),并 被證明在檢測(cè)并允許結(jié)束所有這樣的逃逸嘗試方面是有效的。
[0018] 沙箱通常是用于保護(hù)在其上實(shí)現(xiàn)沙箱的系統(tǒng)的資源的規(guī)則集合。沙箱可以實(shí)現(xiàn)不 同級(jí)別的保護(hù),其中不同級(jí)別允許訪問(wèn)不同資源集合。最小的沙箱允許剛剛夠程序運(yùn)行的 資源,而開(kāi)放的沙箱可能允許訪問(wèn)主機(jī)系統(tǒng)通常可以訪問(wèn)的所有資源。典型的沙箱可能允 許在沙箱中運(yùn)行的程序訪問(wèn)處理器、其自己的存儲(chǔ)器,并訪問(wèn)該程序加載而來(lái)的web服務(wù) 器。
[0019] 應(yīng)用可以使用此處被稱(chēng)為利用(exploit)的技術(shù),以獲得或修改被給予應(yīng)用的權(quán) 限或特權(quán),或者修改、關(guān)閉、或禁用其他安全控制。沙箱使用權(quán)限、特權(quán)以及安全控制來(lái)控制 對(duì)資源的訪問(wèn),并且通常限制對(duì)在沙箱中運(yùn)行的應(yīng)用可用的權(quán)限、特權(quán)以及安全控制。利用 通常利用沙箱環(huán)境中的弱點(diǎn)或瑕疵。獲得或修改權(quán)限、特權(quán)或安全控制是利用的一部分。從 沙箱逃逸的嘗試被定義為如下嘗試:使用那些權(quán)限、特權(quán)或安全控制來(lái)執(zhí)行被沙箱環(huán)境阻 止的動(dòng)作。當(dāng)應(yīng)用執(zhí)行動(dòng)作成功時(shí),諸如在沙箱環(huán)境之外執(zhí)行代碼,實(shí)際的逃逸發(fā)生。下面 所描述的技術(shù)提供了檢測(cè)從沙箱環(huán)境逃逸的嘗試的方式,允許沙箱環(huán)境防止那些動(dòng)作被執(zhí) 行。
[0020] 圖1是示出了根據(jù)一個(gè)實(shí)施例的在移動(dòng)設(shè)備100上運(yùn)行的JAVA環(huán)境的框圖,其中 下面所描述的監(jiān)視技術(shù)被用來(lái)檢測(cè)和防止JAVA程序從沙箱逃逸。JAVA虛擬機(jī)(JVM) 140提 供運(yùn)行時(shí)環(huán)境,其中可以執(zhí)行JAVA字節(jié)碼。JVM 140通常與JAVA類(lèi)庫(kù)一起分布,JAVA類(lèi)庫(kù) 是實(shí)現(xiàn)JAVA應(yīng)用編程接口(API) 152的標(biāo)準(zhǔn)類(lèi)庫(kù)集合(以JAVA字節(jié)碼表示)。這些庫(kù),與 JVM 140綁定,形成JAVA運(yùn)行時(shí)環(huán)境(JRE) 150。
[0021] 打算在JVM上運(yùn)行的源代碼文件110中的JAVA源代碼程序,以標(biāo)準(zhǔn)化可移植二進(jìn) 制格式(通常采用.class文件的形式(JAVA類(lèi)文件))被編譯為Java字節(jié)碼文件120。程 序可以在不同的文件中包括許多類(lèi)。為了更加容易分發(fā)大型程序,多個(gè)類(lèi)文件可以以.jar 文件(JAVA檔案)封裝在一起。然后,由JVM 140中的字節(jié)碼驗(yàn)證器144,驗(yàn)證這些字節(jié)碼 文件120。雖然被示為實(shí)際文件,但是源代碼文件和字節(jié)碼文件中的任何一種或兩種可以不 是可編程設(shè)備100的文件系統(tǒng)的文件,而可以是作為輸入提供到JAVA編譯器或JVM 140的 存儲(chǔ)器中表不。
[0022] JVM 140通常包括執(zhí)行無(wú)用單元收集(garbage collection)的存儲(chǔ)器管理器 142、字節(jié)碼驗(yàn)證器144,以及解釋器/即時(shí)(just-in-time,JIT)編譯器146。JVM 140運(yùn)行 時(shí)執(zhí)行.class或.jar文件120,通過(guò)解釋JVM指令集或使用即時(shí)編譯器(JIT)來(lái)模擬JVM 指令集。當(dāng)今,JIT編譯(而非解釋?zhuān)┯糜诖蠖鄶?shù)JVM 140中,以實(shí)現(xiàn)更快的速度。還有允 許開(kāi)發(fā)人員將類(lèi)文件預(yù)編譯為針對(duì)特定平臺(tái)的本機(jī)代碼的"提前"編譯器。
[0023] 由字節(jié)碼驗(yàn)證器144驗(yàn)證字節(jié)碼文件120,以確定字節(jié)碼是安全的,以便沒(méi)有在 JVM 140中運(yùn)行的程序能使可編程設(shè)備100崩潰或以其它方式不適當(dāng)?shù)馗蓴_可編程設(shè)備 100上的其他操作。防止屬于受信任代碼的某些方法和數(shù)據(jù)結(jié)構(gòu)被在同一個(gè)JVM 140內(nèi)執(zhí) 行的不受信任代碼訪問(wèn)或損壞。此外,還不允許常常會(huì)導(dǎo)致數(shù)據(jù)損壞或不可預(yù)測(cè)行為的常 見(jiàn)程序員錯(cuò)誤(諸如在陣列的末端之外訪問(wèn)或使用未初始化的指針)發(fā)生。
[0024] JVM驗(yàn)證器144在字節(jié)碼被執(zhí)行之前驗(yàn)證全部字節(jié)碼。此驗(yàn)證主要包括三種類(lèi)型 的檢查:(a)分支總是通向有效位置;(b)數(shù)據(jù)總是被初始化,引用總是是類(lèi)型安全的;以 及,(c)嚴(yán)格地控制對(duì)私有的或封裝私有的數(shù)據(jù)和方法的訪問(wèn)。這些檢查中的頭兩個(gè)主要 在驗(yàn)證步驟過(guò)程中發(fā)生,驗(yàn)證步驟在加載類(lèi)并使其適于使用時(shí)發(fā)生。第三個(gè)主要在一類(lèi)數(shù) 據(jù)項(xiàng)或方法首次被另一類(lèi)訪問(wèn)時(shí)動(dòng)態(tài)地執(zhí)行。
[0025] 驗(yàn)證器144只允許有效程序中的某些字節(jié)碼序列,例如,跳躍(分支)指令只能指 向同一個(gè)方法內(nèi)的指令。
[0026] 雖然在圖1中示出了移動(dòng)設(shè)備100,但是能夠支持JVM 1