重入|破解Solidity

這篇文章探討了智能合約中的「可重入性」漏洞,並以著名的DAO攻擊為例說明其危害性。以下是文章的核心內容:

  • 重入攻擊的定義:當合約A調用合約B時,合約B在執行過程中又回調合約A,形成循環,導致資金被惡意提取。
  • 攻擊示例:以EtherStore合約為例,攻擊者通過fallback函數在提款過程中反覆調用withdraw函數,直到耗盡合約資金。
  • 漏洞原因:代碼未在轉移資金前更新餘額,使得攻擊者能多次提取資金。
  • 解決方案
    • 調整代碼邏輯,先更新餘額再轉移資金。
    • 使用noReentrancy修飾器鎖定合約,防止重入攻擊。

文章通過代碼示例詳細解釋了攻擊過程與防護措施,幫助讀者理解並避免此類漏洞。

總結

這篇文章背後的動機是我試圖了解智能合約中的一些常見漏洞。

我們可能聽說過著名的DAO攻擊,它導致了以太坊經典的誕生。被攻擊者利用的漏洞稱為“可重入性”。

什麼是重入攻擊?

假設有兩個合約A和合約B,合約A調用合約B。在這種攻擊中,當第一個調用仍在執行時,合約B調用合約A,這在某種程度上導致了一個循環。

我們將在下面給出的示例的幫助下嘗試更好地理解攻擊。我們有一個名為EtherStore的智能合約,用戶可以在其中存、取款和查看智能合約的當前餘額。

EtherStore.sol

我們看到提款功能有一個檢查,不允許用戶取比他們擁有的更多的錢,但是bug出現在第16行。每當我們將以太坊發送到智能合約地址時,我們都會定義我們所說的fallback函數。在大多數情況下,這只是一個空函數,但攻擊者足夠聰明,這是放置實際利用代碼的地方。

攻擊

攻擊者調用exploit函數,在EtherStore合約中存入1個以太坊,以通過EtherStor合約的第14行檢查。當代碼到達第16行時,攻擊者會調用攻擊者合約的fallback函數,攻擊者在其中調用EtherStore上的withdraw函數,直到耗盡資金。

Reentrancy.sol

解決方案

這種攻擊是可能的,因為代碼從來沒有達到EtherStore合約的第20行,在這裡我們減去了從EtherStore合約中提取的金額。為了解決這個問題,我們有兩個解決方案。首先是在轉移餘額重新定位從用戶那裡減去餘額的邏輯。

修改後的提款()函數

第二個解決方案是使用noReentrancy保護修改器,它在執行時鎖定合約,並在執行結束時解鎖。

noReentrancy 守衛修改器

Source:https://zuhaibmd.medium.com/reentrancy-hack-solidity-1-aad0154a3a6b

分享至:

作者:去中心化金融社区

本文為PANews入駐專欄作者的觀點,不代表PANews立場,不承擔法律責任。

文章及觀點也不構成投資意見

圖片來源:去中心化金融社区如有侵權,請聯絡作者刪除。

關注PANews官方賬號,一起穿越牛熊
推薦閱讀
1小時前
2小時前
3小時前
17小時前
18小時前
19小時前

熱門文章

行業要聞
市場熱點
精選讀物

精選專題

App内阅读