《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > ERC20智能合約整數(shù)溢出系列漏洞披露
ERC20智能合約整數(shù)溢出系列漏洞披露
信息技術(shù)與網(wǎng)絡(luò)安全
陳力波,殷婷婷,倪遠(yuǎn)東,張超
(清華-360企業(yè)安全聯(lián)合研究中心(籌),北京 100015)
摘要: 從2016年The DAO被盜取6000萬美元開始 ,到美鏈BEC價(jià)值歸零、BAI和EDU任意賬戶轉(zhuǎn)帳,再到最近EOS漏洞允許惡意合約穿透虛擬機(jī)危害礦工節(jié)點(diǎn),“智能合約”儼然成為區(qū)塊鏈安全重災(zāi)區(qū)?!扒迦A-360企業(yè)安全聯(lián)合研究中心”團(tuán)隊(duì)在區(qū)塊鏈安全方面進(jìn)行了持續(xù)研究,開發(fā)了自動(dòng)化漏洞掃描工具,近期發(fā)現(xiàn)了多個(gè)新型整數(shù)溢出漏洞,可造成超額鑄幣、超額購幣、隨意鑄幣、高賣低收、下溢增持等嚴(yán)重危害。
中圖分類號(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)的各類分布式應(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所示。


clb1_副本.jpg

圖 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所示。


clb2_副本.jpg

圖 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所示。


clb3_副本.jpg

圖 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所示。

 

clb4_副本.jpg

圖 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所示。

 

clb5_副本.jpg

圖 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所示。

 

clb6_副本.jpg

圖 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ù)。

 

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