Java虛擬機安全性-class文件檢驗器,看完請務必收藏!

前言

類裝載器前面已經介紹完了,下面介紹class文件檢驗器,它主要是爲了保證class文件內部結構的正確性,並且這些class文件相互間協調一致,如果一旦發現有問題,就會把異常拋出。

Java虛擬機安全性-class文件檢驗器,看完請務必收藏!

正文

class文件是由Java編譯器產生的,但是虛擬基並不知道某個特定的class文件是如何被創建的,class文件實質上就是一個字節序列,所以Java虛擬機沒有辦法分辨特定的class文件是由正常的Java編譯器產生的,還有由黑客生成的,所以,所有Java虛擬機的實現必須有一個class文件檢驗器,提前對這些class文件進行驗證,以保證這些定義的類型都可以安全可靠的運行。

class文件驗證器

在使用class文件過程中,如果某個有漏洞的編譯器或者是黑客,產生了一個class文件,而在這個class文件中,包含了惡意的方法,這個方法的字節碼中含有一條跳轉到方法之外的指令,那麼,一旦這個方法被調用,它將導致虛擬機的奔潰,所以處於對健壯性的考慮,由class文件驗證器提前檢驗裝載的字節碼的完整性的非常重要的。

class文件檢驗器在字節碼執行之前,必須完成大部分檢驗工作,它只在執行前而不是在執行中對字節碼進行一次分析(並檢驗它的完整性),每次遇到一個跳轉指令都要進行檢驗,虛擬機要確認所有的跳轉指令會到達另一條合法的指令,而且這條指令是在這個方法的字節碼流中的,在大多數情況下,在執行前就對所有字節碼進行一次檢驗,對於保證健壯性就足夠了。

class文件驗證器要進行四趟獨立的掃描來完成它的操作,第一趟掃描是在類被加載時進行的,class文件驗證器檢查這個class文件的內部結構,以保證它可以被安全地編譯,第二次第三次是在連接過程中進行的,確認類型數據遵從Java編程語言的語義,包括驗證它所包含的所有字節碼的完整性,第四趟掃描實在進行動態連接的過程中解析符號引用時進行的,確認被引用的類字節碼以及方法的確實存在。

第一次掃描,class文件的結構性檢查,主要目的就是保證這個字節序列正確的定義了一個新的類型,遵從Java的class文件的固定形式,這樣才能被編譯成在方法區中的內部數據結構。

第二趟掃描,類型數據的語義檢查,在這趟檢查中,查看每個組成部分,確認他們是否是具有其所屬類型的實例,他們的結構是否正確

第三趟掃描,字節碼驗證,Java虛擬機對字節流進行數據流分析,這些字節流代表的是類的方法。

第四趟掃描,符號引用的驗證,Java虛擬機將追蹤那些引用——從被驗證的class文件到被引用的class,以確保這個引用是正確的。

下一節Java虛擬機中的內置安全特性介紹~

發佈了65 篇原創文章 · 獲贊 132 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章