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