摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接美鏈合約漏洞技術(shù)分析原文已更新,請讀者前往原文閱讀這兩天幣圈鏈圈被美鏈智能合約的漏洞導(dǎo)致代幣價值幾乎歸零的事件刷遍朋友圈。
本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)
原文鏈接:美鏈BEC合約漏洞技術(shù)分析原文已更新,請讀者前往原文閱讀
這兩天幣圈鏈圈被美鏈BEC智能合約的漏洞導(dǎo)致代幣價值幾乎歸零的事件刷遍朋友圈。這篇文章就來分析下BEC智能合約的漏洞
漏洞攻擊交易我們先來還原下攻擊交易,這個交易可以在這個鏈接查詢到。
我截圖給大家看一下:
攻擊者向兩個賬號轉(zhuǎn)移57896044618...000.792003956564819968個BEC,相當(dāng)于BEC憑空進行了一個巨大的增發(fā),幾乎導(dǎo)致BEC價格瞬間歸零。
下面我們來分析下這個攻擊過程。
我們先來看看BEC智能合約的代碼,
BEC在合約中加入一個批量轉(zhuǎn)賬的函數(shù),它的實現(xiàn)如下:
function batchTransfer(address[] _receivers, uint256 _value) public whenNotPaused returns (bool) { uint cnt = _receivers.length; uint256 amount = uint256(cnt) * _value; require(cnt > 0 && cnt <= 20); require(_value > 0 && balances[msg.sender] >= amount); balances[msg.sender] = balances[msg.sender].sub(amount); for (uint i = 0; i < cnt; i++) { balances[_receivers[i]] = balances[_receivers[i]].add(_value); Transfer(msg.sender, _receivers[i], _value); } return true;
這個函數(shù)的作用是,調(diào)用者傳入若干個地址和轉(zhuǎn)賬金額,在經(jīng)過一些條件檢查之后,對msg.sender的余額進行減操作,對每一個對每一個傳入的地址進行加操作,以實現(xiàn)BEC的轉(zhuǎn)移。
問題出在 uint256 amount = uint256(cnt) * _value; 這句代碼,當(dāng)傳入值_value過大時(接近uint256的取值范圍的最大值),uint256 amount = uint256(cnt) * _value計算時會發(fā)生溢出,導(dǎo)致amount實際的值是一個非常小的數(shù)(此時amount不再是cnt * _value的實際值),amount很小,也使得后面對調(diào)用者余額校驗可正常通過(即require(_value > 0 && balances[msg.sender] >= amount)語句通過)。
我們來結(jié)合實際攻擊交易使用的參數(shù)來分析一下:
batchTransfer的參數(shù)_value值為16進制的800000000000000000000...,參數(shù)_receivers數(shù)組的大小為2,相乘之后剛好可超過uint256所能表示的整數(shù)大小上限,引發(fā)溢出問題amount實際的值為0,后面的轉(zhuǎn)賬操作實際上msg.sender的余額減0, 而對兩個賬號進行了加16進制的800000000000000000000...,最終的結(jié)果是相當(dāng)于增發(fā)了2 * 16進制的800000000000000000000...。
實際上對于這種整數(shù)溢出漏洞,最簡單的方法是采用 SafeMath 數(shù)學(xué)計算庫來避免。有趣的是BEC智能合約代碼中,其實其他的都使用了SafeMath, 而關(guān)鍵的uint256 amount = uint256(cnt) * _value卻沒有使用。
心痛程序員,也心痛韭菜。這句代碼改為uint256 amount = _value.mul(uint256(cnt));就可以防止溢出問題
所以在做加減乘除的時候請記得一定使用:SafeMath,代碼在這里
溢出補充說明溢出補充說明為小專欄訂閱用戶福利,小專欄的文章內(nèi)介紹了什么時候會發(fā)生上溢,什么時候會發(fā)生下溢,并且給出了代碼事例。
大家可請前往我的小專欄閱讀。
? 深入淺出區(qū)塊鏈 - 系統(tǒng)學(xué)習(xí)區(qū)塊鏈,打造最好的區(qū)塊鏈技術(shù)博客。
? 我的知識星球為各位解答區(qū)塊鏈技術(shù)問題,歡迎加入討論。
? 關(guān)注公眾號“深入淺出區(qū)塊鏈技術(shù)”第一時間獲取區(qū)塊鏈技術(shù)信息。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/24094.html
摘要:引言給迷失在如何學(xué)習(xí)區(qū)塊鏈技術(shù)的同學(xué)一個指引,區(qū)塊鏈技術(shù)是隨比特幣誕生,因此要搞明白區(qū)塊鏈技術(shù),應(yīng)該先了解下比特幣。但區(qū)塊鏈技術(shù)不單應(yīng)用于比特幣,還有非常多的現(xiàn)實應(yīng)用場景,想做區(qū)塊鏈應(yīng)用開發(fā),可進一步閱讀以太坊系列。 本文始發(fā)于深入淺出區(qū)塊鏈社區(qū), 原文:區(qū)塊鏈技術(shù)學(xué)習(xí)指引 原文已更新,請讀者前往原文閱讀 本章的文章越來越多,本文是一個索引帖,方便找到自己感興趣的文章,你也可以使用左側(cè)...
摘要:加密數(shù)字貨幣價格巔峰,區(qū)塊鏈成二線企業(yè)股價春藥年月日,是區(qū)塊鏈行業(yè)的高光時刻,整個加密數(shù)字貨幣市值億美元,人民幣近萬億元。直接原因是,當(dāng)日,中網(wǎng)載線剛剛宣布與井通網(wǎng)絡(luò)科技有限公司合作開展區(qū)塊鏈產(chǎn)業(yè)。 加密數(shù)字貨幣價格巔峰,區(qū)塊鏈成二線企業(yè)股價春藥 2018 年 1 月 8 日,是區(qū)塊鏈行業(yè)的高光時刻,整個加密數(shù)字貨幣市值 8139 億美元,人民幣近 6 萬億元。在 10 天之前,12 ...
一行代碼蒸發(fā)了¥6,447,277,680 人民幣! 現(xiàn)在進入你還是先行者,最后觀望者進場才是韭菜。 美圖董事長蔡文勝曾在三點鐘群,高調(diào)的說出了這句話,隨即被大眾瘋傳。 在他發(fā)表完言論沒多久,2月美鏈(BEC)上交易所會暴漲4000%,后又暴跌。盡管他多次否認,聰明的網(wǎng)友早已扒出,他與BEC千絲萬縷的關(guān)系。 showImg(https://segmentfault.com/img/remote/1...
摘要:說明最近在做以太坊智能合約的開發(fā),在使用做接口的時候遇到很多問題,記錄下來當(dāng)做參考。簡單說下拍賣智能合約思路用戶注冊新用戶自動注冊一個賬戶地址發(fā)起拍賣最高者存在智能合約里拍賣結(jié)束獲取合約中的最高者關(guān)閉合約 說明 最近在做以太坊智能合約DAPP的開發(fā),在使用PHP做接口的時候遇到很多問題,記錄下來當(dāng)做參考。本文的操作環(huán)境為Mac,已經(jīng)安裝好truffle/ganache等開發(fā)需要的相關(guān)工...
摘要:摘要今年的先知白帽大會,與會者將能夠親身感受到非常多有趣的技術(shù)議題,如在國際賽事中屢奪佳績的團隊,其隊長將親臨現(xiàn)場,分享穿針引線般的漏洞利用藝術(shù)。從數(shù)據(jù)視角探索安全威脅阿里云安全工程師議題解讀本議題討論了數(shù)據(jù)為安全人員思維方式帶來的變化。 摘要: 今年的先知白帽大會,與會者將能夠親身感受到非常多有趣的技術(shù)議題,如HITCON在國際賽事中屢奪佳績的CTF團隊,其隊長Orange將親臨現(xiàn)場...
閱讀 1694·2019-08-30 15:54
閱讀 3346·2019-08-26 17:15
閱讀 3536·2019-08-26 13:49
閱讀 2589·2019-08-26 13:38
閱讀 2301·2019-08-26 12:08
閱讀 3065·2019-08-26 10:41
閱讀 1378·2019-08-26 10:24
閱讀 3387·2019-08-23 18:35