(第 3 部分)此漏洞造成超過 3 億美元的損失!
第二部分
這是一個即時智能合約範例,即使您不是開發人員,也可以瞭解它的工作原理
重入攻擊是 EVM 智能合約中的常見漏洞,允許外部合約劫持控制流並重新進入,從而可能耗盡受害者的資金。
這些攻擊仍然是智慧合約開發中的重要議題,開發人員非常重視。
流行的可重入智能合約攻擊包括:
• DAO 黑客攻擊:他們損失了價值約 5000 萬美元的 ETH。
• Cream Finance:他們損失了價值超過3000萬美元的各種資產。
• Siren Protocol:他們損失了價值超過3000萬美元的不同資產。
讓我們使用 Solidity 智能合約實現這個示例。
別擔心,我們會一步一步來。
我將使用@EthereumRemix (X),這是一個您可以在其中編寫、編譯、測試和運行代碼的開發界面。
我們將編寫一些代碼並模擬攻擊。
• 首先,讓我們創建一個名爲“Bank.sol”的文件,它將包含所有代碼。
• 然後,創建一個映射來存儲每個地址的餘額。
這裏,每個地址都會對應一個人的賬戶。
接下來,我們將創建一個簡單的存款功能,允許客戶將錢存入銀行。
這裏的智能合約代表銀行。
每次存款時,都會通過將新存款添加到相應的地址來更新映射。
我們還需要一個提款功能,允許存款人提取全部或部分餘額。
爲了簡化,每次客戶端調用此函數時,他們將提取其全部餘額,並且我們在映射中將其餘額設置爲 0。
最後,我們添加了一個不會改變映射而只是讓客戶端檢查其餘額的函數。
這被稱爲視圖函數,它不消耗任何 gas,因爲它不會修改鏈上數據,它只顯示請求的信息。
該合同看似非常簡單,而且乍一看似乎牢不可破。
讓我們嘗試對其進行重入攻擊。我們將構建攻擊者的智能合約,其中包含一個接收函數,只要合約餘額高於 1 ETH,該函數就會持續提取。
最後,我們將添加一個視圖函數 getBalance,它將返回攻擊者合約的以太幣餘額。
現在,讓我們部署一切並測試我們的重新進入攻擊是否有效。
首先,我們需要部署Bank合約:
• 首先編譯這兩段代碼。
• 部署銀行合約。
• 複製已部署的銀行合約的地址,並將其作爲輸入來部署攻擊者合約。
• 然後,將 10 ETH 存入銀行合約。
• 將 1 ETH 存入攻擊者合約。
• 最後,使用攻擊函數發起攻擊。
我們可以看到,這次攻擊成功了。
我們在一個地址存入了 10 ETH,在攻擊者的地址存入了 1 ETH。
最終攻擊者的地址持有11個ETH。
如何才能預防這種情況發生?
當客戶調用提款功能並向其發送資金之前,可以通過將客戶餘額設置爲 0 來避免這種情況。
所要做的就是移動一行代碼。
我希望您發現這篇文章很有幫助。
跟我來 @Bluechip 瞭解更多信息。
如果可以的話,請點贊/轉發該引文。
#TON #DOGSONBINANCE #CryptoMarketMoves #TelegramCEO #USNonFarmPayrollReport