曲速未來 :智能合約攻擊分析之SafeMath使用不當(dāng)區(qū)塊鏈
智能合約安全咨詢公司曲速未來提醒:在編寫智能合約的時(shí)候需要注意的一個(gè)主要的安全特性:防止溢出和下溢。為了防止這些情況,OpenZeppelin建立了一個(gè)叫做SafeMath的庫(kù)(library),默認(rèn)情況下可以防止這些問題。
智能合約安全咨詢公司 曲速未來 提醒:在編寫智能合約的時(shí)候需要注意的一個(gè)主要的安全特性:防止溢出和下溢。為了防止這些情況,OpenZeppelin建立了一個(gè)叫做SafeMath的庫(kù)(library),默認(rèn)情況下可以防止這些問題。
什么是溢出(overflow)?
假設(shè)我們有一個(gè)uint8, 只能存儲(chǔ)8 bit數(shù)據(jù)。這意味著我們能存儲(chǔ)的最大數(shù)字就是二進(jìn)制11111111(或者說十進(jìn)制的2^8-1 =255).
來看看下面的代碼。最后 number 將會(huì)是什么值?
在這個(gè)例子中,我們導(dǎo)致了溢出—雖然我們加了1,但是number出乎意料地等于0了。
下溢(underflow)也類似,如果你從一個(gè)等于0的uint8減去1, 它將變成255 (因?yàn)閡int是無符號(hào)的,其不能等于負(fù)數(shù))。
使用 SafeMath
不過在我們使用之前……什么叫做庫(kù)?
一個(gè)庫(kù)是Solidity中一種特殊的合約。其中一個(gè)有用的功能是給原始數(shù)據(jù)類型增加一些方法。
比如,使用SafeMath庫(kù)的時(shí)候,我們將使用using SafeMath for uint256這樣的語法。SafeMath庫(kù)有四個(gè)方法—add,sub,mul,以及 div。
以太坊虛擬機(jī)EVM定義無符號(hào)整數(shù)為uint256,可以表示一個(gè)256位的大整數(shù),但并沒有提供溢出的檢測(cè)機(jī)制。OpenZeppline是一個(gè)第三方智能合約庫(kù),實(shí)現(xiàn)了一套SafeMath庫(kù)來檢測(cè)溢出。其代碼如下:
SafeMath使用內(nèi)建的require或assert來檢查運(yùn)算是否發(fā)生溢出,如果發(fā)生了溢出,require和assert中包含的代碼會(huì)使該事務(wù)回滾。但有些開發(fā)者不能完全理解SafeMath模版代碼,導(dǎo)致合約代碼中仍然存在漏洞。
1.攻擊案例:UCN (0x6EF5B9ae723Fe059Cac71aD620495575d19dAc42)
UCN是一個(gè)智能合約DApp應(yīng)用。合約代碼在SafeMath庫(kù)中注釋assert語句,因此SafeMath函數(shù)等同于直接進(jìn)行算術(shù)運(yùn)算,沒有任何安全檢查。并且在transferFrom函數(shù)中,注釋中聲明sub函數(shù)是安全的,不知道這是開發(fā)人員的疏忽還是故意留下的后門。
由于sub函數(shù)等同于算術(shù)運(yùn)算,balances[_from] = balances[_from].sub(_value); 存在整數(shù)下溢漏洞,可以使得賬戶余額變成一個(gè)極大值。
2.攻擊案例:EMVC(0xd3F5056D9a112cA81B0e6f9f47F3285AA44c6AAA)
EMVC合約代碼在SafeMath庫(kù)中使用了一個(gè)自定義的assert來代替內(nèi)建的assert。在assert函數(shù)中,如果參數(shù)assertion為false則直接return,并沒有進(jìn)行異常處理。因此SafeMath函數(shù)等同于直接進(jìn)行算術(shù)運(yùn)算,沒有任何安全檢查。
攻擊者可以使用transfer函數(shù)設(shè)置任意賬戶余額為任意值。
總結(jié)
智能合約安全咨詢公司 曲速未來 提醒:當(dāng)智能合約要實(shí)現(xiàn)更多功能時(shí),代碼會(huì)相應(yīng)變得更加復(fù)雜,與ERC20標(biāo)準(zhǔn)代碼的差異也越來越大,因而潛在的漏洞面貌更加多樣。為了保證智能合約的安全,除遵循安全開發(fā)原則、按照“Check Lists”進(jìn)行基線檢查外,還需要實(shí)施更深入細(xì)致的審計(jì)。
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會(huì)明確標(biāo)注作者和來源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請(qǐng)轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會(huì)經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。