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