摘要:背景前一陣子比特股的創(chuàng)始人質疑了系統中的一系列問題,絕大多數都被的創(chuàng)始人之一正面回應過了,具體可以看看這個但是有一個問題沒有回應或者說還沒有提出解決方案。的組合堪稱完美。
背景
前一陣子比特股的創(chuàng)始人Daniel Larimer質疑了lisk系統中的一系列問題,絕大多數都被lisk的創(chuàng)始人之一Max正面回應過了,具體可以看看這個http://ethereum.stackexchange...
但是有一個問題Max沒有回應或者說還沒有提出解決方案。
那就是lisk側鏈的運行環(huán)境,Larimer說
“Lisk所面臨的大多數問題,都可以通過一個高度定制的JavaScript 環(huán)境來解決。”
否則,lisk的系統面臨兩大考驗:
首先,也是最重要的,lisk目前的沙箱機制不足以限制側鏈代碼的權限,也就是說無法運行不受信任的代碼,那些代碼可能會盜取服務器的關鍵信息,或者直接對服務器進行破壞
其次,是關于側鏈開發(fā)者的,lisk的側鏈代碼是運行在一個擁有全部能力的javascript環(huán)境,這里面有些可以導致不確定因素的函數,比如Math.random,lisk官方的開發(fā)文檔特別指出希望開發(fā)者避開這些函數,這對開發(fā)者會造成心智負擔,如果是一個定制版的javascript環(huán)境呢,直接把那些導致不確定因素的函數干掉,開發(fā)者根本不需要花費額外的精力去避開那些陷阱。
我們先說說為什么要用沙箱。沙箱(sandbox)是云計算平臺廣泛采用的安全防范措施,是一種訪問控制機制,其目的是為了限制應用代碼的權限,防止應用代碼對系統進行隨意的訪問和破壞,因為在云計算平臺中,應用代碼是由各種各樣的第三方開發(fā)者實現的,他們的代碼是不能被信任的,需要沙箱來做一層隔離,讓這些應用代碼只能做有限的事情。
lisk在區(qū)塊鏈領域是很類似于云計算平臺的,他們提供一些服務,允許第三方開發(fā)者基于這些服務構建他們自己的應用程序(即dapps)。
所以lisk也需要沙箱機制來保證dapps的作者無法作惡,lisk的做法是提供一個定制版的nodejs環(huán)境來達到這一目的。
具體實現在這段代碼里,https://github.com/LiskHQ/lis...
我經過分析,發(fā)現這個sandbox名不副實,只是使用管道手段實現了進程間通訊,而且是使用一種繞彎的方式實現的。nodejs的進程間通訊可以通過javascript代碼直接實現,為什么要用c++來實現呢?
我?guī)е@個疑問,和一些期望,親手做了一個實驗。
我首先使用lisk-cli創(chuàng)建一個hello world側鏈
lisk-cli dapp -a
接著我在側鏈程序的入口處 加了一段代碼
console.log(require("fs").readFileSync("../../config.json"))
然后運行之,于是我得到了這個服務器主節(jié)點的受托人的所有密碼
"forging": { "secret": [ "wKyoJM1vS4ucHmWvxDSdcpC23mJwqfg3G6MKZoXaFfcnWHTqo7", "2aTWYPpQidVunxTg3y8YESYps7za6f9d4wYn9Gy2GuGnE7JX7V", "65uZNjL36Bdg2tkJnueYkd2n6YPe76fpdeYtgu7fso1m385mwD", …………
果然,這個沙箱并沒有起隔離的作用,擁有管理員的權限,這等于給黑客敞開了大門。
有人說,lisk系統設置了二級密碼,你獲取了他的一級密碼,還是沒法盜取他們的錢。
也有人說,可以通過Linux自身的權限機制,給側鏈代碼一個低級用戶,使之無法訪問其他用戶的文件。
這些都是治標不治本的辦法,根本解決途徑是按照lisk預先設想的那樣,要讓沙箱名副其實,做到真正的環(huán)境隔離,要讓側鏈代碼對外界一無所知。
解決方案
那么,如何實現真正的沙箱呢?有很多種方案,比如跳過nodejs,直接使用v8引擎,或者使用進程級別的權限控制,比如windows系統的SetWindowsHookEx,當然,lisk目前并不打算支持windows版本的完整版錢包,那么在linux系統中可以使用seccomp技術。
我這里有種更簡單的方法,那就是利用nodejs自帶的vm模塊。
第一步 創(chuàng)建原生的javascript虛擬機
var vm = require("vm"); var context = vm.createContext(); vm.runInContext(sideChainCode, context);
這幾行代碼完成了對側鏈代碼的隔離,sideChainCode中只能進行純粹的運算邏輯,只能使用少量的v8引擎內置的javascript標準庫。甚至連setTimeout,console.log都沒有。
我們需要做些額外的工作。
比如,給運行環(huán)境添加setTimeout和clearTimeout
context.setTimeout= function(fn, delay) { if (typeof(fn) == "string") { setTimeout(new Function(fn), delay) } else { setTimeout(fn, delay) } }; context.clearTimeout = clearTimeout;
添加日志打印功能,讓側鏈的日志,轉發(fā)到主系統的中
global.print = send.bind(global, "stdout"); global.console = { log: send.bind(global, "stdout") }; global.process = { stdout: { write: send.bind(global, "stdout") } }; global.postMessage = send.bind(global, "message");
另外,還可以禁用那些導致不確定因素的函數
global.Math.random = undefined;
這些都做完以后,側鏈代碼的訪問權限就被限制在一個狹小的范圍內了。它們無法使用require,fs,http等nodejs內置的標準庫。
這樣安全的目的達到了,但是引發(fā)另一個問題,那就是功能性的問題了,不能使用那些額外的庫,只有js的標準庫也太不方便了,很多復雜功能無法實現,特別是沒有了require之后,連模塊化都做不到了。
所以我們需要第二步。
第二步 webpack
webpack本來是一個前端常用的打包方案,用于模塊化的管理前端項目。很多人忽略了其實在后端webpack同樣適用,并且可以把node_modules里的庫,甚至nodejs的一部分內置庫一起打包。
也就是說前端能用的js庫,除了UI相關的之外,在側鏈沙箱內,也都可以用,比如async,bytebuffer,crypto,js-nacl,bignum等等,這對于側鏈來說夠用了。
那些不能用的庫,比如文件系統、多進程、網絡模塊,正是我們想要拋棄的。
vm + webpack的組合堪稱完美。
這是日新月異的前端技術帶給javascript這門語言的福利,也是以太坊的solidity等新語言望塵莫及的。
不過我們還需要一些收尾的工作
第三步 掃清障礙
目前側鏈代碼中有些地方使用了一些比較復雜的庫,比如ed2curve,涉及到非常多的依賴,我們認為是沒有必要的,這部分功能可以在主鏈中提供,通過進程間通訊以api的方式提供給側鏈使用。
這樣也可以減輕側鏈代碼的累贅,還可以讓側鏈開發(fā)者更加輕松。這些代碼對整個框架的影響非常小,可以忽略不計,但是它們依賴的庫卻占用了一半以上的代碼量,其中還包括了沙箱環(huán)境不允許的一些操作。
經過分析,我發(fā)現只需要禁用modules/api/crypto.js中的兩個函數即可
Crypto.prototype.encrypt Crypto.prototype.decrypt
另外,js-nacl這個庫里依賴了fs模塊,但是相關函數并沒有被用到,暫時通過手工修改的方式,把fs相關代碼去掉就可以正常打包并運行了。
最后,我把一個完整的側鏈項目和主鏈框架中的關鍵代碼打包放在這里了。http://o7dyh3w0x.bkt.clouddn....
關于側鏈和區(qū)塊鏈開發(fā)的問題,歡迎加群:485979564,一起討論交流
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/91324.html
摘要:事實上,已經成功了一半目前在區(qū)塊鏈領域融資金額排行第二,僅次于以太坊。以上這些,就是我們經過深思熟慮后,雖有以太坊等珠玉在前,但我們依然要做一個同類型的產品的原因。 0 前言 首先要聲明一點,我們和我們的一些朋友都是lisk的投資人和支持者,我們也相信lisk會成功。 事實上,lisk已經成功了一半,目前在區(qū)塊鏈領域融資金額排行第二,僅次于以太坊。 那為什么我們還要做一個類似的Asch...
摘要:事實上,已經成功了一半目前在區(qū)塊鏈領域融資金額排行第二,僅次于以太坊。以上這些,就是我們經過深思熟慮后,雖有以太坊等珠玉在前,但我們依然要做一個同類型的產品的原因。 0 前言 首先要聲明一點,我們和我們的一些朋友都是lisk的投資人和支持者,我們也相信lisk會成功。 事實上,lisk已經成功了一半,目前在區(qū)塊鏈領域融資金額排行第二,僅次于以太坊。 那為什么我們還要做一個類似的Asch...
摘要:本文今天就淺嘗輒止的做個和的安全性對比首頁登陸。而則不必要求服務端是可信任的,他傳輸的只是公鑰,是安全可靠的。本系列文章只是進行技術交流,不可用做其它用途,且須經本人同意,方可轉載。 在幣圈,聽到對數字貨幣的質疑之聲從來沒少過。為什么有人會質疑呢?他們列出了很多理由(以下四點內容摘自網絡): 數字貨幣是依附于網絡的,而中國并沒有獨立自主的網絡技術,容易被敵對勢力利用數字貨幣損害中國利益...
摘要:本文今天就淺嘗輒止的做個和的安全性對比首頁登陸。而則不必要求服務端是可信任的,他傳輸的只是公鑰,是安全可靠的。本系列文章只是進行技術交流,不可用做其它用途,且須經本人同意,方可轉載。 在幣圈,聽到對數字貨幣的質疑之聲從來沒少過。為什么有人會質疑呢?他們列出了很多理由(以下四點內容摘自網絡): 數字貨幣是依附于網絡的,而中國并沒有獨立自主的網絡技術,容易被敵對勢力利用數字貨幣損害中國利益...
閱讀 2627·2021-11-19 09:56
閱讀 873·2021-09-24 10:25
閱讀 1632·2021-09-09 09:34
閱讀 2194·2021-09-09 09:33
閱讀 1052·2019-08-30 15:54
閱讀 541·2019-08-29 18:33
閱讀 1264·2019-08-29 17:19
閱讀 505·2019-08-29 14:19