BTC
ETH
HTX
SOL
BNB
查看行情
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

深入理解重入攻擊漏洞

本文約3101字,閱讀全文需要約5分鐘
從轉賬方法、fallback 函數、漏洞代碼、源碼分析四個方面入手,深入分析重入攻擊原因,詳解The DAO 事件。
AI總結
展開
從轉賬方法、fallback 函數、漏洞代碼、源碼分析四個方面入手,深入分析重入攻擊原因,詳解The DAO 事件。

前言

前言

前言

一級標題

漏洞概述

  • 一級標題

  • 智能合約(英文: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


ETH
安全
智能合約
歡迎加入Odaily官方社群