撰文:Chen?Bo?Yu、Hsu?Tzu?Hsiu
智能合約基礎介紹
在探討智能合約漏洞解析之前,我們先從一個基本的范例來了解一個智能合約會具備哪些元素。
●?變數:即此范例中的balances,在這個合約中負責存儲使用者地址在合約中對應的存款余額
●?函數:即此范例中的getBalance,使用者呼叫此函數時,會回傳使用者在合約中的存款余額
●?接收函數:即此范例中的receive,這是一個內建的函數。當合約收到使用者傳入ETH且無呼叫其他函示時會觸發,此范例在觸發接收函數時,會變更變數balances的狀態,而函數中的msg.sender代表的是交易的發送者地址
●?回退函數:即此范例中的fallback,這也是一個內建的函數。當使用者呼叫了不存在的函數時觸發,可以理解為例外處理函數。在此范例中,觸發時把交易回退,亦即讓交易失效。
常見漏洞解析
了解問題發生的原因,并且歸納問題的類別可以幫助我們更好的防范。DASP收錄了十種智能合約漏洞,下面我們整理了其中最常見的合約漏洞以及新型態的攻擊模式。
研報:識別“具有系統重要性”的區塊鏈銀行的協議可以預防市場崩潰:金色財經報道,泰國Chulalongkorn 大學研究員 Kanis Saengchote 最近開發了一個框架,用于識別和衡量去中心化金融(DeFi)機構的系統性風險。
新協議稱為全球系統重要性協議(G-SIP),這是一個識別和衡量“全球系統重要性銀行”(G-SIB)的系統。使國際清算銀行能夠發現弱點并制定標準,從而更好地防止損失。Saengchote 的研究論文詳細介紹了一種方法,通過該方法可以將類似的標準應用于論文中所說的“區塊鏈銀行”,即在區塊鏈上運行的任何 DeFi 協議。[2023/8/3 16:15:07]
1.重入漏洞
重入漏洞是最著名的智能合約漏洞,先前提到TheDAO事件中也是為此原因而被駭客攻擊,該漏洞原理是通過循環調用一個函數而達到攻擊目的。
這邊展示的是一個簡單的提款函數,讓使用者可以根據合約里的余額取走存款。可以注意到的是,當這個函數的調用者為一智能合約的時候,提款操作將會觸發該智能合約的receive函數,并把剩余的gas傳入。而此時還未把使用者在原先智能合約中記錄的余額歸零,攻擊者即可在receive函數里再次調用withdrawBalance函數,并通過余額狀態尚未修改的漏洞達到重復取款的目的,直到gas耗盡或合約被掏空。
開源證券研報:能否取得合法地位等將直接影響比特幣長期價格表現:2月9日消息,開源證券宏觀研報顯示,比特幣目前可在部分國家替代官方法幣,用于商品購買、金融交易等。同時,比特幣的數量上限被鎖定為2100萬枚,較黃金更加稀缺。這一背景下,比特幣被認為有望成為全球性“保值貨幣”,可對沖美元等濫發風險。中短期來看,伴隨全球經濟在疫苗支持下修復加快、主流央行政策退出預期抬升,比特幣價格波動或將加大。長期而言,比特幣能否真正成為全球性“保值貨幣”,與數字貨幣發展、監管政策變化等密切相關。比特幣目前合法性未被廣泛承認,在大部分國家游離于法律和監管的灰色地帶。對于比特幣而言,能否取得合法地位及不被有國家主權背書的數字貨幣替代,將直接影響長期價格表現。(券商中國)[2021/2/9 19:15:53]
攻擊流程圖展示
防范方式也很簡單,只要先把智能合約紀錄的余額做清空,再做轉帳動作,即可避免攻擊發生。
2.整數溢位漏洞
在以太坊智能合約中,uint256是常見的整數型別,這意味著此變數可以儲存的整數范圍為0~2^256-1,存儲上限大約是一個78位數的值,你可能會覺得這個數已經夠大了,但它仍然可被用來達成溢位,也就是說當一個變數的值為2^256-1,而對這個變數的值又再進行加一的操作時,他的值會因為超過存儲上限而變為0。要避免此漏洞,我們需要在整數運算前針對整數的范圍去做檢查,并在偵測到溢位運算時即時拋出異常。
動態 | 研報:中國中產階級不熱衷于投資加密貨幣:據Cryptovest消息,由大學教授和金融作家吳曉波領導的一項研究發現,中國的中產階級投資者并不熱衷于投資加密貨幣,只有不到10%的人對數字資產感興趣。調查結果導致吳和他的團隊得出結論,中國中產階級投資者基本上不愿承擔風險,只有9.2%的受訪者表示投資組合損失超過15%是可以接受的。同時吳的報告指出,中國在線論壇上討論數字貨幣潛力是一種可行的財富保護手段的趨勢越來越明顯。[2018/9/27]
3.阻斷服務攻擊
智能合約服務中斷是一個嚴重的問題,因為有些漏洞造成的服務中斷是永久性的,無法恢復。攻擊原理包括了:意外執行SELFDESTRUCT指令、訪問控制權限出錯、Gaslimit達到區塊上限使合約無法正常運作、以及我們這邊展示的利用異常拋出,造成合約永久性癱瘓。
這是一個簡單的拍賣合約示例,出價高者可以成為currentLeader,并記錄該次競標出價為highestBid,同時把先前的出價金額還給前一個競標領先者。攻擊者可以部署一個智能合約,在正常出價后讓該合約成為currentLeader,并在合約內負責收款的receive函數中使用revert函數來拋出異常,讓交易失效。當其他使用者想出價競標時,會因為合約無法轉錢給currentLeader,而造成交易失敗,拍賣合約的功能也因此永久失效,攻擊者得以贏下此次的拍賣競標。
分析 | 加拿大央行研報:在區塊鏈進行雙花欺詐是不現實的:加拿大央行日前公布對區塊鏈技術的激勵相容研究結果,著重于通過區塊鏈技術的工作量證明(PoW)共識機制建模,模擬誠實和不誠實礦工的行為,發現利用區塊確認時間差進行雙重支付的欺詐是“不現實的”。上述研究報告查看區塊鏈這樣的數字賬本是否免于對雙重支付——所謂雙花這類欺詐,發現如果一個礦工掌握50%以上算力,具備了51%攻擊的能力,理論上說,不誠實的礦工可以進行雙花欺詐,但從經濟角度看,為了實現這種欺詐,不誠實的礦工必須有很雄厚的財力,而且是“風險中性”,因此報告認為:“這種假設情況通常是不現實的,現實情況下,用戶幾乎沒有經濟方面的動機發起這種攻擊,特別是在其他礦工的計算投資龐大時。”[2018/7/23]
攻擊者合約示例
4.?Txorigin漏洞攻擊
當開發者利用solidity中內建的tx.origin變數來驗證權限時,會讓攻擊者有攻擊的機會。在進入示例之前,須先了解tx.origin返回的是原始發送交易的地址,而msg.sender返回的是當前交易的發送者。以下示意圖情景為:
用戶A呼叫了合約B內部的函數,并在函數內又再呼叫了合約C。可以觀察tx.origin與msg.sender的差異。
天風證券最新研報:預計2020年國內供應鏈金融規模達15萬億,區塊鏈能夠更好的進行企業風險刻畫:4月16日,天風證券最新研報顯示,預計到2020年,國內供應鏈金融市場規模將接近15萬億元。研報顯示,供應鏈上的核心企業以及做供應鏈管理的傳統巨頭企業天然具有開展供應鏈金融業務的優勢,而區塊鏈技術能夠更好的進行企業風險刻畫,從而擴大業務覆蓋范圍,因此非常有動力搭建區塊鏈供應鏈金融平臺,但對自身供應鏈之外的企業吸引力較低。但區塊鏈初創公司在與核心企業的談判中,并不具備非常大的話語權,因此目前主要還是以技術服務商的角色來參與,很難做成生態。[2018/4/16]
接下來來看看實際的攻擊場景,上圖智能合約中的sendTo函數必須符合tx.origin與owner相等的條件才會被執行,但是攻擊者可以通過下圖的智能合約,利用上述提過tx.origin與msg.sender的差異,巧妙地繞過驗證,并觸發sendTo函數。具體細節是當攻擊者誘導上圖合約的owner去觸發了下圖合約的fallback函數時,若攻擊合約在fallback函數內去調用sendTo函數,就可以得到owner的權限去執行。
5.未適當處理externalcall的回傳值
在智能合約中,使用到低層級調用函數指令時,如:address.call()、address.callcode()、address.delegatecall()?和address.send()等等,如果調用失敗并不會拋出異常,僅會回傳調用結果的布林值,合約將能繼續往下執行。若未對調用結果的回傳值做檢查,可能將會使智能合約無法正常運作。
我們以一個簡單的取款函數作為示例,當使用一合約呼叫上圖的withdraw函數,且若該合約不能接收ETH轉入時,會造成呼叫方無法收到ETH,但因合約會繼續往下執行,導致其在合約中balances的狀態紀錄被改變。修正寫法如下:
6.?短地址攻擊
此攻擊手法大多出現在ERC-20智能合約中,須先了解到,當我們呼叫一個函數時,在EVM里實際上是在解析一堆ABI字符。而一般ERC-20標準的代幣都會實現用來轉帳的transfer函數,當我們調用transfer函數時,交易的調用內容由3個部分組成:
●4字節,函數名的哈希值,例如:a9059cbb
●32字節,以太坊地址,例如:
00000000000000000000000011223344556677889900aabbccddeeff11223344
●32字節,代表需要轉送的代幣數量:
0000000000000000000000000000000000000000000000000de0b6b3a7640000
若攻擊者地址為:0x1234567890123456789012345678901234567800,且在呼叫transfer時刻意舍去尾數零,若合約內沒有對內容格式做檢查,EVM讀取時會從第三個參數的高位拿00來補充,這將造成實際想要轉送的代幣數量缺少一個字節,即向左移位了8個比特,數值瞬間擴大256倍,攻擊者成功盜取代幣合約中的代幣。
7.閃電貸攻擊
閃電貸,顧名思義就是快速貸款,那這個速度有多快呢?官方的解釋是,貸款發行和償還的交易必須在以太坊上同一個區塊內完成。可以說閃電貸是一種借助于區塊鏈技術的顛覆式創新,它與傳統的借貸有兩個主要的差別,一個是它無需抵押品,第二個是它要求要在執行借出的同一筆交易中執行還款操作,因此對于出借資金的那方來說是不用承擔違約風險的,因為只有當區塊鏈上借貸方執行的借出與還款操作都確實被執行了,這筆交易才有效。也就是說我們可以設計一個智能合約來借出資金,接著執行一些資金操作,最后在將資金歸還,而這些操作都會在同一筆交易中完成。這就給黑客們帶來了利用閃電貸發動攻擊的機會,因為它大大的降低了黑客的攻擊成本,近期在DeFi領域的多數攻擊都是使用閃電貸來實現,主要都是黑客通過借出的巨額資金來對協議制造價差并從中套利,還款后再帶著不當獲利逃之夭夭。我們從bZx攻擊事件來了解黑客的攻擊思路:
1.?黑客通過閃電貸從去中心化數字資產衍生交易平臺dYdX借出了一萬枚ETH
2.?使用其中的5000枚ETH抵押在去中心化借貸平臺Compound以借出112枚wBTC
3.?剩下的的5000枚ETH到去中心化借貸平臺bZx上開了wBTC的空單
4.?用借出的112枚wBTC到去中心化交易所Uniswap砸盤,讓wBTC價格快速下跌
這一系列操作讓黑客在bZx上開的空單倉位大賺,接著歸還閃電貸借出的一萬枚ETH,并在這個過程中獲得了價值35萬美元的收益。此次攻擊的主要原因是因為Uniswap的價格的劇烈變化最終導致資產的損失,這本該是正常的市場行為,但是黑客通過惡意操縱市場,使項目方造成損失。bZx合約被操縱一事,開始讓閃電貸進入了更多開發者的視線,一方面許多聰明的開發者開發出了全新的去中心化金融應用,同時也讓開發者更為警惕可能的邏輯攻擊。
結論
智能合約的運作為被動的,所有的合約動作均須由使用者發起交易、呼叫合約中的函數函數才會執行動作,而合約執行基于區塊鏈的特性是不可逆的,且當合約部署上區塊鏈后,所有資料都是公開透明的,即便代碼不開源,也可利用反組譯工具回推合約內容。因此,開發者需熟悉漏洞原理并避免之,使用者也應了解合約安全議題,維護自身權益。
Tags:區塊鏈SEN比特幣ENDaia幣區塊鏈Sensorium閃電比特幣Friends With Benefits Pro
12月16日消息,英國金融行為管理局今日在其官網公布了一項針對現有加密資產業務的臨時注冊制度,允許已向FCA申請注冊的加密資產公司在2021年7月9日之前繼續交易.
1900/1/1 0:00:0012月16日,一枚比特幣破兩萬美金,幣圈大部分人和在比特幣價格破前高的光輝映襯下,另一則消息卻顯得黯淡許多,但對DeFi市場卻意義非凡,去中心化抵押借貸市場總借款量突破34億美元,創歷史新高.
1900/1/1 0:00:00本文來源:FX168財經周一,比特幣在周日攀升至逾2.4萬美元的歷史新高,隨后暴跌,并在上午一度跌至2.2萬美元。目前的價格回升至2.3萬美元.
1900/1/1 0:00:00閃電兌換是通過一方公開報價,另一方快速成交的交易模式,鏈下撮合,鏈上結算。用戶在閃電兌換上沒有傳統交易模式的對手盤,所有的交易深度由做市商者提供.
1900/1/1 0:00:00原標題:《DeFi中價值千萬的關鍵字Gitcoin》 來源:去中心化金融社區 Gitcoin是什么?它是Vitalik為了解決以太坊生態項目融資效率低的問題而提出來的算法構想的社區產品.
1900/1/1 0:00:00據Decrypt12月23日報道,幣安支持的CereNetwork宣布完成第二輪融資,共籌集了150萬美元,以在Polkadot上啟動第一個去中心化數據云平臺.
1900/1/1 0:00:00