最近,隨著DeFi火熱,以太坊智能合約安全漏洞頻發。究竟是什么原因造成的,以及如何更好地防范這些漏洞?
概述
相比于比特幣而言,以太坊更易發生安全事故。這主要是因為以太坊虛擬機是圖靈完備的,以太坊可實現函數間相互調用、嵌套調用,智能合約間相互調用等各種復雜邏輯。而比特幣只實現了基于棧的非圖靈完備的虛擬機,并只能通過操作碼進行入棧和出棧操作。另外比特幣也沒有復雜的DApp應用,所以邏輯上簡單,故而沒有太多空間引發安全漏洞。
以太坊上各種DApp復雜的智能合約邏輯是引發安全漏洞的主因。以太坊智能合約的安全漏洞主要可以分為邏輯問題和合約代碼問題兩種。
邏輯問題?
最近頻繁的“閃電貸”攻擊是一個典型的邏輯問題引起的安全漏洞。在各種閃電貸攻擊中你可以看到清晰的邏輯問題。攻擊者只要制造出兩個系統之間的價格差,便能通過閃電貸攻擊獲利。
以太坊近期波動幅度將小于比特幣,或吸引更多長期投資者:5月22日消息,根據分析公司Glassnode跟蹤的數據,比特幣的價格區間陷入了幾個月來的最低水平,在截至5月21日的7天內達到的最高價和最低價僅相差3.4%,這是過去三年來最窄的交易區間之一。“這與2023年1月和2020年7月相當,這兩個時間點都在市場大幅波動之前。這表明高波動性可能即將到來,”Glassnode周一早些時候在推特上寫道。最近,比特幣和以太坊基于期權的波動率指標也創下了歷史新低。狹窄的交易區間表明,看漲和看跌的前景都沒有主導價格走勢。當市場面臨相互競爭的影響和敘事時,這種情況通常會發生。盡管揮之不去的美國銀行業問題有利于比特幣等被視為避險資產的上漲,但債務上限談判的僵局尚未解決以及美元指數的回升表明情況并非如此。[2023/5/22 15:18:39]
閃電貸攻擊的邏輯細節大家可以閱讀之前一篇專門講閃電貸的文章:“造富神器”閃電貸。本文主要闡述合約代碼問題。
以太坊ERC-20 Token標準發明者宣布即將推出Layer1區塊鏈項目LUKSO:金色財經報道,以太坊 ERC-20 Token 標準的發明者 Fabian Vogelsteller?宣布即將推出 Layer1 區塊鏈項目LUKSO,LUKSO是為創意經濟設計的,將與以太坊進行競爭。LUKSO 將有機會讓驗證者加入網絡。以太坊區塊鏈上將有一個 Genesis Validator 存款智能合約,它將在幾周后上線。
在 LUKSO 上,Genesis Validator Deposit Smart Contract 將允許用戶存入LYXe,這是一種ERC-20 代幣,主網上線后,LYXe 將轉換為 LYX,即 LUKSO 的原生代幣。[2023/4/6 13:46:58]
合約代碼問題?
我們知道,幾乎稍微復雜一點的代碼都或多或少地存在問題。了解出現問題的原因,并且歸納問題類別可以幫助我們更好地防范它們。下面是Ownbit錢包團隊整理的關于以太坊智能合約安全最容易出現問題的點。
數據:以太坊網絡總TVL占比降至55%附近,創歷史新低:3月8日消息,據defillama數據顯示,在多鏈趨勢下,以太坊網絡上總鎖定價值(TVL)的份額不斷被瓜分。目前,其TVL份額已跌至55.47%,創歷史新低。[2022/3/8 13:44:42]
1.重入
這是排名第一的問題。所謂“重入”就是一個方法被多次循環調用。而這通常是合約開發者所意想不到的。例如一個取款合約:
function?withdrawEther()?public?{uint?amount?=?userBalances;bool?success,?)?=?msg
這是一段很簡單的取款合約,讓用戶取走他的ETH余額。開發者并沒有意識到這段代碼可能會被重入。方法是:只要調用者是一個合約賬戶,那么msg.sender.call將默認調用該合約賬戶的fallback函數。攻擊者只需要在其fallback函數再次調用withdrawEther就可以源源不斷地取走ETH。
交易員:倫敦硬分叉和EIP-1559或會改變以太坊貨幣政策:7月27日消息,交易員布賴恩·凱利(Brian Kelly)在做客CNBC節目時表示,即將到來的倫敦硬分叉以及備受關注的EIP-1559將極大地改變以太坊的貨幣政策,在經常面臨無限制供應的批評之后,它不會變成一種通貨緊縮的貨幣,這將有助于助長“價值儲存”的說法。(U.today)[2021/7/27 1:18:05]
發生在2016年6月,著名的TheDAO攻擊,從而導致了ETC分叉的事件,就是通過同樣的方法實施攻擊的。從事后看來,這只是一個小小的程序問題。要修復這個問題也非常容易,只需要將兩行代碼調換順序即可:
????userBalances?=?0;????(bool?success,?)?=?msg.sender.call.value(amount)("");
2.讓你的交易不打包
以太坊客戶端Geth發布v1.10.6版本:金色財經報道,以太坊客戶端Geth發布v1.10.6版本,即一個修補程序版本,解決了以太坊測試網Ropsten上的共識失敗。以太坊主網上的Geth用戶必須在倫敦硬分叉激活之前升級到這個版本才能保持共識。此前消息,倫敦升級在即,以太坊開發者修復測試網上的EIP-1559相關漏洞。[2021/7/23 1:10:23]
以太坊區塊的打包機制是按照給予的礦工費進行優先打包,并且每個區塊有總GasLimit的限制。所以攻擊者可以制造出若干使用GasLimit非常大,并且GasPrice給得非常高的交易,讓它們優先占滿區塊,從而讓目標交易無法被打包。
所以,在編寫合約邏輯時,不能假設你的交易會在有限時間內被打包,否則就容易受到此類攻擊。著名的“Fomo3D”事件就是用了這樣的攻擊方法。
Fomo3D游戲規則是獎勵最后一個購得某個商品的人。每次商品被買入將重置該商品的定時器,如果在定時器達到0之前沒有其他購買者,則你將獲得系統的獎勵。攻擊者在Fomo3D中買入商品,然后同時發送大量占用區塊的攻擊交易,以至于在接下來的13個區塊內,其他購買者的交易無法被打包。這時定時器達到0,并認為無其他購買者。攻擊者便獲得了獎勵,完成了攻擊。
3.錯誤使用tx.origin
如果你發現一個合約使用了tx.origin,那么可以留心一下此處可能存在的漏洞。在大部分情況下,我們應該使用msg.sender來替代tx.origin,因為使用tx.origin容易引發安全漏洞。
很多時候,合約開發人員會假定msg.sender和tx.origin是相等的,但其實不是。例如:用戶A?調用?合約B,而合約B進一步調用?合約C,那么在合約B和C中tx.origin都將是A,而msg.sender則一個是A,一個是B。
一般攻擊者會引誘A調用一個誘導合約B,而B再去調用由A部署的目標合約C,因為合約C錯誤地使用了tx.origin,合約B可以通過傳遞過來的tx.origin獲得對合約C的控制權,從而完成攻擊。
4.溢出攻擊
智能合約里的數據是可能溢出的,例如:uint256,你覺得很大:2^256。它的確很大,但依然可以溢出。例如一個合約允許對一個數據進行加減,攻擊可以通過對這個數據進行精心策劃的調用,讓其通過溢出達到允許執行某些邏輯的目的,從而實現攻擊。
5.fallback?可以revert
fallback是可以revert的,就是說,你如果向對方轉移ether,對方可以讓你總是不成功。
例如你編寫一段合約,并且依賴于你成功向某個地址轉移ether,那么攻擊可以部署一個合約,將其fallback寫成revert來讓你來的調用總是失敗:
function?()?public?payable?{???revert?()?;?}
6.?selfdestruct可以定義任意受益者,而不會調用fallback
當你以為可以通過revert進行阻止所有人向你付款ether時,你可能又錯了。攻擊者通過創建一個合約,并且然后銷毀這個合約。銷毀合約以太坊將退還一部分ether作為鼓勵,而這個退還可以指定任意受益者,而對方的fallback函數不會被調用。
這就是說,開發者要意識到你沒有辦法完全阻止別人向你的合約賬戶轉移ether。
7.?未正確使用delegatecall
在使用delegatecall時,要注意上下文的變化。用call進行合約調用時,上下文被切換至被調用合約。而用delegatecall進行合約調用時,上下文依然在本合約。
delegatecall和call不同的調用上下文也是合約安全漏洞較常出現的地方。
8.不同方法傳氣不一樣
當我們進行ether轉移時,不同的方法傳氣不一樣。使用send()和transfer()?傳遞氣僅為2300,而使用call.value()()?則將剩余的氣全部傳遞。因此,最新的安全規范是建議使用call而不是?send或者transfer進行ether轉移。
如果你發現一個合約還是使用send或者transfer,那么你可以制造出目標合約,讓其轉移OutofGas。
結語
以上這些點是合約代碼最常出現問題的點。每個錯誤的原因都比較原子化,理解相應的原理可以幫助我們有效地避免這些問題。當合約邏輯復雜時,一定會有更加復雜、隱藏得更深的邏輯問題,這時,這些原子點的檢查依然可以幫助我們找到它們。
以太坊智能合約的安全問題主要是因為其“過于靈活”引起的。靈活性和安全性如同天平的兩端。以太坊選擇了靈活性,某種程度上便把安全性的潛在風險留給了市場。
一個DeFi項目能否安全穩定地運行,或是會被黑客攻擊,取決于合約開發人員對原理的理解、對細節的把控,以及嚴肅認真的態度。線上合約犯錯的代價是巨大的,這就對合約開發人員提出了更高的要求!
Tags:以太坊ALLETHTHE以太坊硬幣ETHDtrustwallet安全嗎EETH幣togetherbnb中文版下載
“存幣即挖礦”邀請好友存幣享+10%算力加成每日領收益|邀友加算力|年化高收益一、存幣/充值即挖礦、余額可挖礦聚幣Jubi于2020年11月11日全面開啟“存幣即挖礦”.
1900/1/1 0:00:00上周周總結 近幾個月幣價波動肉眼可觀非常活躍,利潤也是不出意料的可觀,根據朋友圈給出的策略統計出的這周BTC共進場16次,止損3次,整體獲利2485個點,方便計算還是以10手建倉為計算標準.
1900/1/1 0:00:00區塊鏈正在朝著多鏈共存的世界邁進,我們要如何允許用戶跨鏈無縫地傳遞價值并與合約進行交互?對于以太坊L2鏈來說,這個問題更加嚴峻.
1900/1/1 0:00:00比特幣2年暴漲4倍。 11月12日晚,比特幣站上16000美元關口,刷新2018年1月以來新高,一周漲超8.6%。比特幣總市值突破2915億美元.
1900/1/1 0:00:00新冠疫情的降臨以及爆發,導致各國經濟都嚴重下滑,尤其是部分歐美國家,在此情況下各國不得不使出所有能夠拯救經濟的手段,這些手段在宏觀經濟學上大致可分為兩大類,財政政策與貨幣政策.
1900/1/1 0:00:00近日,BIS基于各央行關于央行數字貨幣的研究報告、演講及網站相關信息、央行工作人員提供的情況、支付與市場基礎設施委員會等機構和部分學者的調研成果,梳理了各央行CBDC研發進展.
1900/1/1 0:00:00