SECBIT: 美鏈(BEC)合約安全事件分析全景

原文https://blog.csdn.net/secbit/article/details/80045167

今天下午2點多,幣圈鏈圈各個媒體突然爆料 美圖科技發行的數字貨幣——美鏈(BEC) 的Token 智能合約出現重大漏洞,攻擊者可無限生成代幣。

【小蔥獨家:BEC合約出現重大漏洞,攻擊者可無限生成代幣】OKEx今日發佈最新公告稱,暫停BEC交易和提現。據小蔥APP瞭解,這是因爲BEC美蜜合約出現重大漏洞,攻擊者可以通過代幣合約的批量轉賬方法無限生成代幣。 小蔥注:美鏈今年2月在OKex上線BEC交易。美鏈和美圖公司合作幫助美圖旗下的BeautyPlus提升內容價值和市場佔有率,同時Beautyplus作爲美鏈的種子應用,協助美鏈的冷啓動。美鏈發的Token叫做美蜜BEC。

美鏈官方聲明 
這裏寫圖片描述美鏈官方聲明

坊間傳聞下午時候,美鏈團隊發現異常交易,於是立刻通知各交易所,停止 BEC 的交易和提現功能。正好實驗室的同事們忙裏偷閒,一起分析了下這個出問題的合約代碼。

這個漏洞比較明顯,屬於常見的 整數溢出(overflow)問題

下面我們來簡單分析下這個出問題的合約函數:

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;
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

這個函數 batchTransfer(..) 的功能爲批量轉賬,是美鏈團隊在 ERC20 標準合約基礎上擴展的函數。調用者可以傳入若干個地址和轉賬金額,經過一些強制檢查交易,再依次對balances進行增減操作,以實現 Token 的轉移: 
很明顯,當傳入值_value過大時,uint256 amount = uint256(cnt) * _value會發生溢出(overflow),導致amount變量無法正確等於cnt倍的_value,變得異常變小,從而使得後面的require對轉賬發起者的餘額校驗可正常通過。

我們再來觀察攻擊交易詳細信息。

Function: batchTransfer(address[] _receivers, uint256 _value)

MethodID: 0x83f12fec
[0]:  0000000000000000000000000000000000000000000000000000000000000040
[1]:  8000000000000000000000000000000000000000000000000000000000000000
[2]:  0000000000000000000000000000000000000000000000000000000000000002
[3]:  000000000000000000000000b4d30cac5124b46c2df0cf3e3e1be05f42119033
[4]:  0000000000000000000000000e823ffe018727585eaf5bc769fa80472f76c3d7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

攻擊者傳入8000000000000000000000000000000000000000000000000000000000000000作爲_value,而_receivers數組的大小爲2,相乘之後剛好可超過uint256所能表示的整數大小上限,引發溢出問題,最終使得原本總量固定的 Token 得到“增發”,併成功讓兩個目標賬戶 Token 餘額劇增。對於這種整數溢出漏洞,最爲 
推薦的方法是採用 SafeMath 數學計算庫來避免。但是很不幸的是,這個問題合約的其餘函數都正常使用了SafeMath 來避免 overflow 和 underflow 問題, 
但是卻在最關鍵的地方,漏掉了防溢出檢查,正所謂“百密而一疏”。

順便提一句,上面的問題代碼,僅需這樣簡單修改,即可防止 overflow 問題。

// uint256 amount = uint256(cnt) * _value;  // 問題代碼
uint256 amount = _value.mul(uint256(cnt)); // 使用 SafeMath 庫
  • 1
  • 2

交易記錄 
這裏寫圖片描述

持倉異常統計 
這裏寫圖片描述

如圖中所示的鉅額數量 Token,我們很容易計算下,大約有10的58次方個 BEC。而事發前其市場價約爲 0.3 美元。如果這些幣流入交易所並賣出,其後果不敢想象。而發幣方美鏈(BEC)則會遇到大麻煩。

幣價閃崩 
這裏寫圖片描述

國內的區塊鏈團隊如雨後春筍,但是代碼在上線前可能並沒有做過專業審計,也沒有通過設置賞金來懸賞漏洞。 
對待安全這一問題上,國外的多數區塊鏈項目要更成熟一些,智能合約在上線部署前都會尋求專業安全審計團隊的幫助。 
一些大的交易所和錢包也都會要求提供第三方審計報告。去年12月份,美國明星交易所 Coinbase 的一個潛在合約漏洞被荷蘭的一家專業安全公司發現並上報,從而避免了鉅額的損失。可能有的朋友不明白,爲何智能合約的代碼這麼短,還會出這麼多的問題? 
其實,但凡從事智能合約開發2個月以上的同行都會對 EVM 以及 solidity 的各種坑印象深刻。

BEC事件不會是個案,安全問題容易被忽視。實驗室同事也果斷迅速掃描了一下整個以太坊上的全部合約, 
居然發現了還有 12 個 Token 也存在着幾乎一模一樣的問題,於是第一時間給相關開發團隊發了個郵件提醒。 
同時我們也希望越來越多的團隊能夠選擇上線前,找專業團隊做審計工作。除了代碼上的漏洞和缺陷外,也請大家也更加關注合約中的規則漏洞或後門。 
相比整數溢出漏洞,這一類的高級規則漏洞則是非常,非常,非常不容易被發現。

在這裏我們再次提醒各個區塊鏈團隊以及智能合約開發愛好者,合約發佈需要慎之又慎。


SECBIT實驗室 由一羣熱愛區塊鏈技術的極客組建,專注於可信智能合約與安全共識協議研究。實驗室成員遍佈在多個國家,專業領域涉及區塊鏈底層架構、智能合約語言、形式化驗證、密碼學與安全協議、編譯與分析技術、博弈論與加密經濟學等諸多領域。SECBIT實驗室 目前着重於研究區塊鏈智能合約的安全問題,助力區塊鏈團隊提高智能合約的可靠性與安全性,同時也開展構建智能合約安全框架的理論探索與技術研發。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章