論文簡介
論文標題:ContractFuzzer: Fuzzing Smart Contracts for Vulnerability Detection
論文鏈接:ContractFuzzer: Fuzzing Smart Contracts for Vulnerability Detection
開源地址:gongbell/ContractFuzzer: The Ethereum Smart Contract Fuzzer for Security Vulnerability Detection (ASE 2018)
本篇論文提出了一個采用fuzzing技術對智能合約漏洞進行分類挖掘的工具,取名為ContractFuzzer,這篇論文是這該領域的開山之作,
可檢測的漏洞分類與對應的檢測方法
send函式gas不足
漏洞定義:
在呼叫send函式的時候gas默認為2300,這只足夠呼叫空的fallback函式,若目標合約的fallback函式不為空(還有其他操作),則會導致gas不足進行回滾,若呼叫了send函式卻沒有檢查回傳值是否成功(默認成功),則可能發生意外的錯誤,
檢測方法:
- 呼叫了
send()函式 send()函式在運行程序中拋出了ErrOutOfGas錯誤
例外回傳丟失
漏洞定義:
若呼叫鏈中的每個呼叫都是對合約功能的直接呼叫,當發生例外時,所有交易都將被回滾(包括以太幣轉賬), 但是,對于至少一個通過低級呼叫方法(address.call()、address.delegatecall() 、address.send())對地址進行呼叫的嵌套呼叫鏈,事務的回滾將 只停在呼叫函式處并回傳false,
檢測方法:
- 若其嵌套呼叫中至少有一個拋出了例外,但根呼叫沒有拋出例外,
重入漏洞
漏洞定義:
當“轉賬函式”先進行轉賬,在清空賬戶余額的時候,重入漏洞就會發生,攻擊者在fallback函式中再次呼叫“轉賬函式”,進行重復多次的取款,
檢測方法:
- 遞回呼叫檢測
- 在以呼叫
A函式為開始的呼叫鏈中,A函式是否被多次呼叫,
- 在以呼叫
- 轉賬檢測
- 呼叫函式
call()的轉賬數目大于0 - 有足夠的
gas讓被呼叫函式執行復雜的代碼 call()函式所呼叫的合約是ContractFuzzer提供的攻擊合約,而不是被測驗合約所指定的合約,
- 呼叫函式
時間戳依賴
漏洞定義:
如果智能合約采用區塊產生的時間來進行一個亂數的構建,則可能遭到攻擊,因為區塊產生的時間值可以由礦工在一定的時間范圍內自行定義,
檢測方法:
- 函式執行期間是否呼叫了
TIMESTAMP操作碼 - 是否通過
send()函式或call()函式發送以太
區塊號依賴
漏洞定義:
區塊號依賴的弱點和時間戳依賴的原因相似,如果智能合約采用區塊產生的編號來進行一個亂數的構建,則可能遭到攻擊,因為區塊產生的編號可以由礦工進行操控,
檢測方法:
- 函式執行期間是否呼叫了
NUMBER操作碼 - 是否通過
send()函式或call()函式發送以太
delegatecall使用
漏洞定義:
采用delegatecall呼叫目標函式,目標函式將會在發起呼叫的合約環境中執行,從而可能導致發起呼叫的合約引數被修改,
檢測方法:
- 函式執行期間是否呼叫了
delegatecall()函式 - 被
delegatecall()所呼叫的函式是從原始的輸入(msg.data)中獲得的
余額凍結
漏洞定義:
當一個合約的轉賬功能完全依賴于呼叫外部合約的函式或外部Library時,一旦外部合約或Library自毀,則該合約的全部余額將無法取出,
檢測方法:
- 該合約能夠接收以太
- 本身沒有
transfer/send/call/suicide等功能,而是通過delegatecall()函式呼叫外部函式進行轉賬
ContractFuzzer流程圖

0-在本地部署離線的私有鏈
1-分析合約的ABI介面和位元組碼,提取處引數型別以及函式簽名
2-對合約池中的所有合約進行函式簽名分析,并建立{合約,函式}的索引
3- 生成符合ABI規范的fuzzing輸入以及變異輸入
4-該工具將啟動fuzzing程序,將生成輸入資料輸入的相應的ABI介面中
5-根據執行日志檢測安全漏洞
智能合約靜態分析
首先基于每個智能合約匯出的JSON格式ABI,提取ABI中宣告的所有函式簽名、引數描述和資料型別,目的是建立{函式選擇器,所有合約地址}的映射,
流程如下:

后記
這篇文章還有很多實驗的程序以及細節沒有整理進來,感興趣的讀者可以去翻翻論文看一下,總的來說這篇文章講了一個大概的框架,沒有提到具體的技術實作,不過ContractFuzzer是開源的(在本文的開頭),
接下來打算看一下fuzzing具體是一個什么樣的程序,輸入生成函式是怎么樣的,插樁又是什么東東,倒是想看一下ContractFuzzer是怎么實作的,但是他是用go寫的,要看的話我還得先go一下,
好,這次的論文就讀到這里,下期見~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/285703.html
標籤:其他
上一篇:《大型網站技術架構核心原理與案例分析》讀書筆記(一)
下一篇:我有一個不聽話的老婆
