摘自“錢鵬 等:智能合約安全漏洞檢測技術研究綜述”
三個層面的安全問題:solidity代碼層,evm執行層,區塊鏈系統層
漏洞檢測方法:形式化驗證法,符號執行法,模糊測驗法,中間表示法,深度學習法
The Dao重入攻擊
parity多簽名錢包合約的delegatecall漏洞
bec合約的整數溢位漏洞無限復制代幣
EOS.WIN連續亂數攻擊
智能合約運行時允許與外部合約函式或介面互動:重復的外部呼叫
以太坊DAPP總價值應用在博彩、游戲等高風險類別
solidity代碼層
1.可重入漏洞
獨特的fallback機制,使得惡意攻擊者在程式命令執行結束前再次進入被呼叫函式
轉賬操作必定會出發接收者合約中的回呼函式
攻擊者在fallback函式中設計惡意攻擊代碼,遞回呼叫受害者合同的轉賬函式從而盜取ether
2.整數溢位漏洞
乘法、加法、減法溢位
若超出定義范圍,會自動截斷高位
解決方法:在算術邏輯前后進行驗證;使用safemath庫防范
3.權限控制漏洞
合約代碼層面:默認的權限時public
合約邏輯層面:onlyowner,onlyadmin約束
4.例外處理漏洞
3種例外:gas消耗完;呼叫堆疊溢位(1024);有throw命令
一般來說,若拋出例外,合約會自動回滾到上一個一致性狀態
特殊情況:一個合約以不同的方式呼叫另一個合約,發起呼叫的合約可能無法獲取被呼叫合約的例外資訊
智能合約的子呼叫發生例外會自動向上級傳播,但一些底層呼叫函式(Send、call、delegatecall)發生例外只 回傳false,不拋出例外
因此,在呼叫底層函式時必須嚴格檢查回傳值(flase),并有一致性的處理
5.拒絕服務漏洞
攻擊者通過破壞合約原有邏輯,消耗ether和gas,使得合約在一段時間無法正常執行
Revert攻擊:外部函式的執行結果一直失敗
gas攻擊:區塊有gas上限
owner賬戶攻擊:開啟或停止合約交易的權限,被盜
6.型別混亂漏洞
solidity強型別編程語言,自動匹配錯誤
但即使沒匹配成功,執行也無例外
開發人員必須人工檢查型別匹配問題
7.未知函式呼叫漏洞
函式名和引數確保函式的唯一性
當一個合約呼叫另一個合約沒有匹配正確時,會自動呼叫fallback
如果fallback中藏雷就很危險了
8.以太凍結漏洞
一些合約自身不是先轉賬函式,通過delegatecall委托呼叫外部合約中國的轉賬函式來實作轉賬
但是,若外部合約有自毀操作時,通過委托呼叫很可能會發生因為被呼叫合約的自毀而產生的ether凍結情況
EVM執行層:
1.短地址漏洞
特性:EVM自動補0
規范:輸入的合約地址必須時20個位元組,若小于則末尾自動補0
哇哦有點意思
若第一個引數為地址,第二個引數為以太幣數量
地址少輸入一個位元組,EVM就會從以太幣中拿一個位元組來填補
這樣的話ether就被左移了一個位元組
補0是對整串二進制碼的末尾補0
2.ether丟失
接收方地址是空地址(不小心轉錯了),就丟失了
3.呼叫堆疊溢位
每呼叫一次外部合約或自身呼叫都會增加一次堆疊深度,1024限制,嵌套呼叫可能會溢位
4.Tx.Origin漏洞
全域變數,回溯整個呼叫堆疊最初發起的合約地址,tx.origin == owner,誘導victim合約轉賬給attacker
3.區塊鏈系統層:
1.時間戳依賴漏洞
SC經常使用礦工確認的block.timestamp來實作事件約束
然而,創建區塊的礦工可以刻意選擇有利于他們的時間戳
2.區塊引數依賴漏洞
通過隨機函式來產生亂數
隨機種子:block.number,block.timestamp,blcok.blockhash
被礦工提前獲取,可預測,礦工可以產生有利的亂數
3.交易順序依賴漏洞
交易執行順序由礦工決定,但有些合約錯誤的順序可能有負面影響
惡意礦工可監聽,并通過惡意改變順序從而改變合約狀態,從而提前部署攻擊
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/302851.html
標籤:區塊鏈
