2015-02-10 21 views
0

我目前做一個基於JVM的編程語言。我沒有使用運算符,而是選擇將符號作爲方法名稱,併爲原始數據類型創建編譯器引用類。這些註釋是以Bytecode指令作爲參數的所謂的@Intrinsic註釋。編譯器使用這些來在每次調用時生成字節碼,而不是INVOKE指令。固有/字節碼註解安全

我現在想知道這個(公開)註釋是否可以用來做任何事情在JVM上的惡意,如果它應該由編譯器的限制,例如通過靜態分析。

(語言本身也支持字節碼錶達式)

回答

1

JVM將在使用前驗證字節碼,並且字節碼的歷史與此過程無關。最後,如果有一定的無效,可能是惡意的,字節碼模式驗證者不承認,它的危險性並不取決於這個字節碼模式是否是用你的編譯器和註釋創建或手工創建。

這就是首先驗證概念的原因。 JVM並不認爲編譯器總是沒有錯誤。

但是,讓編譯器執行合理性檢查,靜態分析甚至執行自己驗證創建的字節碼仍然是一個好主意。這不是安全的,正如所說,如果一個JVM的安全將依賴於你的編譯器做的一切權利將它無論如何打破。但它是關於可用性的,大多數用戶喜歡立即獲得錯誤響應,而不需要實際上運行的代碼來了解它是無效的。

0

一般來說,如果你可以在JVM上執行你所選擇的代碼,你已經可以做的一切惡意。 JVM很難正確使用沙箱。

真正的問題是你的威脅模型是什麼。一般來說,如果你在計算機上運行一個編譯的可執行文件,它的假設是能夠做任何事情你可以做的當前用戶。即使JVM在臺式機上也遵循這種模式。 (還有一個Java瀏覽器插件,它試圖在從web上加載的小程序上強制執行一個Java級別的沙箱,但不幸很少成功)