溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行EDU及BAI任意轉(zhuǎn)走賬戶Token事件回顧分析

發(fā)布時間:2021-12-24 11:00:20 來源:億速云 閱讀:103 作者:柒染 欄目:安全技術(shù)

這期內(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)限問題,溢出在這僅僅是個小插曲而已。 

本地復現(xiàn)

使用Remix即可簡單復現(xiàn)。 

1 部署合約 

EDU:< https://etherscan.io/address/0xa0872ee815b8dd0f6937386fd77134720d953581#code> 

BAI:< https://etherscan.io/address/0x14d9779b6585f3a7d4f768383b3cb030705dad2e#code> 

2 執(zhí)行攻擊 

被轉(zhuǎn)賬者(使用合約創(chuàng)建者地址即可):0xca35b7d915458ef540ade6068dfe2f44e8fa733c 

攻擊者:0x14723a09acff6d2a60dcdf7aa4aff308fddc160c 

transferFrom里輸入內(nèi)容并執(zhí)行:"0xca35b7d915458ef540ade6068dfe2f44e8fa733c","0x14723a09acff6d2a60dcdf7aa4aff308fddc160c","3" 

可以看到攻擊者余額增加了,變?yōu)?。

如何進行EDU及BAI任意轉(zhuǎn)走賬戶Token事件回顧分析

上述就是小編為大家分享的如何進行EDU及BAI任意轉(zhuǎn)走賬戶Token事件回顧分析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI