您好,登錄后才能下訂單哦!
這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)如何進行EDU及BAI任意轉(zhuǎn)走賬戶Token事件回顧分析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
2018年5月23日晚間,EDU(EduCoin)被爆出現(xiàn)合約漏洞,多達數(shù)十億代幣被盜。EduCoin是建立在區(qū)塊鏈和智能合約技術(shù)基礎(chǔ)上,面向在線教育內(nèi)容分享和服務的去中心化教育平臺,而EDU是基于以太坊ERC-20協(xié)議發(fā)行的項目代幣,總量150億。
在曝出合約漏洞之前,EDU的交易K線就已出現(xiàn)了大量拋售的現(xiàn)象。從2018年5月20日午夜開始,大量EDU被人拋售,而持續(xù)的拋售帶來的則是市場的進一步恐慌,EDU的價格持續(xù)走低,直到EDU的交易對被迫關(guān)停,期間累計售出的EDU超過20億。
黑客之所以非常容易得竊取了代幣,正是因為EDU的智能合約,存在一個非常大的安全漏洞。
針對EDU&BAI智能合約出現(xiàn)的問題,BUGX團隊做了一些簡單分析,僅供參考:
在 transferFrom 函數(shù)中,未校驗 `allowed[_from][msg.sender] >= _value` 并且函數(shù)內(nèi) `allowed[_from][msg.sender] -= _value`; 沒有使用 SafeMath,導致無法拋出異常并回滾交易。目前發(fā)現(xiàn)有大量洗劫行為,攻擊者不需要私鑰即可轉(zhuǎn)走你賬戶里所有的 EDU,并且由于合約沒有 Pause 設(shè)計,導致無法止損。
本漏洞目前被發(fā)現(xiàn)在EDU及BAI合約中。
合約轉(zhuǎn)賬情況:
EDU: < https://etherscan.io/token/0xa0872ee815b8dd0f6937386fd77134720d953581>
BAI:< https://etherscan.io/token/0x14d9779b6585f3a7d4f768383b3cb030705dad2e>
合約中漏洞代碼如下:
// 批準轉(zhuǎn)賬上限(批準目標可以代我轉(zhuǎn)賬的上限)
function approve(address _spender, uint256 _value) public returns (bool success) {
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
// 代我轉(zhuǎn)賬的流程
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
/// same as above
require(_to != 0x0); // 檢測轉(zhuǎn)賬對象非空地址
require(balances[_from] >= _value); // 檢測被轉(zhuǎn)賬者余額大于_value
require(balances[_to] + _value > balances[_to]);
uint previousBalances = balances[_from] + balances[_to];
balances[_from] -= _value;
balances[_to] += _value;
// 減少從被轉(zhuǎn)賬者到本交易發(fā)起者的允許轉(zhuǎn)賬額度,但沒有做異常檢測,導致報錯后繼續(xù)執(zhí)行
allowed[_from][msg.sender] -= _value;
Transfer(_from, _to, _value);
assert(balances[_from] + balances[_to] == previousBalances);
return true;
}
可以看出,這個流程并沒做 allowed[ _from][msg.sender] 和 _value 的判斷,比如函數(shù)開始應該判斷:
require(allowed[ _from][msg.sender] >= _value);
如果 allowed[ _from][msg.sender] 不存在,那么值是 0,判斷缺失,也就等于之前的 approve 函數(shù)形同虛設(shè)。然后,這還出現(xiàn)了個有趣的溢出:
allowed[ _from][msg.sender] -= _value;
當 allowed[ _from][msg.sender] 不存在,那么值是 0,減去 _value(大于 0 時),就溢出了(溢出并不會導致中斷回滾)。這就是為什么如果用了 SafeMath 就會沒問題,因為 SafeMath 會拋出錯誤,直接中斷回滾 transferFrom 函數(shù)。
整體這樣看下來,EDU 和 BAI 等合約的 transferFrom 盜幣事件最核心的問題是權(quán)限問題,溢出在這僅僅是個小插曲而已。
使用Remix即可簡單復現(xiàn)。
EDU:< https://etherscan.io/address/0xa0872ee815b8dd0f6937386fd77134720d953581#code>
BAI:< https://etherscan.io/address/0x14d9779b6585f3a7d4f768383b3cb030705dad2e#code>
被轉(zhuǎn)賬者(使用合約創(chuàng)建者地址即可):0xca35b7d915458ef540ade6068dfe2f44e8fa733c
攻擊者:0x14723a09acff6d2a60dcdf7aa4aff308fddc160c
transferFrom里輸入內(nèi)容并執(zhí)行:"0xca35b7d915458ef540ade6068dfe2f44e8fa733c","0x14723a09acff6d2a60dcdf7aa4aff308fddc160c","3"
可以看到攻擊者余額增加了,變?yōu)?。
上述就是小編為大家分享的如何進行EDU及BAI任意轉(zhuǎn)走賬戶Token事件回顧分析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。