以太坊價格 以太坊價格
Ctrl+D 以太坊價格
ads
首頁 > MATIC > Info

智能合約安全審計入門篇 : 重入漏洞

Author:

Time:1900/1/1 0:00:00

背景概述

看了一個關于學習 solidity 的站(https://solidity-by-example.org),里面講了關于 solidity 智能合約的很多漏洞,考慮到現在針對智能合約的攻擊事件頻頻發生,不法分子盜取的加密資產越來越多,我就想寫一些與智能合約安全審計相關的文章給想了解智能合約安全審計的入門者閱讀,讓一些對智能合約安全審計感興趣的初學者可以學到如何識別一些常見的漏洞和如何利用這些漏洞去做什么事情。這次我們就一起先看一個很經典的漏洞 —— 重入漏洞。

前置知識

重入漏洞相信大家都有所耳聞了,那么什么是重入漏洞呢?

以太坊智能合約的特點之一是合約之間可以進行相互間的外部調用。同時,以太坊的轉賬不僅僅局限于外部賬戶,合約賬戶同樣可以擁有以太并進行轉賬等操作,且合約在接收以太的時候會觸發 fallback 函數執行相應的邏輯,這是一種隱藏的外部調用。

動態 | Chainlink發布“Mixicles”白皮書 旨在為DeFi智能合約提供隱私性:為智能合約提供防篡改I/O(輸入/輸出)服務的Chainlink最近發布了其“Mixicles”白皮書。Chainlink表示,Mixicles是嵌入了oracle的DeFi工具,可在區塊鏈上/外的數據之間進行調解,并包含了促進金融工具隱私的混合器。(AMBcrypto)[2019/9/5]

我們先給重入漏洞下個定義:可以認為合約中所有的外部調用都是不安全的,都有可能存在重入漏洞。例如:如果外部調用的目標是一個攻擊者可以控制的惡意的合約,那么當被攻擊的合約在調用惡意合約的時候攻擊者可以執行惡意的邏輯然后再重新進入到被攻擊合約的內部,通過這樣的方式來發起一筆非預期的外部調用,從而影響被攻擊合約正常的執行邏輯。

漏洞示例

聲音 | BM:區塊鏈的意義在于誠實 正直和智能合約的客觀理性:據 IMEOS 報道,BM 剛剛在 URI 電報群發表了幾段消息,他表示,URI 是志愿社區的和平條約,每個社區都有它自己極力捍衛的價值觀。那些不以這些價值觀并破壞和平條約的人將沒有資格獲得 URI。

如果人們不明白其道德準則,任何和平條約都不成立。不接受和平條約準則的人會拿著不勞而獲的錢去資助戰爭或者其他東西。我們需要記載和明確最低可行道德準則,不容質疑的,落地實行的。

區塊鏈的意義在于誠實,正直和智能合約的客觀理性。讓人們信守他們的加密諾言和明白客觀歷史。[2018/9/29]

好了,看完上面的前置知識我相信大家對重入漏洞都有了一個大致的了解,那么在真實的環境中開發者寫出什么樣的代碼會出現重入漏洞呢,下面我們來看一個比較典型的有重入漏洞的代碼:

漏洞分析

IBM區塊鏈負責人Jesse Lund:金融用例區塊鏈與智能合約區塊鏈將在10年內整合:5月17日,IBM區塊鏈負責人Jesse Lund在與Reddit社區的AMA會議上談到了IBM參與區塊鏈領域的情況。在談及金融用例區塊鏈是否能夠在智能合約區塊鏈中生存下來時,他表示,IBM對這兩個區塊鏈都提供了支持。 他預測,10年之內,將看到這些區塊鏈類型的整合,這樣才能讓兩者共存。[2018/5/18]

看到這里大家可能會有疑惑了,上面的代碼就是個普通的充提幣的合約,憑什么說他有重入攻擊呢?我們來看這個合約的 withdraw 函數,這個函數中的轉賬操作有一個外部調用(msg.sender.call{value: bal}),所以我們就可以認為這個合約是可能有重入漏洞的,但是具體能否產生危害還需要更深入的分析:

1. 所有的外部調用都是不安全的且合約在接收以太的時候會觸發 fallback 函數執行相應的邏輯,這是一種隱藏的外部調用,這種隱藏的外部調用是否會造成危害呢?

RSK測試版將智能合約帶入比特幣:RSK今天正式推出比特幣智能合約平臺。之前作為Rootstock被世人皆知,這家初創公司一直以來都因為其在比特幣上實施以太坊風格的智能合約的努力而受到關注,有愛好者認為這將會使復雜的自執行代碼可以在區塊鏈上運行,以提升其競爭力。[2018/1/4]

2. 我們可以看到在 withdraw 函數中是先執行外部調用進行轉賬后才將賬戶余額清零的,那我們可不可以在轉賬外部調用的時候構造一個惡意的邏輯合約在合約執行 balance[msg.sender]=0 之前一直循環調用 withdraw 函數一直提幣從而將合約賬戶清空呢?

下面我們看看攻擊者編寫的攻擊合約中的攻擊手法是否與我們的漏洞分析相同:

攻擊合約

我們看到 EtherStore 合約是一個充提合約,我們可以在其中充提以太。下面我們將利用攻擊合約將 EtherStore 合約中用戶的余額清零的:

這里我們將引用三個角色,分別為:

用戶:Alice,Bob

攻擊者:Eve

1. 部署 EtherStore 合約;

2. 用戶 1(Alice)和用戶 2(Bob)都分別將 1 個以太幣充值到 EtherStore 合約中;

3. 攻擊者 Eve 部署 Attack 合約時傳入 EtherStore 合約的地址;

4. 攻擊者 Eve 調用 Attack.attack 函數,Attack.attack 又調用 EtherStore.deposit 函數,充值 1 個以太幣到 EtherStore 合約中,此時 EtherStore 合約中共有 3 個以太,分別為 Alice、Bob 的 2 個以太和攻擊者 Eve 剛剛充值進去的 1 個以太。然后 Attack.attack 又調用 EtherStore.withdraw 函數將自己剛剛充值的以太取出,此時 EtherStore 合約中就只剩下 Alice、Bob 的 2 個以太了;

5. 當 Attack.attack 調用 EtherStore.withdraw 提取了先前 Eve 充值的 1 個以太時會觸發 Attack.fallback 函數。這時只要 EtherStore 合約中的以太大于或等于 1 Attack.fallback 就會一直調用 EtherStore.withdraw 函數將 EtherStore 合約中的以太提取到 Attack 合約中,直到 EtherStore 合約中的以太小于 1 。這樣攻擊者 Eve 會得到 EtherStore 合約中剩下的 2 個以太幣(Alice、Bob 充值的兩枚以太幣)。

下面是攻擊者的函數調用流程圖:

修復建議

看了上面的攻擊手法相信大家對重入漏洞都會有一個自己的認知,但是只會攻擊可不行,我們的目的是為了防御,那么作為開發人員如何避免寫出漏洞代碼還有作為審計人員如何快速發現問題代碼呢,下面我們就以這兩個身份來分析如何防御重入漏洞和如何在代碼中快速找出重入漏洞:

(1)作為開發人員

站在開發者的角度我們需要做的是寫好代碼,避免重入漏洞的產生。

1. 寫代碼時需要遵循先判斷,后寫入變量在進行外部調用的編碼規范(Checks-Effects-Interactions);

2. 加入防重入鎖。

下面是一個防重入鎖的代碼示例:

(2)作為審計人員

作為審計人員我們需要關注的是重入漏洞的特征:所有涉及到外部合約調用的代碼位置都是不安全的。這樣在審計過程中需要重點關注外部調用,然后推演外部調用可能產生的危害,這樣就能判斷這個地方是否會因為重入點而產生危害。

Tags:STOETHESTORETHERMainstonEtheriyaImpostors Bloodethereum官網

MATIC
YTH:金色觀察|為何世界上最大交易商押注區塊鏈數據服務Pyth

假設你可以購買特斯拉公司的股份并將其發送給上海的朋友,就像發送電子郵件一樣容易。或者想象押注拜登總統任期結束時的通貨膨脹率,?如果你是對的,將獲得比特幣回報.

1900/1/1 0:00:00
TOKE:什么是Uniswap? 史上最全新手導讀

Uniswap是一個建立在以太坊上的主流分布式加密交易平臺。絕大部分的加密資產交易發生在中心化交易平臺,如Coinbase和Binance.

1900/1/1 0:00:00
區塊鏈:“炒房團”殺入元宇宙 真金白銀購入虛擬地產值不值?

虛擬游戲平臺Sandbox上的一塊虛擬土地以430萬美元的價格售出,創下了“元宇宙”虛擬房地產交易價格的新紀錄。目前對于虛擬地產的價值,業內充滿爭論.

1900/1/1 0:00:00
KEN:參與ID0真的會穩賺不賠嗎?警惕這六大風險

相信大家對于 ID0 這個名字不再陌生,首發最低籌碼上市后立刻 5–10 倍甚至百倍收益的神話,這個項目也造富了不少玩家,我身邊有朋友甚至重金幾百萬籌建 ID0 打新工作室.

1900/1/1 0:00:00
元宇宙:Coinbase對元宇宙施展大招

昨日,合規加密交易所 Coinbase 的首席執行官布賴恩·阿姆斯特朗 (Brian Armstrong) 與負責身份識別工具的主管亞歷克斯·里夫 (Alex Reeve) 共同發表了一篇博客文.

1900/1/1 0:00:00
EFI:以太坊的飛輪

寫在前面的話 今天以太坊4600美元,市值超過5400億美金,位列全球資產排名第15位,接近騰訊。而上個月以太坊還經歷了一場社區論戰,3ArrowCapital已經公開聲明拋棄以太坊.

1900/1/1 0:00:00
ads