《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > ERC20智能合約整數(shù)溢出系列漏洞披露
ERC20智能合約整數(shù)溢出系列漏洞披露
信息技術(shù)與網(wǎng)絡(luò)安全
陳力波,殷婷婷,倪遠(yuǎn)東,張超
(清華-360企業(yè)安全聯(lián)合研究中心(籌),北京 100015)
摘要: 從2016年The DAO被盜取6000萬(wàn)美元開(kāi)始 ,到美鏈BEC價(jià)值歸零、BAI和EDU任意賬戶(hù)轉(zhuǎn)帳,再到最近EOS漏洞允許惡意合約穿透虛擬機(jī)危害礦工節(jié)點(diǎn),“智能合約”儼然成為區(qū)塊鏈安全重災(zāi)區(qū)?!扒迦A-360企業(yè)安全聯(lián)合研究中心”團(tuán)隊(duì)在區(qū)塊鏈安全方面進(jìn)行了持續(xù)研究,開(kāi)發(fā)了自動(dòng)化漏洞掃描工具,近期發(fā)現(xiàn)了多個(gè)新型整數(shù)溢出漏洞,可造成超額鑄幣、超額購(gòu)幣、隨意鑄幣、高賣(mài)低收、下溢增持等嚴(yán)重危害。
中圖分類(lèi)號(hào):TP393.08
文獻(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.
Dozens of integer overflow vulnerabilities found in ERC20 smart contracts
Chen Libo, Yin Tingting, Ni Yuandong, Zhang Chao
(Tsinghua University-360 Enterprise Security Group Joint Research Center, Beijing 100015, China)
Abstract: In 2016,The DAO was stolen for 60 million US dollars,and later the value of Beauty Chain (BEC) became zero,and BAI and EDU were transferred to any account.What’s worse,recently the EOS vulnerability allowed malicious contracts to penetrate virtual machines to harm miner nodes.The smart contract became the hardest-hit area of blockchain.The Tsinghua-360 Enterprise Security Joint Research Center team has conducted continuous research on blockchain security,developed automated vulnerability scanning tools,and recently discovered a number of new integer overflow vulnerabilities that can result in overMint, overBuy, mintAny, underSell, owerUnderfolw,and other serious threats.
Key words : smart contract; blockchain; vulnerability scan

0  引言

智能合約作為區(qū)塊鏈2.0的代表技術(shù),適應(yīng)于區(qū)塊鏈去中心化、分布式的特點(diǎn),具有獨(dú)立運(yùn)行、不可篡改的優(yōu)良特性,可用于實(shí)現(xiàn)包含金融工具在內(nèi)的各類(lèi)分布式應(yīng)用。開(kāi)發(fā)者可以自行定義交易邏輯并開(kāi)發(fā)代碼發(fā)布到鏈上,合約代碼在礦工節(jié)點(diǎn)的虛擬機(jī)環(huán)境(如EVM)中執(zhí)行。合約交易被打包進(jìn)區(qū)塊后,鏈上節(jié)點(diǎn)執(zhí)行相同代碼,從而同步改變鏈上數(shù)據(jù)狀態(tài)。故合約的多方參與者無(wú)需建立信任,也無(wú)法相互欺騙。

與傳統(tǒng)程序一樣,智能合約無(wú)法避免地存在安全漏洞。而與傳統(tǒng)程序不一樣的是,合約運(yùn)行在開(kāi)放的區(qū)塊鏈網(wǎng)絡(luò)當(dāng)中,可以被任意調(diào)用,而且合約的執(zhí)行具有“不可更改”的效果,導(dǎo)致合約的漏洞被利用之后危害更大[6]。前面提到的BEC等合約中存在的整數(shù)溢出漏洞便是一個(gè)典型的例子,攻擊者對(duì)漏洞的利用造成了數(shù)額驚人的損失。 

整數(shù)溢出是一種常見(jiàn)的高危漏洞,曾引發(fā)許多嚴(yán)重事故。1996年阿麗亞娜5型運(yùn)載火箭在發(fā)射37 s后解體并爆炸就是由于整數(shù)溢造成的[7]。整數(shù)溢出的原理是:計(jì)算機(jī)中整數(shù)變量有上下界,如果在算術(shù)運(yùn)算中出現(xiàn)越界,即超出整數(shù)類(lèi)型的最大表示范圍,數(shù)字便會(huì)如表盤(pán)上的時(shí)針從12到1一般,由一個(gè)極大值變?yōu)橐粋€(gè)極小值或直接歸零。此類(lèi)越界的情形在傳統(tǒng)的軟件程序中很常見(jiàn),但是否存在安全隱患取決于程序上下文,部分溢出是良性的(如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ì)智能合約開(kāi)發(fā)了自動(dòng)化檢測(cè)工具,可以高效挖掘高危整數(shù)溢出漏洞。檢測(cè)工具通過(guò)準(zhǔn)確構(gòu)建整數(shù)溢出點(diǎn)的上下文語(yǔ)義,采用符號(hào)執(zhí)行和污點(diǎn)分析等技術(shù),有效區(qū)分了無(wú)害溢出和有害溢出,能夠顯著降低漏洞的誤報(bào)率和漏報(bào)率。

截止到目前,團(tuán)隊(duì)針對(duì)Etherscan上排名前470位的代幣合約進(jìn)行了檢測(cè),除去未提供源碼、沒(méi)有完整爬取源碼或耗時(shí)過(guò)長(zhǎng)的合約,最終完整分析了390份合約。在這些被分析的合約中,團(tuán)隊(duì)總共發(fā)現(xiàn)25個(gè)智能合約存在整數(shù)溢出安全問(wèn)題,申請(qǐng)獲得了5個(gè)CVE編號(hào),主要包含下述6類(lèi)新型危害。

團(tuán)隊(duì)成員在“全球EOS開(kāi)發(fā)者大會(huì)”上對(duì)部分漏洞進(jìn)行了首次披露。本報(bào)告將進(jìn)行詳細(xì)披露,旨在推進(jìn)社區(qū)的安全健康發(fā)展。

2  新型漏洞詳情

2.1   underSell:高賣(mài)低收(CVE-2018-11811)

管理員通過(guò)修改合約中的參數(shù)來(lái)制造溢出漏洞,導(dǎo)致用戶(hù)提幣轉(zhuǎn)出token之后,卻收不到ETH(或收到極少量ETH),造成用戶(hù)經(jīng)濟(jì)損失。

漏洞實(shí)例:合約Internet Node Token (INT)。

漏洞所在位置:175行,如圖1所示。


clb1_副本.jpg

圖 1  高賣(mài)低收漏洞

 

漏洞攻擊效果:用戶(hù)提幣之后,無(wú)法得到對(duì)應(yīng)數(shù)額的ETH。

漏洞原理:sellPrice被修改為精心構(gòu)造的大數(shù)后,可導(dǎo)致amount * sellPrice的結(jié)果大于整數(shù)變量(uint256)最大值,發(fā)生整數(shù)溢出,從而變?yōu)橐粋€(gè)極小值甚至歸零。該值在程序語(yǔ)義中是用于計(jì)算用戶(hù)提幣應(yīng)得的ETH數(shù)量,并在175行進(jìn)行了校驗(yàn),但該值被溢出變?yōu)闃O小值之后可以逃逸175行的校驗(yàn),并導(dǎo)致用戶(hù)售出token后只能拿到少量的(甚至沒(méi)有)ETH。

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

管理員在特定條件下,通過(guò)調(diào)用合約中有漏洞的發(fā)幣函數(shù)制造下溢,從而實(shí)現(xiàn)對(duì)自身賬戶(hù)余額的任意增加。

 漏洞實(shí)例:合約Bitcoin Red(BTCR)

 漏洞所在位置:41行,如圖2所示。


clb2_副本.jpg

圖 2   下溢增持漏洞 

漏洞攻擊效果:管理員執(zhí)行了一個(gè)正常向某個(gè)地址進(jìn)行發(fā)幣的操作,實(shí)際已經(jīng)暗中將自身賬戶(hù)的余額修改為了一個(gè)極大的數(shù)。 

漏洞原理:distributeBTR()函數(shù)的本意是管理員給指定地址發(fā)放一定數(shù)額的token,并從自身賬戶(hù)減少對(duì)應(yīng)的token數(shù)量。減少管理員賬戶(hù)余額的操作為balances[owner] -= 2000 * 10**8,運(yùn)算的結(jié)果將被存到balances[owner]中,是一個(gè)無(wú)符號(hào)整數(shù)類(lèi)型。當(dāng)管理員余額本身少于2000 * 10**8時(shí),減法計(jì)算結(jié)果為負(fù)值,解釋為無(wú)符號(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ì)任一賬戶(hù)余額的任意篡改(增加或減少)。在檢測(cè)中,有多達(dá)18個(gè)合約存在類(lèi)似安全問(wèn)題。

漏洞實(shí)例:合約PolyAi (AI)

漏洞所在位置:132行,如圖3所示。


clb3_副本.jpg

圖 3   隨意鑄幣漏洞

漏洞攻擊效果:管理員可以繞過(guò)合約限制,任意篡改所有地址的token余額。

 漏洞原理:攻擊者通過(guò)構(gòu)造一個(gè)極大的mintedAmount,使得balanceOf[target] + mintedAmount發(fā)生整數(shù)溢出,計(jì)算結(jié)果變?yōu)橐粋€(gè)極小值。

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

管理員通過(guò)構(gòu)造惡意參數(shù),可以繞過(guò)程序中規(guī)定的token發(fā)行上限,實(shí)現(xiàn)超額鑄幣。合約Playkey (PKT)存在此類(lèi)漏洞,導(dǎo)致合約中的鑄幣上限形同虛設(shè),從而發(fā)行任意多的token。此外,還發(fā)現(xiàn)Nexxus (NXX)、Fujinto (NTO)兩個(gè)合約存在類(lèi)似漏洞,這兩個(gè)合約沒(méi)有鑄幣上限限制,但同樣的手段,可以溢出合約中一個(gè)用于記錄已發(fā)幣總量(totalSupply)的變量值,使其與市場(chǎng)中實(shí)際流通的總幣數(shù)不一致。

漏洞實(shí)例:合約Playkey (PKT)

漏洞所在位置:237行,如圖4所示。

 

clb4_副本.jpg

圖 4   超額鑄幣漏洞

漏洞攻擊效果:管理員可以篡改已發(fā)幣總量(totalSupply)為任意值,并繞過(guò)合約中的鑄幣上限超額發(fā)行token。

漏洞原理:_value在函數(shù)調(diào)用時(shí)被設(shè)置為精心構(gòu)造的極大值,使得totalSupply + _value計(jì)算結(jié)果溢出后小于tokenLimit,從而輕易繞過(guò)237行的鑄幣上限檢測(cè)。

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

管理員通過(guò)制造溢出來(lái)繞過(guò)合約中對(duì)單地址發(fā)幣的最大上限,可以對(duì)指定地址分配超額的token,使得對(duì)單地址的發(fā)布上限無(wú)效。

漏洞實(shí)例:合約LGO (LGO)

漏洞所在位置:286行,如圖5所示。

 

clb5_副本.jpg

圖 5   超額定向分配漏洞

 

漏洞攻擊效果:管理員繞過(guò)合約中規(guī)定的單地址發(fā)幣上限,給指定地址分配超額的token。

漏洞原理:一個(gè)極大的_amount可以使得算數(shù)加法運(yùn)算holdersAllocatedAmount + _amount發(fā)生整數(shù)溢出,變?yōu)橐粋€(gè)極小值,從而繞過(guò)286行的檢測(cè)。

2.6 overBuy:超額購(gòu)幣(CVE-2018-11809)

買(mǎi)家如果擁有足夠多的ETH,可以通過(guò)發(fā)送大量token制造溢出,從而繞過(guò)ICO發(fā)幣上限,達(dá)到超額購(gòu)幣。

漏洞實(shí)例:合約EthLend (LEND)

漏洞所在位置:236行,如圖6所示。

 

clb6_副本.jpg

圖 6   超額購(gòu)幣漏洞

漏洞攻擊效果:調(diào)用者繞過(guò)合約中規(guī)定ICO的token容量上限,獲得了超額購(gòu)幣。

漏洞原理:一個(gè)極大的_newTokens可以使得算數(shù)加法運(yùn)算totalSoldTokens + newTokens發(fā)生整數(shù)溢出,變?yōu)橐粋€(gè)極小值,從而繞過(guò)236行的檢測(cè)。

3  結(jié)論

智能合約之所以“智能”,是由于合約代碼一旦上鏈,其執(zhí)行效果完全由可見(jiàn)且不可篡改的代碼來(lái)決定,而不用依賴(lài)于對(duì)任何參與方的信任。然而,智能合約并沒(méi)有預(yù)期的“智能”,存在相當(dāng)多的安全風(fēng)險(xiǎn),尤其是管理員權(quán)限下,可能導(dǎo)致諸多嚴(yán)重的安全問(wèn)題。僅僅通過(guò)整數(shù)溢出這一常見(jiàn)漏洞類(lèi)型,管理員便能夠任意篡改所有賬戶(hù)余額,惡意超額,甚至無(wú)上限鑄幣,背離合約白皮書(shū)的約定,這樣的合約無(wú)法保證參與多方的公平性,更談不上智能。而管理員利用整數(shù)溢出進(jìn)行作惡早已有先例,2018年2月初,基于以太坊的Monero Gold(XMRG) Token在交易所的價(jià)格先猛漲787%,后迅速暴跌至崩盤(pán),造成大量用戶(hù)經(jīng)濟(jì)損失[8],其背后就是管理團(tuán)隊(duì)利用預(yù)留的整數(shù)溢出漏洞進(jìn)行超額鑄幣,并在交易所拋售造成惡性通貨膨脹,最后價(jià)值幾乎歸零[9]。在區(qū)塊鏈上運(yùn)行的智能合約,本意是利用區(qū)塊鏈不可篡改的特性來(lái)構(gòu)建可信的執(zhí)行環(huán)境,然而安全漏洞的存在就像一個(gè)個(gè)隱藏的定時(shí)炸彈,對(duì)智能合約的可信任基礎(chǔ)帶來(lái)了巨大的挑戰(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)走任意賬戶(hù)里的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ū)塊鏈智能合約漏洞,想說(shuō)補(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ù)。

 

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。