【原文】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實驗室 目前着重於研究區塊鏈智能合約的安全問題,助力區塊鏈團隊提高智能合約的可靠性與安全性,同時也開展構建智能合約安全框架的理論探索與技術研發。