安全課堂|Soildity安全之隨機數誤區區塊鏈
WF曲速未來表示:Solidity提供的功能和變量可以獲得明顯難以預測的價值,但它們通常要么比看起來更公開,要么受到礦工的影響。由于這些隨機性在一定程度上是可預測的,因此惡意用戶通常可以復制它并依賴于其不可預測性來攻擊該功能。
Soildity作為編寫智能合約的語言,已經被廣泛的應用。但同時,開發者和用戶也得到了慘痛的教訓,智能合約的安全問題層出不窮。因此,我們總結了一些常見的Solidity安全問題。前車之鑒,后車之師,希望后來者能有所警惕。
隨機數誤區
以太坊區塊鏈上的所有交易都是確定性的狀態轉換操作。這意味著每筆交易都會改變以太坊生態系統的全球狀態,并且它以可計算的方式進行,沒有不確定性。WF曲速未來表示:Solidity提供的功能和變量可以獲得明顯難以預測的價值,但它們通常要么比看起來更公開,要么受到礦工的影響。由于這些隨機性在一定程度上是可預測的,因此惡意用戶通常可以復制它并依賴于其不可預測性來攻擊該功能。
代碼案例
在該案例中,私人的種子 與iteration與和keccak256散列函數組合使用以確定呼叫者是否獲勝。即使私人的種子,它必須是通過交易在某個時間點設置,并因此在區塊上可見。
相關事件
PRNG 合約
為了增加熵,一些智能合約使用了被視為私有的種子。一個這樣的案例是Slotthereum彩票。
代碼如下:
變量指針被聲明為私有,這意味著其他合同無法訪問其值。在每次游戲之后,1到9之間的中獎號碼被分配給該變量,然后block.number在檢索阻塞時將其用作當前的偏移量。
雖然私有變量受到保護而不受其他合同的影響,但可以將合同存儲的內容置于鏈外。例如,流行的以太坊客戶端web3具有API方法web3.eth.getStorageAt(),該方法允許檢索指定索引處的存儲條目。
鑒于這一事實,從合同存儲中提取私有變量指針的值并將其作為漏洞的參數提供是微不足道的:
1.彩票使用外部合約oracle來獲取偽隨機數,用于確定每輪投注中的投注者中的獲勝者。
2.這些號碼是未加密的。攻擊者可能會觀察待處理事務池并等待來自oracle的號碼。
3.一旦oracle的交易出現在交易池中,攻擊者就會以更高的Gas價格發出賭注。
4.攻擊者的交易最后一輪進行,但由于Gas價格較高,實際上是在oracle的交易之前執行,使得攻擊者獲勝。
區塊鏈安全公司WF曲速未來 觀點:
在以太坊區塊鏈中實施安全的PRNG仍然是一項挑戰。由于缺乏現成的解決方案,開發人員傾向于使用自己的實現。但是在創建這些實現時,很容易出錯,因為區塊鏈的隨機性源有限。在設計PRNG時,開發人員應確保首先了解各方的激勵,然后才選擇合適的方法。同時,區塊變量不應該被用來提供隨機性,因為它們可以被礦工操縱。
1.TMT觀察網遵循行業規范,任何轉載的稿件都會明確標注作者和來源;
2.TMT觀察網的原創文章,請轉載時務必注明文章作者和"來源:TMT觀察網",不尊重原創的行為TMT觀察網或將追究責任;
3.作者投稿可能會經TMT觀察網編輯修改或補充。