DApp的隨機數(shù)為什么會被黑客破解
9月14日,一款名為“EOSPlay”的 DApp 游戲遭遇了新型隨機數(shù)攻擊,一共損失了數(shù)萬個 EOS。
或許很多人對「隨機數(shù)攻擊」這個詞已經(jīng)司空見慣了,因為在 DApp 遭遇黑客攻擊的事件中,隨機數(shù)攻擊占了很大一部分,很多 DApp 的隨機數(shù)被黑客破解了。
你或許會問,隨機數(shù)不是隨機的嗎?隨機意味著不可預測,為什么還會被黑客破解呢?
這還得從隨機數(shù)說起。
隨機數(shù)可以分為真隨機數(shù)和偽隨機數(shù)。真隨機數(shù)需要同時滿足隨機性、不可預測性、不可重現(xiàn)性,而偽隨機數(shù)只需要滿足隨機性,或者是隨機性和不可預測性即可。
真隨機數(shù)只存在于物理世界中,一般需要通過物理手段(包括量子過程)獲得,比如我們?nèi)粘R姷降膾佊矌?、擲骰子,生成的隨機數(shù)就是真隨機數(shù)。但是,拋硬幣、擲骰子這種隨機數(shù)生成方法的缺點非常明顯,那就是耗時、耗力,而且也無法滿足現(xiàn)代的計算機世界對隨機數(shù)的需求。
因為效率的緣故,現(xiàn)代的計算機軟件主要依賴偽隨機數(shù)。最早的偽隨機數(shù)生成器由 20 世紀最重要的數(shù)學家之一馮·諾依曼創(chuàng)造,通過一個確定的隨機數(shù)種子,由確定的算法生成偽隨機數(shù)序列。現(xiàn)在的主流計算機編程語言,默認的是將 1997 年發(fā)明的梅森旋轉(zhuǎn)算法作為生成偽隨機數(shù)的方法。
偽隨機數(shù)最大的缺陷是,只要種子不變,生成的偽隨機數(shù)序列也不會變。換句話說,只要你能拿到種子,你就可以破解隨機數(shù)。
計算機生成偽隨機數(shù)的過程,或多或少與這臺計算機的物理狀態(tài)或運算狀態(tài)有關(guān)。也就是說,同一套隨機數(shù)算法,不同的計算機,或是同一臺計算機在不同的時刻,生成的隨機數(shù)是不一樣的。
然而,這種傳統(tǒng)的計算機偽隨機數(shù)生成方法雖然足夠安全,卻并不適用于區(qū)塊鏈。區(qū)塊鏈是一個分布式的系統(tǒng),同一個 DApp 在不同的節(jié)點上運行,采用的隨機數(shù)必須要一致,這樣才能讓各個節(jié)點進行驗證。所以,DApp 的隨機數(shù)來源,不能是運行這個 DApp 的計算機自動生成的,因為這樣的話,不同的節(jié)點計算機運行的結(jié)果就不一樣了。
那么,區(qū)塊鏈上的 DApp 隨機數(shù)從哪里來呢?主要有以下三種方法:
第一種方法是通過可信第三方提供隨機數(shù)。比如說專門提供隨機數(shù)的網(wǎng)站 random.org,我們可以通過獨立于區(qū)塊鏈之外的 Oraclize 預言機為以太坊區(qū)塊鏈上的 DApp 獲取隨機數(shù)。當然,這種依賴可信第三方的方法有違區(qū)塊鏈去中心化的精神。
第二種方法是不同的參與者一起合作生成隨機數(shù)。比如以太坊區(qū)塊鏈上的 RANDAO,任何人都可以提交一個數(shù)字,RANDAO 將所有提交的數(shù)字集合作為種子,生成隨機數(shù),其他 DApp 可以付費調(diào)取 RANDAO 生成的隨機數(shù),這些費用會獎勵給那些提交了數(shù)字的用戶。因為以太坊的去中心化,你不知道別人提交了什么數(shù)字,所以要破解 RANDAO 的隨機數(shù)種子難度很大。
第三種方法是采集區(qū)塊鏈上的信息作為種子。這也是目前大部分 DApp 所采用的隨機數(shù)生成方法,缺陷是隨機數(shù)的種子“幾乎是”透明的。以本文開頭提到的 EOSPlay 為例子,這款游戲的隨機數(shù)采用的是未來某個區(qū)塊的 ID(哈希值)作為隨機數(shù)的種子。
那么,黑客是如何實現(xiàn)攻擊的呢?根據(jù)區(qū)塊鏈安全公司慢霧科技的分析,可能使用了以下的方法:
1、黑客為自己和項目方租用了大量的 CPU;
2、黑客發(fā)起大量的延遲交易;
3、由于以上兩點原因,導致 CPU 價格被拉高,從而導致其它用戶 CPU 不足;
4、因為 CPU 不足的原因,其他用戶難以發(fā)送交易,黑客得以使用自己的交易占滿區(qū)塊;
5、根據(jù)提前構(gòu)造的交易內(nèi)容,黑客可以成功預測出區(qū)塊哈希。
也就是說,雖然哈希算法不可逆,但是黑客可以通過控制輸入實現(xiàn)輸出的控制:控制區(qū)塊內(nèi)的交易內(nèi)容,從而控制區(qū)塊信息,進而控制區(qū)塊哈希值,最終達到預測開獎結(jié)果的目的。
最后,我們總結(jié)一下:
隨機數(shù)可以分為真隨機數(shù)和偽隨機數(shù),真隨機數(shù)只存在于物理世界中,一般需要通過物理手段獲取。為了效率,計算機主要采用偽隨機數(shù),然而由于區(qū)塊鏈的分布式特性,足夠安全的傳統(tǒng)計算機偽隨機數(shù)生成方法并不適用。大部分 DApp 采用的是收集區(qū)塊鏈上的信息作為偽隨機數(shù)的種子,而要想設計足夠安全的偽隨機數(shù),難度非常大,這就是為什么很多 DApp 經(jīng)常遭受隨機數(shù)攻擊的原因。
來源: 白話區(qū)塊鏈?