文獻(xiàn)標(biāo)識(shí)碼:A
DOI: 10.19358/j.issn.2096-5133.2018.08.001
中文引用格式:陳力波,殷婷婷,倪遠(yuǎn)東,等.ERC20智能合約整數(shù)溢出系列漏洞披露[J].信息技術(shù)與網(wǎng)絡(luò)安全,2018,37(8):3-6.
0 引言
智能合約作為區(qū)塊鏈2.0的代表技術(shù),適應(yīng)于區(qū)塊鏈去中心化、分布式的特點(diǎn),具有獨(dú)立運(yùn)行、不可篡改的優(yōu)良特性,可用于實(shí)現(xiàn)包含金融工具在內(nèi)的各類分布式應(yīng)用。開發(fā)者可以自行定義交易邏輯并開發(fā)代碼發(fā)布到鏈上,合約代碼在礦工節(jié)點(diǎn)的虛擬機(jī)環(huán)境(如EVM)中執(zhí)行。合約交易被打包進(jìn)區(qū)塊后,鏈上節(jié)點(diǎn)執(zhí)行相同代碼,從而同步改變鏈上數(shù)據(jù)狀態(tài)。故合約的多方參與者無需建立信任,也無法相互欺騙。
與傳統(tǒng)程序一樣,智能合約無法避免地存在安全漏洞。而與傳統(tǒng)程序不一樣的是,合約運(yùn)行在開放的區(qū)塊鏈網(wǎng)絡(luò)當(dāng)中,可以被任意調(diào)用,而且合約的執(zhí)行具有“不可更改”的效果,導(dǎo)致合約的漏洞被利用之后危害更大[6]。前面提到的BEC等合約中存在的整數(shù)溢出漏洞便是一個(gè)典型的例子,攻擊者對(duì)漏洞的利用造成了數(shù)額驚人的損失。
整數(shù)溢出是一種常見的高危漏洞,曾引發(fā)許多嚴(yán)重事故。1996年阿麗亞娜5型運(yùn)載火箭在發(fā)射37 s后解體并爆炸就是由于整數(shù)溢造成的[7]。整數(shù)溢出的原理是:計(jì)算機(jī)中整數(shù)變量有上下界,如果在算術(shù)運(yùn)算中出現(xiàn)越界,即超出整數(shù)類型的最大表示范圍,數(shù)字便會(huì)如表盤上的時(shí)針從12到1一般,由一個(gè)極大值變?yōu)橐粋€(gè)極小值或直接歸零。此類越界的情形在傳統(tǒng)的軟件程序中很常見,但是否存在安全隱患取決于程序上下文,部分溢出是良性的(如TCP序號(hào)等),甚至是故意引入的(例如用作hash運(yùn)算等)。整數(shù)溢出漏洞檢測(cè)和校驗(yàn)是有挑戰(zhàn)性的,程序員極容易犯錯(cuò),而自動(dòng)化檢測(cè)方法最大難點(diǎn)在于判斷候選溢出是否真正導(dǎo)致了危害,以免造成大量的誤報(bào)。
1 自動(dòng)化挖掘
“清華-360企業(yè)安全聯(lián)合研究中心” ChainTrust團(tuán)隊(duì)成員充分利用多年軟件漏洞挖掘的經(jīng)驗(yàn),針對(duì)智能合約開發(fā)了自動(dòng)化檢測(cè)工具,可以高效挖掘高危整數(shù)溢出漏洞。檢測(cè)工具通過準(zhǔn)確構(gòu)建整數(shù)溢出點(diǎn)的上下文語義,采用符號(hào)執(zhí)行和污點(diǎn)分析等技術(shù),有效區(qū)分了無害溢出和有害溢出,能夠顯著降低漏洞的誤報(bào)率和漏報(bào)率。
截止到目前,團(tuán)隊(duì)針對(duì)Etherscan上排名前470位的代幣合約進(jìn)行了檢測(cè),除去未提供源碼、沒有完整爬取源碼或耗時(shí)過長(zhǎng)的合約,最終完整分析了390份合約。在這些被分析的合約中,團(tuán)隊(duì)總共發(fā)現(xiàn)25個(gè)智能合約存在整數(shù)溢出安全問題,申請(qǐng)獲得了5個(gè)CVE編號(hào),主要包含下述6類新型危害。
團(tuán)隊(duì)成員在“全球EOS開發(fā)者大會(huì)”上對(duì)部分漏洞進(jìn)行了首次披露。本報(bào)告將進(jìn)行詳細(xì)披露,旨在推進(jìn)社區(qū)的安全健康發(fā)展。
2 新型漏洞詳情
2.1 underSell:高賣低收(CVE-2018-11811)
管理員通過修改合約中的參數(shù)來制造溢出漏洞,導(dǎo)致用戶提幣轉(zhuǎn)出token之后,卻收不到ETH(或收到極少量ETH),造成用戶經(jīng)濟(jì)損失。
漏洞實(shí)例:合約Internet Node Token (INT)。
漏洞所在位置:175行,如圖1所示。
圖 1 高賣低收漏洞
漏洞攻擊效果:用戶提幣之后,無法得到對(duì)應(yīng)數(shù)額的ETH。
漏洞原理:sellPrice被修改為精心構(gòu)造的大數(shù)后,可導(dǎo)致amount * sellPrice的結(jié)果大于整數(shù)變量(uint256)最大值,發(fā)生整數(shù)溢出,從而變?yōu)橐粋€(gè)極小值甚至歸零。該值在程序語義中是用于計(jì)算用戶提幣應(yīng)得的ETH數(shù)量,并在175行進(jìn)行了校驗(yàn),但該值被溢出變?yōu)闃O小值之后可以逃逸175行的校驗(yàn),并導(dǎo)致用戶售出token后只能拿到少量的(甚至沒有)ETH。
2.2 ownerUnderflow:下溢增持(CVE-2018-11687)
管理員在特定條件下,通過調(diào)用合約中有漏洞的發(fā)幣函數(shù)制造下溢,從而實(shí)現(xiàn)對(duì)自身賬戶余額的任意增加。
漏洞實(shí)例:合約Bitcoin Red(BTCR)
漏洞所在位置:41行,如圖2所示。
圖 2 下溢增持漏洞
漏洞攻擊效果:管理員執(zhí)行了一個(gè)正常向某個(gè)地址進(jìn)行發(fā)幣的操作,實(shí)際已經(jīng)暗中將自身賬戶的余額修改為了一個(gè)極大的數(shù)。
漏洞原理:distributeBTR()函數(shù)的本意是管理員給指定地址發(fā)放一定數(shù)額的token,并從自身賬戶減少對(duì)應(yīng)的token數(shù)量。減少管理員賬戶余額的操作為balances[owner] -= 2000 * 10**8,運(yùn)算的結(jié)果將被存到balances[owner]中,是一個(gè)無符號(hào)整數(shù)類型。當(dāng)管理員余額本身少于2000 * 10**8時(shí),減法計(jì)算結(jié)果為負(fù)值,解釋為無符號(hào)整數(shù)即一個(gè)極大值。
2.3 mintAny:隨意鑄幣(CVE-2018-11812)
管理員調(diào)用鑄幣函數(shù)給某個(gè)地址增加token時(shí),利用溢出漏洞可以突破該函數(shù)只能增加token的限制,實(shí)際減少該地址的token數(shù)量,從而實(shí)現(xiàn)對(duì)任一賬戶余額的任意篡改(增加或減少)。在檢測(cè)中,有多達(dá)18個(gè)合約存在類似安全問題。
漏洞實(shí)例:合約PolyAi (AI)
漏洞所在位置:132行,如圖3所示。
圖 3 隨意鑄幣漏洞
漏洞攻擊效果:管理員可以繞過合約限制,任意篡改所有地址的token余額。
漏洞原理:攻擊者通過構(gòu)造一個(gè)極大的mintedAmount,使得balanceOf[target] + mintedAmount發(fā)生整數(shù)溢出,計(jì)算結(jié)果變?yōu)橐粋€(gè)極小值。
2.4 overMint:超額鑄幣(CVE-2018-11809)
管理員通過構(gòu)造惡意參數(shù),可以繞過程序中規(guī)定的token發(fā)行上限,實(shí)現(xiàn)超額鑄幣。合約Playkey (PKT)存在此類漏洞,導(dǎo)致合約中的鑄幣上限形同虛設(shè),從而發(fā)行任意多的token。此外,還發(fā)現(xiàn)Nexxus (NXX)、Fujinto (NTO)兩個(gè)合約存在類似漏洞,這兩個(gè)合約沒有鑄幣上限限制,但同樣的手段,可以溢出合約中一個(gè)用于記錄已發(fā)幣總量(totalSupply)的變量值,使其與市場(chǎng)中實(shí)際流通的總幣數(shù)不一致。
漏洞實(shí)例:合約Playkey (PKT)
漏洞所在位置:237行,如圖4所示。
圖 4 超額鑄幣漏洞
漏洞攻擊效果:管理員可以篡改已發(fā)幣總量(totalSupply)為任意值,并繞過合約中的鑄幣上限超額發(fā)行token。
漏洞原理:_value在函數(shù)調(diào)用時(shí)被設(shè)置為精心構(gòu)造的極大值,使得totalSupply + _value計(jì)算結(jié)果溢出后小于tokenLimit,從而輕易繞過237行的鑄幣上限檢測(cè)。
2.5 allocateAny:超額定向分配(CVE-2018-11810)
管理員通過制造溢出來繞過合約中對(duì)單地址發(fā)幣的最大上限,可以對(duì)指定地址分配超額的token,使得對(duì)單地址的發(fā)布上限無效。
漏洞實(shí)例:合約LGO (LGO)
漏洞所在位置:286行,如圖5所示。
圖 5 超額定向分配漏洞
漏洞攻擊效果:管理員繞過合約中規(guī)定的單地址發(fā)幣上限,給指定地址分配超額的token。
漏洞原理:一個(gè)極大的_amount可以使得算數(shù)加法運(yùn)算holdersAllocatedAmount + _amount發(fā)生整數(shù)溢出,變?yōu)橐粋€(gè)極小值,從而繞過286行的檢測(cè)。
2.6 overBuy:超額購幣(CVE-2018-11809)
買家如果擁有足夠多的ETH,可以通過發(fā)送大量token制造溢出,從而繞過ICO發(fā)幣上限,達(dá)到超額購幣。
漏洞實(shí)例:合約EthLend (LEND)
漏洞所在位置:236行,如圖6所示。
圖 6 超額購幣漏洞
漏洞攻擊效果:調(diào)用者繞過合約中規(guī)定ICO的token容量上限,獲得了超額購幣。
漏洞原理:一個(gè)極大的_newTokens可以使得算數(shù)加法運(yùn)算totalSoldTokens + newTokens發(fā)生整數(shù)溢出,變?yōu)橐粋€(gè)極小值,從而繞過236行的檢測(cè)。
3 結(jié)論
智能合約之所以“智能”,是由于合約代碼一旦上鏈,其執(zhí)行效果完全由可見且不可篡改的代碼來決定,而不用依賴于對(duì)任何參與方的信任。然而,智能合約并沒有預(yù)期的“智能”,存在相當(dāng)多的安全風(fēng)險(xiǎn),尤其是管理員權(quán)限下,可能導(dǎo)致諸多嚴(yán)重的安全問題。僅僅通過整數(shù)溢出這一常見漏洞類型,管理員便能夠任意篡改所有賬戶余額,惡意超額,甚至無上限鑄幣,背離合約白皮書的約定,這樣的合約無法保證參與多方的公平性,更談不上智能。而管理員利用整數(shù)溢出進(jìn)行作惡早已有先例,2018年2月初,基于以太坊的Monero Gold(XMRG) Token在交易所的價(jià)格先猛漲787%,后迅速暴跌至崩盤,造成大量用戶經(jīng)濟(jì)損失[8],其背后就是管理團(tuán)隊(duì)利用預(yù)留的整數(shù)溢出漏洞進(jìn)行超額鑄幣,并在交易所拋售造成惡性通貨膨脹,最后價(jià)值幾乎歸零[9]。在區(qū)塊鏈上運(yùn)行的智能合約,本意是利用區(qū)塊鏈不可篡改的特性來構(gòu)建可信的執(zhí)行環(huán)境,然而安全漏洞的存在就像一個(gè)個(gè)隱藏的定時(shí)炸彈,對(duì)智能合約的可信任基礎(chǔ)帶來了巨大的挑戰(zhàn)。
參考文獻(xiàn)
[1] MARIA P, GOMEZ G L. Explaining the DAO exploit for beginners in Solidity[EB/OL]. (2016-10-16)[2018-06-20] .https://medium.com/@MyPaoG/explaining-the-dao-exploit-for-beginners-in-solidity-80ee84f0d470.
[2] MICHAELl Y. Building a safer crypto token[EB/OL] .(2018-04-25) [2018-06-20].https://medium.com/cybermiles/building-a-safer-crypto-token-27c96a7e78fd.
[3] 0x2.還原EDU被黑客攻擊始末:期貨與現(xiàn)貨的組合套現(xiàn)[EB/OL]. (2018-05-24)[2018-06-20]. https://wallstreetcn.com/articles/3320043.
[4] BAI智能合約存在和EDU一樣的漏洞,可轉(zhuǎn)走任意賬戶里的BAI Token[EB/OL].(2018-05-24)[2018-06-20]. http://www.chinaz.com/live/2018/0524/891959.shtml.
[5] CHEN Y,Peng Zhiniang. EOS Node Remote Code Execution Vulnerability— EOS WASM Contract Function Table Array Out of Bounds [Z]. (2018-0 5-29)[2018-06-20]. http://blogs.#/blog/eos-node-remote-code-execution-vulnerability/.
[6] 360企業(yè)安全.區(qū)塊鏈智能合約漏洞,想說補(bǔ)你不容易[EB/OL].(2018-05-31)[2018-06-20].http://www.freebuf.com/articles/blockchain-articles/173481.html.
[7] NEOHOPE.導(dǎo)致慘重代價(jià)的Bug [EB/OL]. (2016-05-03)[2018-06-20].http://www.neohope.org/2016/05/03/%E5%AF%BC%E8%87%B4%E6%83%A8%E9%87%8D%E4%BB%A3%E4%BB%B7%E7%9A%84bug/.
[8] Monero Gold - The story and tech specs of a 4 million USD shitcoin scam, brilliantly executed [EB/OL] .(2018-02-04)[2018-06-20]. https://66shitcoins.com/blog/2018/2/4/monero-gold-the-story-and-tech-specs-of-a-4-million-usd-shitcoin-scam-brilliantly-executed.
[9] CoinMarketCap [EB/OL].(2018-06-20)[2018-06-20]. https://coinmarketcap.com/zh/currencies/monero-gold/.
(收稿日期:2018-06-20)
作者簡(jiǎn)介:
陳力波,男,碩士研究生,360企業(yè)安全技術(shù)研究院研究員,主要研究方向:IoT、區(qū)塊鏈安全。
殷婷婷,女,研究生,主要研究方向:區(qū)塊鏈安全及自動(dòng)化漏洞挖掘。
倪遠(yuǎn)東,男,碩士研究生,主要研究方向:系統(tǒng)安全、區(qū)塊鏈安全。
張超,男,博士,清華大學(xué)副教授(博導(dǎo)),青年千人。主要研究方向:系統(tǒng)與軟件安全,重點(diǎn)是自動(dòng)化攻防技術(shù)。