?淺析區塊鏈DApp安全隨機源機制的設計與實現區塊鏈
近期區塊鏈DApp游戲的應用數量和用戶數量都得到了一定增長,但令人擔憂的是多款競猜類DApp頻頻爆出被黑客進行了針對隨機數缺陷的攻擊
近期,區塊鏈DApp游戲的應用數量和用戶數量都得到了一定增長,這對公鏈的應用探索和推廣有積極的促進。令人擔憂的是,多款競猜類DApp頻頻爆出被黑客進行了針對隨機數缺陷的攻擊。攻擊成功后,黑客就能夠預知競猜結果,來獲得下一次競猜的獎勵。
在中心化的競猜類應用里,競猜結果都是由中心提供的,參與競猜的客戶端向中心服務提交競猜訂單,中心收集競猜訂單并生成競猜結果返回給客戶端。在這個過程中,客戶端只負責收集競猜訂單和通知結果,并不參與競猜結果的計算。競猜結果都是由中心產生競猜用隨機數,根據游戲規則將隨機數的隨機性體現在競猜結果上。通過這樣的隨機數轉化來保證競猜結果的隨機性和公平性。因此競猜應用是否公平、中獎機率是否隨機,完全取決于隨機數的生成、使用過程是否完全實現了的隨機性的傳遞。
在區塊鏈的DApp應用里,隨機數或由第三方隨機數服務接口利用Oracle機制,由硬件HSM生成后提供給區塊鏈參與者,或由智能合約提供生成規則后DApp自行生成。大多數DApp使用的都是由智能合約進行共識來生成偽隨機數。
目前,ETH和EOS等公鏈并未提供可靠的偽隨機數接口。一些熱門的DApp游戲尤其是競猜類游戲如Luckyos、EOS.WIN、EOSDice等先后因偽隨機數生成的缺陷而遭到黑客攻擊。我們以EOSDice舉例來說明攻擊的原理。
-------------------https://github.com/loveblockchain/eosdice/blob/v3.0/eosbocai2222.hpp--------------------
uint8_t random(account_name name, uint64_t game_id)
{
auto mixd = tapos_block_prefix() * tapos_block_num() name game_id - current_time();
const char *mixedChar = reinterpret_cast<const char *>(&mixd);
checksum256 result;
sha256((char *)mixedChar, sizeof(mixedChar), &result);
uint64_t random_num = *(uint64_t *)(&result.hash[0]) *(uint64_t *)(&result.hash[8]) *(uint64_t *)(&result.hash[16]) *(uint64_t *)(&result.hash[24]);
return (uint8_t)(random_num % 100 1);
}
----------------------------------------------------------------------------------------------------------------------------------------
從最新修復后的代碼可以看到,該隨機函數中使用的隨機因子(seed)主要是:
tapos_block_prefix() * tapos_block_num() --參照區塊信息
name --賬戶名
game_id --賬戶名
current_time() -- 當前時間
在該版本中,下注賬戶余額(pool_ol_eos.amount) 已經不參與隨機因子(seed)。項目方解決被攻擊的思路是避免黑客通過可控制的賬戶余額(pool_ol_eos.amount)來計算隨機因子(seed)。但該修復只是減少可控因素的成本,隨機因子中的賬戶名(name)還是可以被操縱的。當下注金額較大時,黑客依然有十足動力來進行攻擊。
從安全本質上來說,能夠被黑客輕易攻擊是因為這個隨機數算法不具備工業級別。表現為:
1.作為隨機因子的(seed)的熵源(Entropy Input)不是可靠。
2.隨機因子Seed的安全強度不足。
3.算法簡單和重置隨機因子機制缺失,隨機數結果可回溯且具備可預測性。
如何設計和運用具備工業級別的偽隨機數方案,筆者建議參考2015年 的NIST 800-90A《確定性隨機比特生成器的隨機數生成方法建議》(‘Recommendation for Random Number Generation Using Deterministic Random Bit Generators’),它給出了實踐和參考的一些實現方法。但結合DApp的業務流程時,也需要進行針對性的調整。NIST的800-90A 2016年版本也曾造成了重大的安全事故:建議中包含了4種隨機數生成方法,其中一種Dual_EC_DRBG算法為美國安全局進行全球的通訊竊聽提供了有力的助攻。
該建議書中的DRBG(Deterministic Random Bit Generators)機制有五個獨立的功能:
1.實例化功能(instantiate function)獲取熵源(entropy input)或者附加 隨機數Nonce和個性化字符串(personalization string)創建初始內部狀態的隨機因子(seed)。
2.隨機比特位生成功能根據請求使用當前內部狀態(current internal state)和可能的附加輸入(Additional Input)生成偽隨機比特位; 并生成下一個請求的新內部狀態(new internal state)。
3.重設隨機因子功能(Reseed Function)獲取新的熵源,并將其與當前內部狀態(current internal state)和可能的附加輸入(Additional Input)結合創建新的隨機因子(new seed)和新內部狀態(new internal state)。
4.注銷實例化功能將內部狀態清零擦除。
5.自檢功能確定DRBG機制能繼續正常運行。
圖片來源:NIST 800-90A《確定性隨機比特生成器的隨機數生成方法建議》
在開源世界里,已經有很多滿足NIST要求800-90的DRBG的實現,筆者建議在不具備密碼學基礎的Developer不要輕易的編寫自定義的偽隨機數生成器。
即使采用滿足標準的偽隨機數生成器,但由于偽隨機數生成算法跟設備上物理狀態或執行過程中狀態相關,在區塊鏈分布式系統的各個Node無法得到一致的隨機數。 在區塊鏈世界里某些應用場景尤其是有獎競猜等,各個Node所需要的隨機數(不管是真隨機還是偽隨機)應該是可共識的,可信賴的,可驗證且可審計的。
鏈殼科技愿為DApp開發者提供全方位的安全設計咨詢和審查服務,共同提高產品抵御攻擊的能力,為用戶提供良好的安全體驗。合作請聯系:business@chainshells.com
1.TMT觀察網遵循行業規范,任何轉載的稿件都會明確標注作者和來源;
2.TMT觀察網的原創文章,請轉載時務必注明文章作者和"來源:TMT觀察網",不尊重原創的行為TMT觀察網或將追究責任;
3.作者投稿可能會經TMT觀察網編輯修改或補充。