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