深入理解重入攻擊漏洞
前言
前言
前言
一級標題
漏洞概述
一級標題
智能合約(英文:Smart contract )的概念於1995 年由Nick Szabo 首次提出,它是一種旨在以信息化方式傳播、驗證或執行合同的計算機協議,它允許在沒有第三方的情況下進行可信交易,這些交易可追踪且不可逆轉。然而智能合約也並非是安全的,其中重入(Re-Entrance) 攻擊漏洞是以太坊中的攻擊方式之一,早在2016 年就因為The DAO 事件而造成了以太坊的硬分叉。
一級標題

在以太坊中,智能合約能夠調用其他外部合約的代碼,由於智能合約可以調用外部合約或者發送以太幣,這些操作需要合約提交外部的調用,所以這些合約外部的調用就可以被攻擊者利用造成攻擊劫持,使得被攻擊合約在任意位置重新執行,繞過原代碼中的限制條件,從而發生重入攻擊。重入攻擊本質上與編程裡的遞歸調用類似,所以當合約將以太幣發送到未知地址時就可能會發生。
下面給出一個簡單的代碼片段示例:
一級標題
漏洞分析
一級標題
.transfer(),上述代碼片段就是最簡單的提款操作,接下來會給大家詳細分析重入攻擊造成的原因。一級標題- 漏洞分析
- 在正式的分析重入攻擊之前,我們先來介紹幾個重點知識。
- 01 轉賬方法
調用合約時沒有匹配到任何一個函數;
調用合約時沒有匹配到任何一個函數;
回退函數(fallback function):回退函數是每個合約中有且僅有一個沒有名字的函數,並且該函數無參數,無返回值,如下所示:

回退函數在以下幾種情況中被執行:
調用合約時沒有匹配到任何一個函數;
沒有傳數據;
智能合約收到以太幣(為了接受以太幣,fallback 函數必被標記為payable)。
沒有傳數據;
智能合約收到以太幣(為了接受以太幣,fallback 函數必被標記為payable)。

沒有傳數據;

智能合約收到以太幣(為了接受以太幣,fallback 函數必被標記為payable)。

沒有傳數據;

智能合約收到以太幣(為了接受以太幣,fallback 函數必被標記為payable)。


03 漏洞代碼

下面的代碼就是存在重入攻擊的,實現的是一個類似於公共錢包的合約,所有的用戶都可以使用deposit() 存款到Reentrance 合約中,也可以從Reentrance 合約中使用withdraw() 進行提款,當然了所有人也可以使用balanceof() 查詢自己或者其他人在該合約中的餘額。

首先使用一個賬戶(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4) 扮演受害者,將該合約在Remix IDE 點擊Deploy 按鈕進行部署。


在部署合約成功後在VALUE 設置框中填寫5,將單位改成ether,點擊deposit 存入5 個以太幣。

而下面的代碼則是針對上面存在漏洞的合約進行的攻擊:

使用另外一個賬戶(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2) 扮演攻擊者,複製存在漏洞的合約地址到Deploy 的設置框內,點擊Deploy 部署上面的攻擊合約。
攻擊者(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2) 調用攻擊合約的attack 函數模擬攻擊,之後調用被攻擊合約的wallet 函數去查看合約的餘額,發現已經歸零,此時回到攻擊合約查看餘額,發現被攻擊合約中的6 ether已經全部提款到了攻擊者合約中,這就造成了重入攻擊。

一級標題
一級標題
正文

一級標題

正文

正文

2016 年6 月17 日,TheDAO 項目遭到了重入攻擊,導致了300 多萬個以太幣被從TheDAO 資產池中分離出來,而攻擊者利用TheDAO 智能合約中的splitDAO() 函數重複利用自己的DAO資產進行重入攻擊,不斷的從TheDAO 項目的資產池中將DAO 資產分離出來並轉移到自己的賬戶中。
paidOut[_account] += reward 更新狀態變量放在了問題代碼payOut 函數調用之後。
對_recipient 發出.call.value 調用,轉賬_amount 個Wei,.call.value 調用默認會使用當前剩餘的所有gas。
二級標題

解決辦法
二級標題

通過上面對重入攻擊的分析,我們可以發現重入攻擊漏洞的重點在於使用了fallback 等函數回調自己造成遞歸調用進行循環轉賬操作,所以針對重入攻擊漏洞的解決辦法有以下幾種。
二級標題

01使用其他轉賬函數
OpenZeppelin 官方庫中有一個專門針對重入攻擊的安全合約:
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol




參考文獻
一級標題
https://zhuanlan.zhihu.com/p/111446792
參考文獻
https://blog.csdn.net/henrynote/article/details/82119116
一級標題
https://blog.csdn.net/Flyhps/article/details/83095036

