智能合約新型漏洞詳情

3.新型漏洞詳情

3.1.underSell: 高賣低收(CVE-2018-11811)

管理員通過修改合約中的參數來製造溢出漏洞,導致用戶提幣轉出token之後,卻收不到ETH(或收到極少量ETH),造成用戶經濟損失。
漏洞實例:合約Internet Node Token (INT)
漏洞所在位置:紅色標註的行L175

漏洞攻擊效果:用戶提幣之後,無法得到對應數額的ETH;
漏洞原理:sellPrice被修改爲精心構造的大數後,可導致amount sellPrice的結果大於整數變量(uint256)最大值,發生整數溢出,從而變爲一個極小值甚至歸零。該值在程序語義中是用於計算用戶提幣應得的ETH數量,並在L175進行了校驗,但該值被溢出變爲極小值之後可以逃逸L175的校驗,並導致用戶售出token後只能拿到少量的(甚至沒有)ETH。

3.2.ownerUnderflow: 下溢增持(CVE-2018-11687)

管理員在特定條件下,通過調用合約中有漏洞的發幣函數製造下溢,從而實現對自身賬戶餘額的任意增加。
漏洞實例:合約Bitcoin Red(BTCR)
漏洞所在位置:紅色標註的行L41

漏洞攻擊效果:管理員執行了一個正常向某個地址進行發幣的操作,實際已經暗中將自身賬戶的餘額修改爲了一個極大的數;
漏洞原理:distributeBTR()函數的本意是管理員給指定地址發放一定數額的token,並從自身賬戶減少對應的token數量。減少管理員賬戶餘額的操作爲balances[owner] -= 2000 
108 ,運算的結果將被存到balances[owner]中,是一個無符號整數類型。當管理員餘額本身少於2000 * 108時,減法計算結果爲負值,解釋爲無符號整數即一個極大值。

3.3.mintAny: 隨意鑄幣 (CVE-2018-11812)

管理員調用鑄幣函數給某個地址增加token時,利用溢出漏洞可以突破該函數只能增加token的限制,實際減少該地址的token數量,從而實現對任一賬戶餘額的任意篡改(增加或減少)。在我們的檢測中,有多達18個合約存在類似安全問題。
漏洞實例:合約PolyAi (AI)
漏洞所在位置:紅色標註的行L132

漏洞攻擊效果:管理員可以繞過合約限制,任意篡改所有地址的token餘額;
漏洞原理:攻擊者通過構造一個極大的mintedAmount,使得balanceOf[target] + mintedAmount發生整數溢出,計算結果變爲一個極小值。

3.4. overMint: 超額鑄幣(CVE-2018-11809)

管理員通過構造惡意參數,可以繞過程序中規定的token發行上限,實現超額鑄幣。合約Playkey (PKT)存在此類漏洞,導致合約中的鑄幣上限形同虛設,從而發行任意多的token。此外,我們還發現Nexxus (NXX)、Fujinto (NTO)兩個合約存在類似漏洞,這兩個合約沒有鑄幣上限限制,但同樣的手段,可以溢出合約中一個用於記錄已發幣總量(totalSupply)的變量值,使其與市場中實際流通的總幣數不一致。
漏洞實例:合約Playkey (PKT)
漏洞所在位置:紅色標註的行L237

漏洞攻擊效果:管理員可以篡改已發幣總量(totalSupply)爲任意值,並繞過合約中的鑄幣上限超額發行token;
漏洞原理:_value在函數調用時被設置爲精心構造的極大值,使得totalSupply + _value計算結果溢出後小於tokenLimit,從而輕易繞過L237行的鑄幣上限檢測。

3.5.allocateAny: 超額定向分配(CVE-2018-11810)

管理員通過製造溢出來繞過合約中對單地址發幣的最大上限,可以對指定地址分配超額的token,使得對單地址的發佈上限無效。
漏洞實例:合約LGO (LGO)
漏洞所在位置:紅色標註的行L286
漏洞攻擊效果:管理員繞過合約中規定的單地址發幣上限,給指定地址分配超額的token;
漏洞原理: 一個極大的_amount可以使得算數加法運算holdersAllocatedAmount + _amount發生整數溢出,變爲一個極小值,從而繞過L286的檢測。

3.6.overBuy:超額購幣(CVE-2018-11809)

買家如果擁有足夠多的ETH,可以通過發送大量token製造溢出,從而繞過ICO發幣上限,達到超額購幣。
漏洞實例:合約EthLend (LEND)
漏洞所在位置:紅色標註的行L236

漏洞攻擊效果:調用者繞過合約中規定ICO的token容量上限,獲得了超額購幣;
漏洞原理:一個極大的_newTokens可以使得算數加法運算totalSoldTokens + newTokens發生整數溢出,變爲一個極小值,從而繞過L236的檢測。

 

4.漏洞列表

團隊採用自動化工具分析了390份ERC20智能合約,除上述已披露的漏洞之外,共發現25個智能合約存在未知的整數溢出漏洞,詳細情況如下表所示,出於對相關廠商安全的考慮,隱去了具體的漏洞位置、源代碼等技術細節,相關廠商安全人員如有需求,可與研究團隊聯繫(列表最右側一列的類型編號對應上述分類,每種合約可能同時存在多種類型漏洞):

 

5.結論

智能合約之所以“智能”,是由於合約代碼一旦上鍊,其執行效果完全由可見且不可篡改的代碼來決定,而不用依賴於對任何參與方的信任。然而,由上述漏洞分析可見,智能合約並沒有預期的“智能”,存在相當多的安全風險,尤其是管理員權限下,可能導致諸多嚴重的安全問題。僅僅通過整數溢出這一常見漏洞類型,管理員便能夠任意篡改所有賬戶餘額,惡意超額、甚至無上限鑄幣,背離合約白皮書的約定,這樣的合約無法保證參與多方的公平性,更無談智能。而管理員利用整數溢出進行作惡早已有先例,2018年2月初,基於以太坊的Monero Gold(XMRG) Token在交易所的價格先猛漲787%,後迅速暴跌至崩盤,造成大量用戶經濟損失 ,其背後就是管理團隊利用預留的整數溢出漏洞進行超額鑄幣,並在交易所拋售造成惡性通貨膨脹,最後價值幾乎歸零 。在區塊鏈上運行的智能合約,本意是利用區塊鏈不可篡改的特性來構建可信的執行環境,然而安全漏洞的存在就像一個個隱藏的定時炸彈,對智能合約的可信任基礎帶來了巨大的挑戰。
在近一個月之前,團隊已經發現上述安全漏洞,在評估了安全威脅之後第一時間反饋給相關廠商,並通知了交易所(如火幣網),希望能夠幫助廠商和交易所及時修補漏洞和杜絕安全隱患,多家廠商在得到通報後也積極做出了應急響應。

轉載:https://www.anquanke.com/post/id/147913

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