JVM的沙箱機制大致可以分為三層:
第一層:類載入器
採用雙親委派模型,低層類載入器在收到類載入請求時,需要先委派給高層類載入器區完成,只有在高層類載入器無法完成該請求時,才會再重新委派給低層類載入器。透過這一機制,確保了系統的核心類不會被篡改,惡意程式碼無法訪問關鍵資源。
第二層:位元組碼校驗器
類位元組碼被載入後,需要在位元組碼層面進行檢驗,具體包括以下內容:
(1) 變數要在使用之前進行初始化
(2) 方法呼叫與物件引用型別之前要匹配
(3) 訪問私有資料和方法的規則沒有被違背
(4) 對本地變數的訪問落在執行時堆疊內
(5) 執行時堆疊沒有溢位透過這一機制,可以確保位元組碼符合Java語言規範,避免訪問無效訪問或越界訪問。
第三層:安全管理器
這一層是交由應用開發者來維護的,開發者可以根據自身需求,制定對應的安全策略。預設的安全策略配置位於以下兩個配置檔案中:
· $JAVA_HOME/conf/security/java.security
· $JAVA_HOME/conf/security/java.policy
預設情況下安全管理器是不開啟的,可以在命令列增加一個引數來開啟它:
java -Djava.security.manager SandboxTest
預設的安全策略配置不允許應用程式對檔案的讀寫操作,所以如果你試圖寫一個檔案,執行時會報如下錯誤:
如果你希望開放這個許可權,可以編寫自己的安全策略檔案,比如我們寫一個my.policy:
然後在執行時指定這個策略配置就可以了:
java -Djava.security.manager -Djava.security.policy=./my.policy SandboxTest
應用開發者可以針對不同的應用場景進行精細化定製,控制程式對網路、檔案、屬性等內容的訪問許可權。
4.EVM的沙箱機制
EVM本身是一個相對封閉的環境,不支援對網路和檔案系統的直接訪問,從這個層面來說已經起到一部分沙箱的功能了:
另外,在智慧合約之間互相呼叫時,EVM會重新分配堆疊和記憶體空間,在一個全新的環境中執行新合約,即使出現問題也不會破壞原有執行環境,從而為智慧合約的執行提供了一個沙箱環境。
最後,每個智慧合約的儲存也是相互獨立的,開發者可以根據需求,限制合約可以訪問的儲存空間,避免未授權的訪問或修改。舉例來說,下圖就描述了CALL和CALLCODE指令對儲存空間訪問的區別:
來源:公眾號(DoraFans)
更多區塊鏈資訊:www.qukuaiwang.com.cn/news