淺析沙箱機制(Sandboxie)

買賣虛擬貨幣
大家也許都聽說過:以太坊上的智慧合約是在沙箱(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.qukuaiwang.com.cn/news

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;