java 安全沙箱模型詳解(轉)

起到第一道安全保障作用的”雙親委派類加載模型”

雙親委派方式的類加載,指的是優先從頂層啓動類加載器開始,自頂向下的方式加載類的模型(參見第一條類裝載器體系結構)。

這種模型的好處是,底層的類裝載器裝載的類無法與頂層類裝載器裝載的類相互調用。
哪怕是同包下的類,只要他們不屬於同一類裝載器,都是相互隔絕的。這對一些有安全隱患的類起到了安全隔離的作用。使它不能冒充系統類來破壞程序正常運作。

此外,不同的類裝載器,也有自己的類裝載範圍。比如啓動類裝載器,它只會裝在jdk/lib目錄下的包/類,因此,系統級的類是相對安全的。

java類加載模型

class文件校驗器,通過四趟掃描,保證了class文件正確

第一趟是,檢查class文件的結構是否正確。比較典型的就是,檢查class文件是否以魔數OxCAFEBABE打頭。
通過這趟檢查,可以過濾掉大部分可能損壞的,或者壓根就不是class的文件,來冒充裝載。

第二趟是,檢查它是否符合java語言特性裏的編譯規則。比如發現一個類的超類不是Object,就拋出異常。

第三趟是,檢查字節碼是否能被JVM安全的執行,而不會導致JVM崩潰。這裏提到了一個停機的問題。內容是這樣的,“即不可能寫出一個程序,用它來判定作爲其輸入而讀入的某個程序,是否會停機”。意思是,不可能寫一個程序,讓它告訴你,另外一個程序會不會中斷或崩潰。

第四趟是,符號引用驗證。一個類文件,它會包含它引用的其他類的全名和描述符,並跟他們建立符號引用(一種虛擬的,非物理連接的方式)。當程序第一次執行到需要符號引用的位置時,jvm會檢查這個符號鏈接的正確性,然後建立真正的物理引用(直接引用)。

jvm類型安全特性

這些都是基礎的java語言特性,他們降低了java程序出現內存混亂,崩潰的機率。
結構化內存訪問(不使用指針,一定程度上讓黑客無法篡改內存數據)
自動垃圾收集
數組邊界檢查
空引用檢查
數據類型安全

Java api的安全管理器 securityManager

這是安全沙箱中,離我們程序員最接近的一環。
securityMananger,是一個api級別的,可自定義的安全策略管理器,它深入到java api中,在各處都可以見到它的身影。比如SecurityClassLoader。

默認情況下,java應用程序是不設置 securityManager 實例的(意味着不會起到安全檢查),這個實例需要我們在程序啓動時通過 System.setSecurityManager 來設置。

一般情況下,檢查權限是,通過 SecurityManager.checkPermission(Permission perm) 來完成的。外部程序通過,創建Permission實例,傳遞給前面的check。

Permission是一個抽象類,需要繼承它實現不同的權限驗證,比如 FilePermission,代表對某個文件的讀寫權限。
new FilePermission(“test.txt”, “read”)
你可以將這個實例,扔給 SecurityManager,檢查是否可讀text.txt這個文件。

java簽名/證書機制

java簽名/證書機制,可以保障使用者,安全地調用外部提供的jar,防止你信任的jar被篡改。

首先,java的簽名,必須是基於jar包的。也就是說,你必須將你要提供的class,打包到jar裏。
然後,通過 java 提供的簽名工具(jarsigner)對jar包進行簽名,發佈。

簽名原理:
使用非對稱算法,生成一對公鑰/私鑰。
java簽名原理

證書
證書是在簽名基礎上,對簽名值,再進一步做一次加密。而這次加密使用的私鑰和公鑰都是證書機構提供的。
這種方式,是爲了防止,有些惡意用戶,在公鑰發到你手上前,就對其做了手腳,然後再發一個動過手腳的jar給你,用動過手腳的公鑰解動過手腳的jar包,是可以解開的。
而使用證書後,它會對已經加密的簽名值,再做一層加密,這樣,到你手裏,你只需要通過證書機構的公鑰進行解密,然後再用jar包發佈者的公鑰解密就行了。(只能在一定程度上,提供一些安全性)

作者:Ken Wu 原文鏈接:http://kenwublog.com/explain-java-security-sandbox

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章