曲速區(qū)提醒:部分合約存在不一致性檢查漏洞區(qū)塊鏈

曲速未來安全區(qū) 2018-07-27 23:45
分享到:
導(dǎo)讀

曲速區(qū)表示:部分合約中的transferFrom中存在不一致性檢查漏洞(checkeffectinconsistency)。

一、前言

近日,據(jù)曲速區(qū)消息:部分合約中的transferFrom中存在不一致性檢查漏洞(check effect inconsistency)。

什么是ERC20代幣?

簡單的說,任何 ERC20 代幣都能立即兼容以太坊錢包(幾乎所有支持以太幣的錢包,包括Jaxx、MEW、imToken等,也支持erc-20的代幣),這就意味著,在很多情況下,這些代幣都是可以立即進(jìn)行交易的。

ERC20 讓以太坊區(qū)塊鏈上的其他智能合約和去中心化應(yīng)用之間無縫交互。因此ERC20協(xié)議是目前數(shù)字貨幣交易體系中較為主流的一種協(xié)議體系。但是該協(xié)議也存在不完善的地方。

ERC20規(guī)定了代幣名稱、代號、發(fā)行量、轉(zhuǎn)賬等一系列常用的代碼規(guī)范,只要按照這個規(guī)范來設(shè)計(jì)的代幣智能合約,就能在絕大多數(shù)以太坊錢包上使用。

ERC20標(biāo)準(zhǔn)使用起來也非常方便,幾十行代碼即可實(shí)現(xiàn)完整功能的代幣。所以熟練的程序員用15分鐘建立一個ERC20代幣并不是困難的事。

但是,發(fā)幣容易,守幣難。經(jīng)常被發(fā)現(xiàn)有漏洞,導(dǎo)致?lián)p失慘重。

4月22日,有黑客利用以太坊 ERC20 智能合約中 BatchOverFlow 漏洞中數(shù)據(jù)溢出的漏洞攻擊了美鏈 BEC 的智能合約,從中盜取產(chǎn)出57,896,044,618,658,100,000,000,000,000,000,000,000,000,000,000,000,0 億個BEC ,并大規(guī)模的向市場上拋售。

4月25日,代幣SMT發(fā)現(xiàn)與被爆出的BEC代幣類似的安全漏洞,可以利用溢出攻擊獲得大量代幣。

這些數(shù)字多到數(shù)不清…

然而出問題的遠(yuǎn)遠(yuǎn)不止這些。漏洞事件集中爆發(fā),不同的項(xiàng)目存在相同的漏洞,這也讓業(yè)內(nèi)一直存在的“代碼互抄”現(xiàn)象,再次成為網(wǎng)絡(luò)上關(guān)注區(qū)塊鏈技術(shù)的投資者們討論的話題。

回顧上次LightCoin合約非一致性檢查漏洞。

簡述一下LightCoin:

LIGHT (光鏈) 是世界上第一個雙層區(qū)塊鏈(父鏈與子鏈)。其中,LIGHT 父鏈與傳統(tǒng)的公鏈類似,有且僅有一個,保證記錄完整、透明、不可被篡改或銷毀。LIGHT子鏈可以是多個且相互獨(dú)立存在,基于PoM validation方式,結(jié)合In-Memory數(shù)據(jù)庫緩存,有效提高緩存環(huán)節(jié)吞吐量,QPS可達(dá)10萬以上,實(shí)現(xiàn)性能大幅提高。LIGHT突破性地解決了當(dāng)今數(shù)字貨幣在交易時處理速度嚴(yán)重滯后的問題,實(shí)現(xiàn)瞬時完成實(shí)時交易。

漏洞詳情:

合約類型:ERC20;

漏洞函數(shù):transferFrom。

漏洞類型:非一致性檢查;

漏洞危害:可導(dǎo)致繞過授權(quán)額度檢查,轉(zhuǎn)出超出授權(quán)額度代幣至任意以太坊賬戶。

代碼分析:

可以看出代碼55行在檢查授權(quán)轉(zhuǎn)賬額度是沒有問題的,但是在58行減掉已轉(zhuǎn)出的授權(quán)額度時,錯誤的寫成了allowed[_from][_to] -= _value。該行代碼導(dǎo)致在授權(quán)轉(zhuǎn)賬完成后,限額依然不變,在下一次操作授權(quán)轉(zhuǎn)賬時,依然可以繼續(xù)按照原本限額轉(zhuǎn)出代幣。該漏洞屬于一個邏輯漏洞,由于校驗(yàn)的條件和操作的條件不一致,導(dǎo)致后續(xù)繞過校驗(yàn)。

該漏洞邏輯如圖所示:

經(jīng)過對此漏洞類型進(jìn)行了深入的分析,發(fā)現(xiàn)了不僅存在 `allowed[_from][msg.sender]` 這一語句的檢查不一致,還存在 `balances[msg.sender]` 語句的檢查不一致漏洞。

二、漏洞原理

1、allowed不一致性檢查漏洞

如上面代碼所示:

這一條的條件檢測與

這一語句的操作不相符,導(dǎo)致設(shè)置轉(zhuǎn)賬額度權(quán)限后,攻擊者能夠持續(xù)轉(zhuǎn)賬,直到轉(zhuǎn)完所有余額。

2、balances 不一致性檢查漏洞

如上圖的代碼所示,上面一句的條件檢測與下面一句的語句操作不相符,攻擊者能夠通過溢出,讓`_from`賬戶余額獲得極大的token 數(shù)量。

同時,有一些合約中使用了 safeMath 安全方法進(jìn)行計(jì)算 `balances[_from] = balances[_from].sub(_value);`,所以暫時沒有溢出問題,但是條件檢查部分是冗余的。

修復(fù)方案如下:

1.使用safeMath方法進(jìn)行計(jì)算;

2.使用`balances[_from] >= _value`作為條件判斷而非`balances[msg.sender]`

3.檢查`allowed[_from][msg.sender]`并對`allowed[_from][msg.sender]`進(jìn)行操作不要與`allowed[_from][_to]`混用。

最后,曲速未來安全區(qū)表示:ERC20 發(fā)行的代幣安全性是無法保障的,

所以,對于廣大用戶來說,除了自身加強(qiáng)自我安全意識意外,也要有一雙火眼金睛,來分辨出哪些數(shù)字貨幣是安全的,值得投資的,哪些是有風(fēng)險(xiǎn)的。只有這樣,才能讓自己的資產(chǎn)受到最小的損失。

漏洞 ERC 合約 存在 檢查
分享到:

1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會明確標(biāo)注作者和來源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請轉(zhuǎn)載時務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。


專題報(bào)道