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