文章閱讀頁通欄

淺析沙箱機制(Sandboxie)

來源: DoraFans 作者:
大家也許都聽說過:以太坊上的智能合約是在沙箱(Sandbox)中運行的。那么到底什么是沙箱呢?本文將帶你揭開這一機制的神秘面紗。 1.為什么需要沙箱......
大家也許都聽說過:以太坊上的智能合約是在沙箱(Sandbox)中運行的。那么到底什么是沙箱呢?本文將帶你揭開這一機制的神秘面紗。

1.為什么需要沙箱機制?

默認情況下,一個應用程序是可以訪問機器上的所有資源的,比如CPU、內存、文件系統、網絡等等。

但是這是不安全的,如果隨意操作資源,有可能破壞其他應用程序正在使用的資源,或者造成數據泄漏。為了解決這個問題,一般有下面兩種解決方案:

(1) 為程序分配一個限定權限的賬號:利用操作系統的權限管理機制進行限制
(2) 為程序提供一個受限的運行環境:這就是沙箱機制

2.什么是沙箱機制?

如上所述,沙箱就是一個限制應用程序對系統資源的訪問的運行環境。

沙箱很多情況下都是實現在虛擬機(VM)中,比如Java的虛擬機JVM、Javascript的虛擬機V8引擎、Android中的虛擬機Dalvik/ART,以及以太坊的虛擬機EVM等等。具體的實現方式各有不同,本文重點分析一下JVM和EVM的沙箱機制實現。

3.JVM的沙箱機制

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.guwutu.icu/news

關鍵詞: Dora網絡  沙箱機制  
0/300
? 时时彩龙虎和计划app