《移動(dòng)代碼安全》ppt課件_第1頁
《移動(dòng)代碼安全》ppt課件_第2頁
《移動(dòng)代碼安全》ppt課件_第3頁
《移動(dòng)代碼安全》ppt課件_第4頁
《移動(dòng)代碼安全》ppt課件_第5頁
已閱讀5頁,還剩95頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 第第13章章 挪動(dòng)代碼平安挪動(dòng)代碼平安 13.1 引言引言 13.2 挪動(dòng)代碼平安技術(shù)挪動(dòng)代碼平安技術(shù) 13.3 Java平安平安 第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 13.1 引引 言言 挪動(dòng)代碼又稱挪動(dòng)代理、可下載代碼、可執(zhí)行內(nèi)容、遠(yuǎn)程代碼等等,它是指在本地執(zhí)行的遠(yuǎn)程代碼。傳統(tǒng)系統(tǒng)中,執(zhí)行的代碼都是駐留在執(zhí)行代碼的主機(jī)上,而對于挪動(dòng)代碼,執(zhí)行的代碼那么是來自遠(yuǎn)程主機(jī)。 Carzaniga等人1將挪動(dòng)代碼進(jìn)展了分類并與傳統(tǒng)的基于客戶機(jī)效力器技術(shù)的分布式系統(tǒng)作了比較:第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 1 客戶機(jī)效力器模型:客戶機(jī)和效

2、力器位于不同的主機(jī)上,由客戶機(jī)向效力器發(fā)送懇求;處置懇求所需的資源和代碼都位于效力器端。 2 即時(shí)呼應(yīng)代碼Code-on-Demand:客戶機(jī)擁有完成某項(xiàng)操作的資源,但沒有如何完成這項(xiàng)操作的代碼,客戶機(jī)經(jīng)過向遠(yuǎn)程效力器發(fā)送懇求,由效力器將代碼發(fā)送給客戶機(jī)。這種類型的挪動(dòng)代碼包括:Java運(yùn)用程序、ActiveX控件、MIMI Tcl擴(kuò)展和Postscript等。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 3 遠(yuǎn)程計(jì)算:客戶機(jī)擁有描畫某項(xiàng)效力的代碼,而執(zhí)行代碼所需的資源位于遠(yuǎn)程效力器上??蛻魴C(jī)把代碼發(fā)送到效力器上,由效力器執(zhí)行代碼并把結(jié)果回送到客戶機(jī)。 4 挪動(dòng)代理:客戶機(jī)進(jìn)程在執(zhí)行期間為了完成

3、某項(xiàng)效力需求訪問一些資源,而這些資源位于遠(yuǎn)程效力器上,于是客戶機(jī)把客戶機(jī)進(jìn)程移植到效力器端并由效力器完效果勞??蛻魴C(jī)進(jìn)程會(huì)不斷停留在效力器上直到下一個(gè)客戶機(jī)進(jìn)程移植過來。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 Java運(yùn)用程序Applet和代理Agent是挪動(dòng)代碼中的兩種主要方式。Java運(yùn)用程序是用戶把代碼從遠(yuǎn)程主機(jī)下載到本地執(zhí)行。這種技術(shù)在Web閱讀器中嵌入了Java虛擬機(jī)。這樣,Web發(fā)布者就可以向用戶提供動(dòng)畫、游戲等動(dòng)態(tài)內(nèi)容,而不僅僅提供靜態(tài)的HTML頁面或依賴于帶寬的CGI交互式內(nèi)容。而代理那么相反,用戶是把代碼發(fā)送到網(wǎng)絡(luò)上以完成用戶所需的某項(xiàng)義務(wù)。最早的挪動(dòng)代理系統(tǒng)之一是Tel

4、escript。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 從上面的討論可以看出,挪動(dòng)代碼是由一方生成,但在另一方控制的環(huán)境中運(yùn)轉(zhuǎn)的代碼。這就會(huì)帶來平安問題。如對于Java運(yùn)用程序,用戶在執(zhí)行它來實(shí)現(xiàn)某些操作的同時(shí)要承當(dāng)惡意代碼破壞系統(tǒng)的風(fēng)險(xiǎn),而代理那么要維護(hù)其代碼免受惡意主機(jī)的利用。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 13.2 挪動(dòng)代碼平安技術(shù)挪動(dòng)代碼平安技術(shù) 挪動(dòng)代碼會(huì)導(dǎo)致平安問題的本質(zhì)在于在運(yùn)轉(zhuǎn)代碼時(shí)需求訪問系統(tǒng)資源,而代碼卻是來自于另一臺(tái),甚至是不可信的主機(jī)。即代碼提供者和代碼運(yùn)轉(zhuǎn)者之間能夠是互不信任的。挪動(dòng)代碼易遭到以下幾種類型的攻擊2: 1 走漏用戶或主機(jī)的信息; 2 回絕

5、效力:使合法用戶無法獲得資源;第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 3 破壞或修正數(shù)據(jù); 4 惡作劇攻擊:如在用戶屏幕上顯示圖片或在用戶主機(jī)上播放音樂等。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 挪動(dòng)代碼平安需求思索以下幾個(gè)方面:1 訪問控制:規(guī)定誰可以運(yùn)用代碼;2 用戶認(rèn)證:識別合法用戶;3 數(shù)據(jù)完好性:保證代碼在傳輸過程中未被修正正;4 不可抵賴:發(fā)送者和接納方不能否認(rèn)運(yùn)用過代碼;5 數(shù)據(jù)性:維護(hù)敏感數(shù)據(jù);6 審計(jì):跟蹤挪動(dòng)代碼的運(yùn)用。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 在前面提到,挪動(dòng)代碼平安可以從兩個(gè)方面思索:一是惡意代碼對本地系統(tǒng)的破壞;二是遠(yuǎn)程惡意主機(jī)對代理的非法運(yùn)

6、用。接下來,我們將從惡意代碼和惡意主機(jī)兩個(gè)方面來討論挪動(dòng)代碼的平安技術(shù)3。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 13.2.1 惡意代碼 對于Java運(yùn)用程序類的挪動(dòng)代碼,普通的操作是用戶下載可執(zhí)行格式的二進(jìn)制Applet然后運(yùn)轉(zhuǎn)。這就很容易帶來平安問題:用戶必需允許不可信的代碼在本機(jī)運(yùn)轉(zhuǎn),而這些代碼能夠會(huì)隨機(jī)寫內(nèi)存,從而導(dǎo)致系統(tǒng)解體;代碼甚至可以讀、修正以致刪除用戶個(gè)人文件。 在運(yùn)轉(zhuǎn)Applet之前進(jìn)展認(rèn)證可以處理這個(gè)問題。經(jīng)過認(rèn)證,用戶就可以確定它所運(yùn)轉(zhuǎn)的代碼來自于特定的可信源。但是這種方法帶來了兩個(gè)問題:第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 1 嚴(yán)重限制了用戶可以運(yùn)轉(zhuǎn)的Appl

7、et必需來自可信源,而不可信效力器也可提供有用的、好的代碼; 2 更重要的是來自可信源的代碼能夠存在bug,從而對用戶系統(tǒng)帶來惡劣的影響。 對這個(gè)問題的理想處理方法就是阻止不平安的行為。接下來討論三種處理惡意代碼問題的技術(shù):平安解釋器、缺點(diǎn)隔離和代碼驗(yàn)證。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 1平安解釋器 直接運(yùn)轉(zhuǎn)二進(jìn)制代碼是很危險(xiǎn)的,處理這個(gè)問題的常用方法是不運(yùn)用編譯好的可執(zhí)行代碼,而采用解釋挪動(dòng)代碼的方法。在這種情況下,解釋器能很好地控制Applet并能檢查每一條指令和每一個(gè)形狀以決議能否執(zhí)行Applet。這樣,系統(tǒng)的平安性就在于實(shí)現(xiàn)解釋器的平安戰(zhàn)略的正確性上。平安解釋器包括Safe

8、-Tcl、Safe-Tcl擴(kuò)展、Java等等。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 2缺點(diǎn)隔離 采用平安的解釋器系統(tǒng)能很好地處理惡意代碼的問題。但是,相對編譯的機(jī)器碼而言,解釋器存在嚴(yán)重的性能缺陷:執(zhí)行Java Applet比執(zhí)行普通的二進(jìn)制代碼要慢得多。為此可以轉(zhuǎn)而采用一種稱為“沙盒sandbox的方法來獲得平安。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 在沙盒方式中,下載的不可信代碼的操作將嚴(yán)厲局限于沙盒中。沙盒是由運(yùn)轉(zhuǎn)代碼的主機(jī)特別為挪動(dòng)代碼分配的地址空間,如Web閱讀器特別為Java Applet分配的區(qū)域。這時(shí),挪動(dòng)代碼可以在沙盒中運(yùn)轉(zhuǎn),但不會(huì)超出沙盒的界限。例如,Apple

9、t不能讀取或修正存儲(chǔ)在用戶系統(tǒng)上的文件。在某種情況下,即使用戶偶爾引入了一個(gè)敵意的Applet,這個(gè)Applet也不能破壞用戶的系統(tǒng)。因此這種沙盒方式為挪動(dòng)代碼提供了一個(gè)受限的運(yùn)轉(zhuǎn)環(huán)境,在此環(huán)境中可以運(yùn)轉(zhuǎn)從開放網(wǎng)絡(luò)中獲得的不被完全信任的代碼如Applet等。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 實(shí)現(xiàn)沙盒有兩種方法: 1 插入對地址進(jìn)展條件檢查的操作,假設(shè)地址非法那么產(chǎn)生異常; 2 簡單覆蓋對應(yīng)沙盒地址的高比特位。 第一種方法更適宜調(diào)試,而第二種方法系統(tǒng)開銷小一些。 采用沙盒方式的主要缺陷是可下載的代碼不再是與平臺(tái)無關(guān)的,而與操作平臺(tái)無關(guān)本來是Java系統(tǒng)的主要設(shè)計(jì)目的之一。第第1313章

10、章 移動(dòng)代碼安全移動(dòng)代碼安全 3代碼驗(yàn)證 第三種技術(shù)是一種稱為證明攜帶碼PCCProof-Carrying Code的技術(shù)4。采用這種技術(shù)時(shí),挪動(dòng)代碼主機(jī)為Applet確定平安戰(zhàn)略,然后以Edinburgh邏輯構(gòu)造Logical Framework:用來發(fā)布平安戰(zhàn)略和對證明進(jìn)展編碼對平安戰(zhàn)略編碼并發(fā)布這個(gè)戰(zhàn)略。Java Applet作者的義務(wù)不僅是把Applet編譯成機(jī)器代碼,還要產(chǎn)生一個(gè)平安證明Safety Proof,用來證明這個(gè)代碼符合平安戰(zhàn)略中指定的平安規(guī)那么Safety Rules。 第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 當(dāng)用戶下載代碼后,它只需驗(yàn)證代碼中的證明,看能否合法并滿

11、足平安規(guī)那么就行。假設(shè)是那么加載代碼并運(yùn)轉(zhuǎn)它。 這種方法能否有效的關(guān)鍵在于哪些程序特性可以用LF表示和證明。PCC已勝利運(yùn)用于最小和最大CPU周期限制、內(nèi)存的平安運(yùn)用、網(wǎng)絡(luò)帶寬耗費(fèi)以及類型平安中。此外,為C言語的平安子集開發(fā)了PCC編譯器,它可以自動(dòng)生成平安證明。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 PCC是一種很有前景的方法,但是,它也存在一些缺陷:PCC與平臺(tái)有關(guān);LF編碼的平安戰(zhàn)略和平安證明必需和操作系統(tǒng)以及機(jī)器硬件親密聯(lián)絡(luò)。更多信息可以參考網(wǎng)站: /pcc.html。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 13.2.2 惡意主機(jī) 在討論了

12、惡意代碼問題之后,我們開場討論惡意主機(jī)問題。在挪動(dòng)代理編程中,用戶所關(guān)懷的是其代理能否被正確執(zhí)行。如一個(gè)購物代理能夠會(huì)攜帶電子現(xiàn)金,一個(gè)主機(jī)就能夠會(huì)欺騙代理使它為某些商品支付高價(jià)錢,甚至竊取代理內(nèi)的金錢。這都是用戶所要面對的平安問題。 主機(jī)為了執(zhí)行代理,需求訪問代理代碼和形狀,那么如何保證敏感數(shù)據(jù)的性,或者說如何保證代理算法被忠實(shí)地執(zhí)行呢?Chess13等人以為維護(hù)挪動(dòng)代理的限制有:第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 1 要對代理代碼或形狀的恣意部分嚴(yán)密,就必需采取加密; 2 我們無法阻止回絕效力攻擊,由于攻擊者不需求專門可信硬件的協(xié)助就可以恣意修正代理代碼或終止代理。 由此可見,要處

13、理惡意主機(jī)問題就要從以下兩個(gè)方面著手: 1 可以檢驗(yàn)篡改; 2 能阻止信息走漏。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 1檢測篡改 我們無法采用技術(shù)途徑來使代理不受破壞,但是假設(shè)能明確地識別出惡意主機(jī),那么法律的、社會(huì)的要挾就能夠阻止惡意主機(jī)的操作員破壞代理。識別惡意主機(jī)還能夠使代理的一切者因代理的損失而獲得某種程度的補(bǔ)償。 下面將引見檢測惡意主機(jī)的技術(shù),這些技術(shù)都是基于公開密鑰根底設(shè)備的,它們允許用戶、主機(jī)和代理之間相互認(rèn)證。這些技術(shù)主要是要證明一個(gè)主機(jī)確實(shí)是惡意主機(jī),因此,采用數(shù)字簽名非常重要。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 1 執(zhí)行跟蹤??梢越?jīng)過產(chǎn)生代理程序執(zhí)行跡的方法來

14、檢測篡改。首先,將代理代碼的指令分成兩類:只依賴于代理內(nèi)部形狀的指令以及其結(jié)果依賴于和計(jì)算環(huán)境交互的指令。對于前一類指令,效力器只需在代理的任一變量的值發(fā)生變化時(shí),才在執(zhí)行跡中記錄其新值;對于后一類指令,不但要記錄這些新值,還需求對這些值進(jìn)展數(shù)字簽名。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 一旦執(zhí)行終了,效力器就計(jì)算整個(gè)執(zhí)行跡的密碼散列值并將它前往給代理的一切者。這時(shí),假設(shè)代理一切者疑心在執(zhí)行代理時(shí)有違規(guī)操作,它就可以要求出示執(zhí)行跡,那么主機(jī)執(zhí)行代理時(shí)就必需生成執(zhí)行跡執(zhí)行跡的散列值可被驗(yàn)證,然后檢驗(yàn)執(zhí)行跡就可確定: 主機(jī)能否錯(cuò)誤地執(zhí)行了只依賴于內(nèi)部形狀的指令; 主機(jī)執(zhí)行代理過程中,在與計(jì)算

15、環(huán)境交互時(shí)能否欺騙了代理。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 這種方法在實(shí)踐的操作中存在兩個(gè)問題: a 這種方法在主機(jī)違規(guī)操作時(shí)不會(huì)向代理一切者發(fā)出警報(bào),而只需在一切者疑心時(shí)提供一種可驗(yàn)證的識別方法; b 在需求生成執(zhí)行跡時(shí),效力器需求保管一切的執(zhí)行跡,這就給效力器帶來了非常高的負(fù)擔(dān)。 第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 2 認(rèn)證部分結(jié)果。Yee4提出了兩種檢測惡意主機(jī)篡改代理的方法。第一種方法是采用部分結(jié)果認(rèn)證碼PRAC,發(fā)送代理的同時(shí)發(fā)送一組密鑰k1、k2、kn。在第i個(gè)效力器,代理運(yùn)用密鑰ki對其執(zhí)行結(jié)果進(jìn)展簽名并由此產(chǎn)生PARC;在轉(zhuǎn)移到下一個(gè)效力器之前,代理把ki從形

16、狀中刪除。這樣,一個(gè)惡意主機(jī)就不能偽造來自前一個(gè)效力器的部分結(jié)果,最糟糕的情況也僅僅是把這些部分結(jié)果從代理中移除。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 PRACs允許代理一切者同時(shí)擁有k1、k2、kn自動(dòng)地對前往代理中包含的每一部分結(jié)果進(jìn)展密碼驗(yàn)證。這些音訊可以保證非常好的前向完好性:設(shè)挪動(dòng)代理訪問一系列的效力器S=s1、s2、sn,而第一個(gè)惡意效力器為sc,那么對于ic,效力器si的部分結(jié)果不是偽造的。 當(dāng)效力器僅僅經(jīng)過與正在運(yùn)轉(zhuǎn)的代理進(jìn)展欺詐性的交互實(shí)現(xiàn)篡改時(shí),上述方案就無法自動(dòng)檢測到。此外,只需在代理一切者疑心主機(jī)時(shí)才會(huì)產(chǎn)生PRAC一切的PRAC都是密碼有效的,但有些能夠在語義上無

17、效。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 Yee提出了一種投機(jī)的方法來檢測語義上的篡改。對于程序x,設(shè)y為x的執(zhí)行跡。主機(jī)執(zhí)行完代理后把y發(fā)送給代理一切者,由一切者驗(yàn)證y。由于執(zhí)行跡能夠會(huì)很大,因此傳輸它的帶寬開銷會(huì)非常大。從而,主機(jī)把y編碼成全息樣片y。樣片y具有如下特性:代理一切者只需求檢查y某些位就能確信其正確與否。這樣,效力器就可以采用哈希樹的方案將樣片散列成一個(gè)小的根值,然后把根值前往給代理一切者,由一切者判別y能否正確。這種方法的主要缺陷是效力器的負(fù)荷問題。構(gòu)造全息樣片y是一個(gè)全NP問題不存在多項(xiàng)式時(shí)間算法解的一類問題,全NP問題那么是最為困難的一類,在執(zhí)行跡y大到很難傳輸?shù)?/p>

18、代理一切者時(shí),構(gòu)造y是不能實(shí)現(xiàn)的。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 2嚴(yán)密 在有些情況下,事后檢測是不適當(dāng)?shù)幕蚴遣荒芴幚韱栴}的。如有時(shí)候采用法律行動(dòng)的代價(jià)比篡改帶來的經(jīng)濟(jì)損失更大;有些時(shí)候,代理發(fā)送數(shù)字簽名,但由于某些緣由其私鑰已被走漏。為此,Sander和Tschudin13提出了一種實(shí)際上的方案以允許代理對惡意主機(jī)保管一些。 方案的本質(zhì)是這樣的:代理程序計(jì)算某個(gè)函數(shù)f,主機(jī)為代理計(jì)算fx但不需求知道f的任何本質(zhì)性的內(nèi)容。協(xié)議描畫如下:第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 1 代理一切者加密f; 2 一切者創(chuàng)建程序PEf來實(shí)現(xiàn)Ef,并把它放在代理中; 3 代理到達(dá)遠(yuǎn)程主機(jī),在

19、遠(yuǎn)程主機(jī)上計(jì)算PEfx,并把值前往給一切者; 4 一切者解密PEfx并獲得fx。 其中,E為某個(gè)加密函數(shù)。協(xié)議的根本思想是把根本算法轉(zhuǎn)化成雜亂算法,使其結(jié)果只對代理一切者有意義。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 3總結(jié) 相比惡意代碼而言,惡意主機(jī)問題更難以處置,目前還沒有實(shí)踐的、在計(jì)算上可行的方法用來檢測篡改,而一些可以用來證明發(fā)生了篡改的技術(shù)也會(huì)大大添加效力器的負(fù)荷。此外,在一個(gè)不友好的環(huán)境中運(yùn)轉(zhuǎn)代理時(shí),有沒有能夠?yàn)榇硖峁┠撤N類型的性還是一個(gè)未知數(shù)。這些問題的存在或答應(yīng)以解釋挪動(dòng)代理為什么得不到廣泛運(yùn)用。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 13.3 Java 安安 全全

20、13.3.1 Java綜述 Java言語是Sun Microsystems公司開發(fā)的。在Sun Microsystems公司提供的技術(shù)報(bào)告5中稱:“Java是一種簡單的、面向?qū)ο蟮?、適宜網(wǎng)絡(luò)編程的、解釋的、強(qiáng)壯的、平安的、與構(gòu)造無關(guān)的、可移植的、高性能的、多線程的動(dòng)態(tài)言語。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 簡單:Java是一種易于運(yùn)用的編程言語,其簡單性表達(dá)在以下幾個(gè)方面: 1 它和C+類似C+程序員可以很快掌握J(rèn)ava編程技術(shù); 2 它摒棄了C+中許多很少用、很難了解和容易混淆的特性,如操作符重載等; 第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 3 Java實(shí)現(xiàn)了自動(dòng)渣滓搜集,從而

21、簡化了Java編程。在C和C+中,一個(gè)復(fù)雜的操作是內(nèi)存管理:內(nèi)存分配和內(nèi)存釋放。經(jīng)過自動(dòng)渣滓搜集周期性的釋放沒有被援用的內(nèi)存不但可以使編程簡單化,還可大大地減少程序中的bug; 4 Java程序很小,易于經(jīng)過網(wǎng)絡(luò)下載。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 面向?qū)ο螅汉虲+一樣,Java是一種面向?qū)ο蟮木幊萄哉Z。 適宜網(wǎng)絡(luò)編程:Java擁有廣泛的、能隨便處置TCP/IP協(xié)議的運(yùn)轉(zhuǎn)庫,因此相比C和C+而言,Java更容易創(chuàng)建網(wǎng)絡(luò)銜接。Java運(yùn)用程序經(jīng)過URL翻開和訪問網(wǎng)絡(luò)上的對象與編程人員訪問本地文件系一致樣簡單。 強(qiáng)壯性:Java能檢查程序在編譯和運(yùn)轉(zhuǎn)時(shí)的錯(cuò)誤。類型檢查可以檢查出許多開發(fā)

22、早期出現(xiàn)的錯(cuò)誤;Java沒有采用C+中的指針?biāo)惴ǘ鴮?shí)現(xiàn)了真數(shù)組,從而防止了覆蓋內(nèi)存和破壞數(shù)據(jù)的能夠。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 平安:設(shè)計(jì)Java是為了用于分布式網(wǎng)絡(luò)環(huán)境,因此平安在這里就顯得非常重要。本節(jié)的后續(xù)內(nèi)容將詳細(xì)引見Java的平安實(shí)現(xiàn)以及其潛在的平安要挾。 與構(gòu)造無關(guān):Java程序是在網(wǎng)絡(luò)上傳播和運(yùn)用的,而網(wǎng)絡(luò)上的不同主機(jī)的CPU、操作系統(tǒng)構(gòu)造等等都不盡一樣,為了使Java運(yùn)用程序能在網(wǎng)絡(luò)上的任何一臺(tái)主機(jī)上運(yùn)轉(zhuǎn),編譯器必需產(chǎn)生一個(gè)與構(gòu)造無關(guān)的文件格式只需處置器上有Java虛擬機(jī)系統(tǒng),此文件格式的代碼就可以在此處置器上運(yùn)轉(zhuǎn)。Java的做法是讓編譯器生成與特定計(jì)算機(jī)體系構(gòu)

23、造無關(guān)的字節(jié)碼指令,這些字節(jié)碼指令在任何機(jī)器上都很容易解釋,并能很容易地翻譯本錢機(jī)機(jī)器代碼。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 可移植:與體系構(gòu)造無關(guān)的特性使得Java運(yùn)用程序可以在配備了Java解釋器和運(yùn)轉(zhuǎn)環(huán)境的任何計(jì)算機(jī)系統(tǒng)上運(yùn)轉(zhuǎn),這為Java運(yùn)用程序便于移植打下了良好根底。但僅僅如此還不夠,不同操作系統(tǒng)根本數(shù)據(jù)類型的設(shè)計(jì)實(shí)現(xiàn)是不同的,如在Windows 3.1中整數(shù)int為16位,在Windows 95中為32位,而在DEC Alpha中卻為64位。這不利于代碼的移植。為此,Java定義了獨(dú)立于平臺(tái)的根本數(shù)據(jù)類型及其運(yùn)算,從而使得Java數(shù)據(jù)在任何硬件平臺(tái)上都是一致的。其次,Ja

24、va編譯器本身是用Java言語編寫的,而運(yùn)算系統(tǒng)是用ANSI C言語寫的??傊?,在Java言語規(guī)范中沒有任何與詳細(xì)實(shí)現(xiàn)相關(guān)的內(nèi)容。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 解釋:Java是一種解釋性言語,其解釋器可以將Java字節(jié)碼翻譯本錢地機(jī)器指令并運(yùn)轉(zhuǎn),而不需求存儲(chǔ)字節(jié)碼。 高性能:由于解釋字節(jié)碼的性能普通都是比較高的,從而Java可以在運(yùn)轉(zhuǎn)時(shí)直接將字節(jié)碼翻譯成機(jī)器指令。Sun Microsystems的SPARCStation 10在翻譯代碼時(shí),可以在每秒鐘內(nèi)調(diào)用300 000個(gè)方法,這和直接生成機(jī)器目的代碼C/C+的性能不相上下。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 多線程:J

25、ava提供了一個(gè)內(nèi)建的機(jī)制來提供對多個(gè)并發(fā)子義務(wù)的支持。 動(dòng)態(tài):在C+程序設(shè)計(jì)過程中,每當(dāng)在類中添加一個(gè)實(shí)例變量或一種成員函數(shù)后,援用該類的一切子類都必需重新編譯,否那么將導(dǎo)致程序解體,而Java是一種動(dòng)態(tài)言語,它不是把一切的類靜態(tài)地編譯成機(jī)器碼,而是由程序動(dòng)態(tài)地裝入運(yùn)轉(zhuǎn)過程中所需求的類。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 13.3.2 Java底層平安性實(shí)現(xiàn) 1. 底層平安 Java解釋器經(jīng)過以下幾種方式實(shí)現(xiàn)底層平安: 1 經(jīng)過發(fā)布源代碼獲得平安 假設(shè)需求,Java解釋器和編譯器均可獲得完好的源代碼。對Java源代碼可以執(zhí)行平安審計(jì)。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 2 經(jīng)

26、過明確定義獲得平安 Java言語的定義非常嚴(yán)厲: 保證一切的根本類型運(yùn)用指定的長度; 一切的操作必需按指定的順序執(zhí)行。 明確的定義可以保證兩個(gè)正確的Java編譯器執(zhí)行同一個(gè)程序不會(huì)得到兩個(gè)不同的結(jié)果。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 3 經(jīng)過摒棄指針獲得平安 Java摒棄了C言語中的指針?biāo)惴?,因此編程人員無法偽造指針來訪問內(nèi)存。對類文件中一切方法和實(shí)例變量的援用都是經(jīng)過符號名來實(shí)現(xiàn)的,這就可以防止在C言語中利用指針非法訪問內(nèi)存而提升權(quán)限一類的攻擊,如緩沖區(qū)溢出等。 第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 4 經(jīng)過渣滓搜集獲得平安 在C/C+中,編程人員經(jīng)常面對的問題是內(nèi)存分配和釋

27、放。當(dāng)釋放內(nèi)存不當(dāng),如沒有釋放不再運(yùn)用的內(nèi)存或兩次釋放同一內(nèi)存區(qū)會(huì)導(dǎo)致平安問題。Java經(jīng)過自動(dòng)渣滓搜集周期性地釋放沒有被援用的內(nèi)存來防止這些問題。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 5 經(jīng)過在編譯時(shí)的嚴(yán)厲檢查獲得平安 Java編譯器在編譯時(shí)要進(jìn)展詳盡的、嚴(yán)厲的檢查以盡能夠地檢測編程中的錯(cuò)誤。Java言語是強(qiáng)類型的: 在運(yùn)轉(zhuǎn)期,假設(shè)不進(jìn)展明確的檢查不能把對象分配給某個(gè)子類; 要檢查一切對方法和變量的援用以確保對象具有適宜的類型。 整數(shù)不能轉(zhuǎn)換為對象,對象也不能轉(zhuǎn)換為整數(shù)。 編譯器還要確保程序沒有訪問未初始化的本地變量。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 2. 類文件驗(yàn)證 雖然編

28、譯器可對類型進(jìn)展詳盡的檢查,但攻擊者依然能夠經(jīng)過運(yùn)用專門的編譯器實(shí)現(xiàn)攻擊。如HotJava閱讀器是下載曾經(jīng)編譯好的類文件,它無法確定下載的字節(jié)碼是由可信的Java編譯器編譯的還是由某個(gè)有惡意企圖的編譯器編譯的。 第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 在編譯時(shí)實(shí)現(xiàn)對類型的檢查還存在版本不一致的問題。如用戶編譯好了一個(gè)類,假設(shè) PurchaseStockOptions是TradingClass的一個(gè)子類。但是在類編譯完后,TradingClass的定義能夠會(huì)發(fā)生變化:某個(gè)方法不用了或方法的參數(shù)改動(dòng)了;變量類型變了。而且,方法或變量也能夠從公有變成私有。 為此,一切外來的類文件都需求經(jīng)過一個(gè)驗(yàn)

29、證器,由驗(yàn)證器確保類文件具有正確的格式。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 字節(jié)碼驗(yàn)證器同樣可以加強(qiáng)解釋器的性能。利用字節(jié)碼驗(yàn)證,解釋器就不用對每一條解釋的指令進(jìn)展檢查,而會(huì)以為這些檢查都曾經(jīng)在此之前完成了。如解釋器能一定代碼遵守以下限制: 代碼中不存在緩沖區(qū)溢出; 一切的存放器訪問和存儲(chǔ)都是合法的; 一切字節(jié)碼的參數(shù)都是正確的; 不存在非法的數(shù)據(jù)轉(zhuǎn)換。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 驗(yàn)證器獨(dú)立于Java編譯器,它運(yùn)用戶可以放心的從防火墻之外下載Java代碼。 下面詳細(xì)引見驗(yàn)證器的驗(yàn)證過程,其中提到的類文件格式的詳細(xì)細(xì)節(jié)可參考參考資料5: 1 驗(yàn)證的第一步發(fā)生在將類讀入解釋

30、器時(shí)。這一步要確保類文件具有類文件的格式:開場的幾個(gè)字節(jié)必需包含正確的魔幻數(shù);一切可驗(yàn)證的屬性都具有正確的長度;類文件的末尾不能被截?cái)?,也不能添加額外的字節(jié);常數(shù)存儲(chǔ)庫不能包含不可識別的信息。 第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 2 第二步更進(jìn)一步驗(yàn)證類文件的格式: 確保final類沒有被承繼,final方法沒有被覆蓋; 每個(gè)類必需有一個(gè)超類; 確保常數(shù)存儲(chǔ)庫滿足一定的限制,如其中的類援用必需包含一個(gè)指向存儲(chǔ)庫中的一個(gè)unicode字符串援用的域。 常數(shù)存儲(chǔ)庫中一切的域援用和方法援用都必需有合法的名字、合法的類和合法的類型簽名。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 3 這一步是類

31、驗(yàn)證中最復(fù)雜的一步,在這一步中需求驗(yàn)證每一個(gè)方法的字節(jié)碼。這一步要保證: 堆棧的大小和它包含的對象類型堅(jiān)持不變; 除非包含了一個(gè)適當(dāng)類型的值,否那么不能訪問存放器; 以適當(dāng)?shù)膮?shù)調(diào)用方法; 以適當(dāng)類型的值修正域; 一切的操作碼在堆棧和存放器中具有適當(dāng)類型的參數(shù)。在“字節(jié)碼驗(yàn)證中我們將進(jìn)一步描畫這一步的細(xì)節(jié)。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 4 在第三步中,除非有必要,否那么不會(huì)裝載類文件。如一個(gè)方法調(diào)用另一個(gè)前往foobarType類型對象的方法時(shí),假設(shè)立刻把同一類型的域分配給前往的對象,驗(yàn)證器就不會(huì)驗(yàn)證foobarType類型能否存在;假設(shè)把a(bǔ)notherType類型的域分配給前往

32、的對象,那么必需裝載foobarType和anotherType的定義以確保foobarType是anotherType的一個(gè)子類。 援用類的指令第一次執(zhí)行時(shí),驗(yàn)證器需:第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 假設(shè)還沒有裝載這個(gè)類那么裝載; 驗(yàn)證當(dāng)前正在執(zhí)行的類能否被允許援用給定的類。 指令第一次調(diào)用方法或訪問、修正域時(shí),驗(yàn)證器需: 確保方法或域存在于給定的類中; 檢查方法或域能否具有要求的簽名; 檢查當(dāng)前正在執(zhí)行的方法能否有權(quán)訪問給定的方法或域。 第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 這一步中,驗(yàn)證器不需求檢查堆棧中對象的類型,由于在第三步中曾經(jīng)執(zhí)行了這項(xiàng)檢查。 在執(zhí)行完驗(yàn)證后,字

33、節(jié)碼流中的指令就會(huì)被另一種方式的指令所替代。如操作碼new被new_quick替代。這個(gè)交換的指令表示曾經(jīng)執(zhí)行了對這個(gè)指令的驗(yàn)證,不需求再次驗(yàn)證了。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 3字節(jié)碼驗(yàn)證 類文件驗(yàn)證的第三步是字節(jié)碼驗(yàn)證,這是類文件驗(yàn)證過程中最復(fù)雜的一步。首先,把組成虛指令的字節(jié)分成一系列的指令,每一個(gè)指令開場位置的偏移量保管在一個(gè)位表中。然后,驗(yàn)證器再次掃描這些字節(jié)并解析指令。這一步中把每個(gè)指令轉(zhuǎn)換成一個(gè)構(gòu)造。檢查每個(gè)指令的參數(shù)假設(shè)有的話以確保它們是合理的: 一切的流程控制指令必需到達(dá)一個(gè)指令的開場,不允許有到達(dá)指令內(nèi)部的分支。類似的,不允許出現(xiàn)到達(dá)代碼開場前或代碼終了后的分

34、支。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 一切的存放器援用必需是援用合法的存放器。除方法指明的所能用的存放器外,代碼不能訪問和修正任何其它的存放器。 一切對常數(shù)存儲(chǔ)庫的援用必需是援用適當(dāng)類型的條目。如操作碼ldc1只能用于整數(shù)、浮點(diǎn)數(shù)或string類型,而操作碼getfield必需援用一個(gè)域。 代碼不能在某個(gè)指令中間終了。 對每一個(gè)異常處置程序,其起始點(diǎn)和終了點(diǎn)都必需指向一個(gè)指令的開場。異常處置器的偏移必需是合法的指令;起始點(diǎn)必需在終了點(diǎn)之前。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 對每一條指令,在執(zhí)行之前,驗(yàn)證器要跟蹤堆棧和存放器的內(nèi)容。對于堆棧,需求知道堆棧的長度和堆棧中元素的類

35、型;對于存放器,需求知道存放器內(nèi)容的類型或存放器內(nèi)的值是合法的。在確定堆棧中值的類型時(shí),字節(jié)碼驗(yàn)證器不需求區(qū)分不同的整數(shù)類型如byte、short和char。 接下來初始化數(shù)據(jù)流分析器。對于第一條指令,編號較小的存放器包含方法類型簽名所指示的類型;堆棧為空;一切其它的存放器包含非法值;對于其它指令,指示該指令沒有被訪問,還沒有其堆?;虼娣牌鞯男畔?。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 最后,運(yùn)轉(zhuǎn)數(shù)據(jù)流分析器。對每一條指令都有一個(gè)“changed位來表示這個(gè)指令能否需求查看。最初只需第一條指令設(shè)置了“changed位。數(shù)據(jù)流分析器執(zhí)行如下循環(huán): 1 找到一個(gè)設(shè)置了“changed位的虛擬機(jī)

36、器指令,假設(shè)沒有找到,那么表示該方法已被驗(yàn)證。清“changed位。 2 仿真指令對堆棧和存放器的影響: 假設(shè)指令要運(yùn)用來自堆棧的值,需確保堆棧中有足夠的元素,并且堆棧頂端元素具有適當(dāng)?shù)念愋?,否那么,?yàn)證失敗。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 假設(shè)指令運(yùn)用了存放器,需確保指定的存放器包含了適當(dāng)類型的值,否那么,驗(yàn)證失敗。 假設(shè)指令要把值壓入堆棧,往堆棧頂端參與指示的類型,需確保堆棧有足夠的空間存放新元素。 假設(shè)指令需求修正存放器,需闡明存放器當(dāng)前包含了新的類型。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 3 確定跟隨在當(dāng)前指令后面的虛擬機(jī)器指令。后續(xù)指令能夠是: 假設(shè)當(dāng)前指令不是無條

37、件goto、return或throw,那么為下一條指令;假設(shè)可以分開最后一條指令,那么這一步失敗。 有條件或無條件轉(zhuǎn)移的目的。 當(dāng)前指令一切的異常處置程序。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 4 在當(dāng)前指令的末尾,把堆棧和存放器的形狀合并到下一條指令中。在異常處置的情況下,需求更改堆棧使得堆棧包含一個(gè)單一的對象,其異常類型由異常處置器信息指明。 假設(shè)下一條指令是第一次訪問,那么在執(zhí)行下一條指令之前指明:由第2步和第3步計(jì)算得到的堆棧和存放器的值是堆棧和存放器的形狀;設(shè)置下一條指令的“changed位。 假設(shè)指令以前訪問過,那么把第2步和第3步計(jì)算得到的堆棧和存放器的值合并到已有的值中;

38、假設(shè)有改動(dòng)那么設(shè)置“changed位。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 5 回到第1步。 字節(jié)流分析器對某些指令和數(shù)據(jù)類型,如長整數(shù)、構(gòu)建函數(shù)、異常處置程序、Try/Finally等的詳細(xì)驗(yàn)證過程可參考參考資料6。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 13.3.3 Java的沙盒模型 傳統(tǒng)的操作系統(tǒng)允許運(yùn)用程序?qū)C(jī)器有完全的訪問,因此不能信任運(yùn)轉(zhuǎn)環(huán)境。為此,平安戰(zhàn)略普通要求在運(yùn)轉(zhuǎn)一個(gè)程序之前,需求在某種程度上信任程序。如在運(yùn)轉(zhuǎn)從Web上下載的程序之前,平安戰(zhàn)略要求對程序進(jìn)展病毒檢查以及檢查源代碼以發(fā)現(xiàn)惡意代碼。這種方法存在兩個(gè)問題:第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 1

39、 建立對運(yùn)用程序信任的檢查在實(shí)踐操作中非常復(fù)雜,且非常費(fèi)時(shí)間。普通人們不會(huì)花時(shí)間去研讀源代碼以發(fā)現(xiàn)隱藏在其中的惡意行為。 2 要使病毒檢查有效,需求及時(shí)地維護(hù):病毒庫要及時(shí)更新、掃描程序要安裝在每一臺(tái)計(jì)算機(jī)上等等。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 Java采用了一種新的方法:沙盒。Java把Applet的一切操作都嚴(yán)厲限制在一個(gè)稱之為“沙盒一個(gè)由Web閱讀器專門為這個(gè)Applet分配的地址空間的區(qū)域內(nèi)。Applet在其沙盒內(nèi)可以做任何事,但超出此邊境就不能有任何操作。沙盒模型實(shí)現(xiàn)了在一個(gè)信任環(huán)境中運(yùn)轉(zhuǎn)不信任的代碼的功能。這樣,即使用戶運(yùn)轉(zhuǎn)了一個(gè)惡意的Applet,也不會(huì)給用戶帶來什么

40、損失。沙盒由幾個(gè)不同的系統(tǒng)操作組成,下面將逐一引見。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 1類裝載程序ClassLoader Java運(yùn)轉(zhuǎn)時(shí)有兩種不同的方式來裝載一個(gè)新的類。其默許機(jī)制是從本地機(jī)器上的文件中裝載一個(gè)類,這種機(jī)制不需求類裝載程序ClassLoader。另一種方式是經(jīng)過網(wǎng)絡(luò)等裝載一個(gè)類,這時(shí)需求一個(gè)相關(guān)的類裝載程序ClassLoader,由ClassLoader擔(dān)任將類的原始數(shù)據(jù)如網(wǎng)絡(luò)上傳輸?shù)淖止?jié)轉(zhuǎn)化成表示那個(gè)類的內(nèi)部數(shù)據(jù)構(gòu)造。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 類裝載程序除了要完成從網(wǎng)絡(luò)上獲得一個(gè)Applet的可執(zhí)行代碼外,還施行了命名空間的體系構(gòu)造。一個(gè)命名空間規(guī)

41、定了一個(gè)Applet能訪問JVMJava虛擬機(jī)的其它哪些部分。經(jīng)過為本地磁盤上的可信任代碼維護(hù)一個(gè)單獨(dú)的命名空間,類裝載程序可以防止不可信的Applet獲得對系統(tǒng)可信部分往往需求更多特權(quán)才干訪問的訪問權(quán)。 從網(wǎng)絡(luò)上下載的Applet不能創(chuàng)建其本人的類裝載程序,也不能調(diào)用系統(tǒng)類裝載程序中的方法。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 2驗(yàn)證器 在運(yùn)轉(zhuǎn)一個(gè)新下載的Applet之前,類裝載程序要調(diào)用驗(yàn)證器進(jìn)展類文件驗(yàn)證。 3平安管理器 平安管理器加強(qiáng)沙盒的邊境。在Applet試圖執(zhí)行能夠?qū)е卤镜貦C(jī)器解體或訪問信息的操作時(shí),JVM首先向平安管理器訊問此操作能否可以平安地執(zhí)行。只需平安管理器準(zhǔn)許了這

42、項(xiàng)操作,虛擬機(jī)才干執(zhí)行,否那么,虛擬機(jī)將產(chǎn)生一個(gè)平安異常并向Java控制臺(tái)寫出錯(cuò)信息。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 下面列舉了平安管理器制止不可信Applet執(zhí)行的部分操作: 對本地文件的讀寫; 刪除文件; 執(zhí)行操作系統(tǒng)命令或本地代碼; 載入一個(gè)直接調(diào)用本地方法的新的動(dòng)態(tài)庫; 與不是此Applet源主機(jī)的機(jī)器建立銜接; 建立一個(gè)新的進(jìn)程。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 一個(gè)運(yùn)用程序或Web閱讀器只能有一個(gè)平安管理器,這可保證一切的訪問檢查都是由一個(gè)執(zhí)行單一平安戰(zhàn)略的平安管理器來完成的。平安管理器在啟動(dòng)時(shí)載入,它不能被擴(kuò)展、重載或替代。顯然,Applet不能創(chuàng)建其本身的

43、平安管理器。 4言語特性 在Java底層平安性實(shí)現(xiàn)一節(jié)中,我們可以看出,Java具有許多可以維護(hù)平安系統(tǒng)完好性,并防止某些常見攻擊的特性。 第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 13.3.4 擴(kuò)展Java平安 Java沙盒模型可以維護(hù)終端用戶機(jī)器和網(wǎng)絡(luò)計(jì)算資源不受惡意Applet的破壞和進(jìn)展信息竊取,從而用戶可以運(yùn)轉(zhuǎn)來自網(wǎng)絡(luò)上的不可信代碼而不會(huì)有平安風(fēng)險(xiǎn)。但是沙盒模型沒有涉及其它的一些平安和嚴(yán)密性問題: 認(rèn)證可以協(xié)助確認(rèn)一個(gè)Applet確實(shí)來自其聲明的主機(jī); 數(shù)字簽名和認(rèn)證過的Applet可以提升為可信Applet,從而可以在較少的平安限制前提下運(yùn)轉(zhuǎn); 加密可以保證Applet客戶端和I

44、nternet上效力器之間傳輸數(shù)據(jù)的性。 第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 1簽署JAR文件 一切的網(wǎng)絡(luò)化系統(tǒng)都容易遭到潛在的中間人攻擊。在這種攻擊中,客戶端與網(wǎng)絡(luò)上的合法效力器進(jìn)展銜接并懇求某種操作;而攻擊者,即這里所說的中間人竊聽到這些懇求后就等待效力器的呼應(yīng),然后截獲呼應(yīng)并向客戶端發(fā)送一個(gè)偽造的應(yīng)對;這時(shí)客戶端就會(huì)根據(jù)這些偽造的信息進(jìn)展某種操作,或者運(yùn)轉(zhuǎn)攻擊者提供的程序而使攻擊者獲得對機(jī)器的訪問權(quán)。如攻擊者可察看一個(gè)基于Internet的銀行站點(diǎn);當(dāng)客戶端訪問其提供付款效力的頁面時(shí),攻擊者就可以截獲銀行的呼應(yīng),而把一個(gè)可以模擬銀行效力并可竊取用戶信譽(yù)卡副本和銀行賬號的惡意App

45、let作為呼應(yīng)發(fā)送給客戶。 第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 經(jīng)過對Applet運(yùn)用“數(shù)字簽名可以阻止這種攻擊。首先,把一切Java代碼和相關(guān)文件捆綁成一個(gè)Java檔案JAR;然后根據(jù)JAR的內(nèi)容利用數(shù)字簽名算法產(chǎn)生一個(gè)用字符串表示的數(shù)字簽名。經(jīng)過驗(yàn)證其數(shù)字簽名就可以確定這個(gè)JAR的來源,從而有效地防止了中間人攻擊。 JAR文件從某種程度上還可協(xié)助處理另外一個(gè)問題。目前,許多Java Applet需求很長時(shí)間才干下載下來。這和當(dāng)前的Internet協(xié)議有關(guān)。 第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 目前的Internet協(xié)議每次只懇求和傳送一個(gè)文件,每懇求一個(gè)文件需求一定的開銷,

46、而一個(gè)頁面和Java Applet普通都由許多小文件組成,從而能夠使得懇求文件和等待呼應(yīng)的時(shí)間比真正傳輸信息的時(shí)間還要長。采用JAR文件后,把Applet和Web頁所需求的一切信息捆綁成一個(gè)文件,從而懇求整個(gè)頁面就只需求一個(gè)懇求。對于大部分的頁面,這可大大減少下載時(shí)間。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 2靈敏的戰(zhàn)略 數(shù)字簽名可以賦予Java Applet某種可信度,從而可以放寬對某些Applet的Java平安限制。如上面提到的家庭銀行Applet,假設(shè)采用了數(shù)字簽名,它就可以在用戶硬盤上建立本人目錄以存儲(chǔ)賬號、信譽(yù)卡號、口令、個(gè)人身份號碼PIN和其它經(jīng)常要用的信息,這時(shí)的終端用戶不用

47、經(jīng)常性地重輸這些信息。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 數(shù)字簽名過的Applet可以創(chuàng)建本人的環(huán)境。假設(shè)終端用戶已提早指示Java系統(tǒng)某個(gè)特定的Web發(fā)布者是可信的,而且某個(gè)來自此Web發(fā)布者并簽名了的Applet被驗(yàn)證經(jīng)過,那么Java平安管理器就可允許這個(gè)Applet的操作超出其沙盒的范圍,也就是說,把這個(gè)Applet看成一個(gè)普通的運(yùn)用程序。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 平安管理器還可以根據(jù)對特定Web發(fā)布者的信任程度或?qū)φ麄€(gè)Internet的信任程度而執(zhí)行不同的控制戰(zhàn)略。如一個(gè)平安認(rèn)識很強(qiáng)的用戶能夠?qū)⑾到y(tǒng)配置成簽名了的Applet只能在沙盒范圍內(nèi)執(zhí)行;未簽名的Ap

48、plet根本就不允許執(zhí)行。另外一個(gè)用戶能夠?qū)⑾到y(tǒng)配置成銀行Applet只能訪問硬盤上的某個(gè)特定目錄,而一個(gè)網(wǎng)絡(luò)游戲Applet可以訪問另外一個(gè)目錄,同時(shí)一切其它的Applet只能在沙盒的范圍內(nèi)執(zhí)行。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 3審計(jì) 審計(jì)是另一個(gè)重要的平安要素。審計(jì)軟件將維護(hù)系統(tǒng)上發(fā)生的每一件事的記錄。當(dāng)出現(xiàn)錯(cuò)誤時(shí)無論是偶爾還是由于bug,或者是由于攻擊呵斥的,系統(tǒng)管理員和平安人員就可以根據(jù)審計(jì)跡推測出所發(fā)生的事,從而可以協(xié)助他們確定如何防止錯(cuò)誤的再次發(fā)生。雖然審計(jì)不能阻止事故和攻擊,但在錯(cuò)誤發(fā)生后,它是把事情弄清楚的重要工具。 目前版本的Java審計(jì)功能很有限,還沒有管理員可

49、以依賴的審計(jì)才干,而且其記錄的特征很不詳細(xì)。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 4加密 雖然沙盒模型和對Applet的數(shù)字簽名可以阻止惡意Applet的破壞和中間人攻擊,但在Internet上,Applet和效力器之間的信息傳輸依然易遭到竊聽。這是由于Internet本身就是一個(gè)不平安的傳輸煤質(zhì)。攻擊者在Internet的關(guān)鍵點(diǎn)可以獲得經(jīng)過該關(guān)鍵點(diǎn)的一切的信息。由此,攻擊者可以偵聽出入一個(gè)銀行的一切流量,也可以只獲取經(jīng)過的信譽(yù)卡號和其它一些信息。為了防止這種攻擊,我們需求對Applet和效力器之間的一切流量進(jìn)展加密,從而使它不可讀。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 13.3.

50、5 Java平安開發(fā)建議 雖然Sun聲稱Java是一種平安言語,而且Java也采用了一些平安構(gòu)造以及內(nèi)建了一些平安特性,但是Java仍無法防止平安問題,其運(yùn)用程序中仍存在大量的平安破綻和隱患。為了運(yùn)用Java開發(fā)平安的程序,可參考以下建議101112。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 1 限制對類、方法和變量的訪問 把類、方法和變量聲明為公有會(huì)給攻擊者提供潛在的入口。為此:a 不要運(yùn)用公共域或變量,把它們聲明為私有的,并提供訪問函數(shù)以限制對它們的訪問;b 除非有很好的理由,否那么把方法都設(shè)為私有的假設(shè)確實(shí)沒這樣做,說清楚其理由。非私有的方法能夠會(huì)接納受污染的數(shù)據(jù),因此必需維護(hù)這些方法

51、除非曾經(jīng)用其它方式對它們進(jìn)展了維護(hù)。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 2 防止運(yùn)用靜態(tài)域變量 靜態(tài)域變量是附著在類而非類的實(shí)例上,而類可以被其它類所定位,其結(jié)果就是可以經(jīng)過其它類找到靜態(tài)域變量,這就很難保證它們的平安。 3 永遠(yuǎn)不要把可變對象前往給潛在的有惡意代碼由于代碼能夠會(huì)改動(dòng)它 留意,數(shù)組是可變的即使數(shù)組的內(nèi)容不可變,所以不要前往一個(gè)含有敏感數(shù)據(jù)的內(nèi)部數(shù)組的援用。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 4 永遠(yuǎn)不要直接保管用戶給定的可變對象包括對象的數(shù)組 假設(shè)直接保管用戶給定的可變對象,用戶可以把對象交給平安代碼,讓平安代碼“檢查對象,并在平安代碼試圖運(yùn)用數(shù)據(jù)時(shí)改動(dòng)數(shù)據(jù)。應(yīng)

52、該在內(nèi)部存儲(chǔ)數(shù)組前復(fù)制它們,而且要小心例如,警惕用戶編寫的復(fù)制例程。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 5 不要依賴于初始化 許多Java開發(fā)人員以為假設(shè)不運(yùn)轉(zhuǎn)構(gòu)建器就無法為一個(gè)對象分配內(nèi)存,這是不對的,現(xiàn)實(shí)上有許多方法可以為未初始化的對象分配內(nèi)存。防止這個(gè)問題的一個(gè)簡一方法就是書寫本人的類,從而在對象進(jìn)展某項(xiàng)操作前驗(yàn)證對象。其做法為 使一切的變量為私有。假設(shè)要允許外部代碼訪問一個(gè)對象內(nèi)的變量,可以經(jīng)過set和get方法來實(shí)現(xiàn)這就使外部代碼不能訪問未初始化的對象。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 為每一個(gè)對象添加一個(gè)新的私有布爾變量initialized。 在前往之前讓每一個(gè)

53、構(gòu)建器設(shè)置初始化的變量作為最后一個(gè)操作。 在進(jìn)展進(jìn)一步操作之前,讓每一個(gè)nonconstructor方法驗(yàn)證initialized為真。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 假設(shè)本人書寫的類具有靜態(tài)的初始化程序,那么需求在類的層次做同樣的操作。也就是說,對于任何一個(gè)具有靜態(tài)初始化程序的類,需求: 使一切的靜態(tài)變量私有。假設(shè)要允許外部代碼訪問類中的靜態(tài)變量,可以經(jīng)過靜態(tài)set和get方法來實(shí)現(xiàn)這就使外部代碼不能訪問未初始化的靜態(tài)變量。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 為類添加一個(gè)新的私有靜態(tài)布爾變量classInitialized。 在前往之前讓靜態(tài)構(gòu)建器設(shè)置初始化的變量作為最后

54、一步操作。 在進(jìn)展進(jìn)一步操作之前,讓每一個(gè)靜態(tài)方法和每一個(gè)構(gòu)建器驗(yàn)證classInitialized為真。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 6 除非有很好的理由,否那么使每件事都final終結(jié) 假設(shè)某個(gè)類或方法不是final的,攻擊者就可以用某種危險(xiǎn)且無法預(yù)知的方法來擴(kuò)展它。留意,作為平安性的交換,這會(huì)帶來可擴(kuò)展性的喪失。 7 不要在平安性上依賴包的范圍 在同一個(gè)包內(nèi)可以訪問沒有明確標(biāo)志為public、private或protected的類、方法和變量。Java類不是封鎖的,因此,攻擊者可以向包中引入一個(gè)新類,并用此新類來訪問用戶以為維護(hù)了的信息。某些類,如java.lang,缺省是

55、封鎖的,而且某些Java虛擬機(jī)JVM會(huì)讓用戶封鎖其它包,但最好假設(shè)包不是封鎖的。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 8 不要運(yùn)用內(nèi)部類 有些Java言語的書上稱只需封裝內(nèi)部類的類才可以訪問被封裝的內(nèi)部類,這是不正確的,由于Java字節(jié)碼沒有內(nèi)部類的概念,在內(nèi)部類轉(zhuǎn)換為字節(jié)代碼時(shí),會(huì)被轉(zhuǎn)換為這個(gè)包中恣意代碼可以訪問的類。更糟的是,被封裝類的私有域會(huì)靜悄然地變成非私有的,從而允許內(nèi)部類訪問!第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 9 最小化特權(quán)和防止標(biāo)志代碼 運(yùn)轉(zhuǎn)沒有標(biāo)志的代碼不需求任何專門的特權(quán)。沒有專門特權(quán)的代碼不會(huì)帶來什么危害,為此應(yīng)防止標(biāo)志代碼。但是有時(shí)代碼需求獲得和運(yùn)用特權(quán)以

56、執(zhí)行某種危險(xiǎn)的操作,此時(shí)應(yīng)使代碼特權(quán)最小化,同時(shí)應(yīng)更仔細(xì)地審閱特權(quán)代碼。 第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 10 假設(shè)一定要標(biāo)志代碼,應(yīng)該把它們都放在一個(gè)檔案文件里 此規(guī)那么的目的是防止攻擊者運(yùn)用混合匹配攻擊。在混合匹配攻擊中,攻擊者構(gòu)建新Applet或庫,把某些標(biāo)志類與有惡意的類銜接在一同,或把根本認(rèn)識不到會(huì)被一同運(yùn)用的標(biāo)志類銜接在一同。經(jīng)過把一組類標(biāo)志在一同,就可以使這種攻擊更高明?,F(xiàn)有的代碼標(biāo)志系統(tǒng)在防止混合匹配攻擊上做得還不夠,所以這一規(guī)那么還不能完全防止此類攻擊。但運(yùn)用單個(gè)檔案沒什么害處。第第1313章章 移動(dòng)代碼安全移動(dòng)代碼安全 11 使類不可被復(fù)制 Java的類復(fù)制機(jī)制允許攻擊者不運(yùn)轉(zhuǎn)構(gòu)建函數(shù)就實(shí)例化

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論