為什麼 DApp 經常會遭遇隨機數攻擊?

買賣虛擬貨幣
9 月 14 日,一款名為“EOSPlay”的 DApp 遊戲遭遇了新型隨機數攻擊,一共損失了數萬個 EOS。或許很多人對「隨機數攻擊」這個詞已經司空見慣了,因為在 DApp 遭遇駭客攻擊的事件中,隨機數攻擊佔了很大一部分,很多 DApp 的隨機數被駭客破解了。你或許會問,隨機數不是隨機的嗎?隨機意味著不可預測,為什麼還會被駭客破解呢?這還得從隨機數說起。隨機數可以分為真隨機數和偽隨機數。真隨機數需要同時滿足隨機性、不可預測性、不可重現性,而偽隨機數只需要滿足隨機性,或者是隨機性和不可預測性即可。真隨機數只存在於物理世界中,一般需要透過物理手段(包括量子過程)獲得,比如我們日常見到的拋硬幣、擲骰子,生成的隨機數就是真隨機數。但是,拋硬幣、擲骰子這種隨機數生成方法的缺點非常明顯,那就是耗時、耗力,而且也無法滿足現代的計算機世界對隨機數的需求。
因為效率的緣故,現代的計算機軟體主要依賴偽隨機數。最早的偽隨機數生成器由 20 世紀最重要的數學家之一馮·諾依曼創造,透過一個確定的隨機數種子,由確定的演算法生成偽隨機數序列。現在的主流計算機程式語言,預設的是將 1997 年發明的梅森旋轉演算法作為生成偽隨機數的方法。偽隨機數最大的缺陷是,只要種子不變,生成的偽隨機數序列也不會變。換句話說,只要你能拿到種子,你就可以破解隨機數。計算機生成偽隨機數的過程,或多或少與這臺計算機的物理狀態或運算狀態有關。也就是說,同一套隨機數演算法,不同的計算機,或是同一臺計算機在不同的時刻,生成的隨機數是不一樣的。

然而,這種傳統的計算機偽隨機數生成方法雖然足夠安全,卻並不適用於區塊鏈。區塊鏈是一個分散式的系統,同一個 DApp 在不同的節點上執行,採用的隨機數必須要一致,這樣才能讓各個節點進行驗證。所以,DApp 的隨機數來源,不能是執行這個 DApp 的計算機自動生成的,因為這樣的話,不同的節點計算機執行的結果就不一樣了。

那麼,區塊鏈上的 DApp 隨機數從哪裡來呢?主要有以下三種方法:

第一種方法是透過可信第三方提供隨機數。比如說專門提供隨機數的網站 random.org,我們可以透過獨立於區塊鏈之外的 Oraclize 預言機為以太坊區塊鏈上的 DApp 獲取隨機數。當然,這種依賴可信第三方的方法有違區塊鏈去中心化的精神。

第二種方法是不同的參與者一起合作生成隨機數。比如以太坊區塊鏈上的 RANDAO,任何人都可以提交一個數字,RANDAO 將所有提交的數字集合作為種子,生成隨機數,其他 DApp 可以付費調取 RANDAO 生成的隨機數,這些費用會獎勵給那些提交了數字的使用者。因為以太坊的去中心化,你不知道別人提交了什麼數字,所以要破解 RANDAO 的隨機數種子難度很大。

第三種方法是採集區塊鏈上的資訊作為種子。這也是目前大部分 DApp 所採用的隨機數生成方法,缺陷是隨機數的種子“幾乎是”透明的。以本文開頭提到的 EOSPlay 為例子,這款遊戲的隨機數採用的是未來某個區塊的 ID(雜湊值)作為隨機數的種子。

那麼,駭客是如何實現攻擊的呢?根據區塊鏈安全公司慢霧科技的分析,可能使用了以下的方法:

1、駭客為自己和專案方租用了大量的 CPU;
2、駭客發起大量的延遲交易;
3、由於以上兩點原因,導致 CPU 價格被拉高,從而導致其它使用者 CPU 不足;
4、因為 CPU 不足的原因,其他使用者難以傳送交易,駭客得以使用自己的交易佔滿區塊;
5、根據提前構造的交易內容,駭客可以成功預測出區塊雜湊。

也就是說,雖然雜湊演算法不可逆,但是駭客可以透過控制輸入實現輸出的控制:控制區塊內的交易內容,從而控制區塊資訊,進而控制區塊雜湊值,最終達到預測開獎結果的目的。

最後,我們總結一下:

隨機數可以分為真隨機數和偽隨機數,真隨機數只存在於物理世界中,一般需要透過物理手段獲取。為了效率,計算機主要採用偽隨機數,然而由於區塊鏈的分散式特性,足夠安全的傳統計算機偽隨機數生成方法並不適用。大部分 DApp 採用的是收集區塊鏈上的資訊作為偽隨機數的種子,而要想設計足夠安全的偽隨機數,難度非常大,這就是為什麼很多 DApp 經常遭受隨機數攻擊的原因。

免責聲明:

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

推荐阅读

;