设计应用

ERC20智能合约整数溢出系列漏洞披露

作者:陈力波,殷婷婷,倪远东,张超
发布日期:2018-09-10
来源:信息技术与网络安全

0  引言

智能合约作为区块链2.0的代表技术,适应于区块链去中心化、分布式的特点,具有独立运行、不可篡改的优良特性,可用于实现包含金融工具在内的各类分布式应用。开发者可以自行定义交易逻辑并开发代码发布到链上,合约代码在矿工节点的虚拟机环境(如EVM)中执行。合约交易被打包进区块后,链上节点执行相同代码,从而同步改变链上数据状态。故合约的多方参与者无需建立信任,也无法相互欺骗。

与传统程序一样,智能合约无法避免地存在安全漏洞。而与传统程序不一样的是,合约运行在开放的区块链网络当中,可以被任意调用,而且合约的执行具有“不可更改”的效果,导致合约的漏洞被利用之后危害更大[6]。前面提到的BEC等合约中存在的整数溢出漏洞便是一个典型的例子,攻击者对漏洞的利用造成了数额惊人的损失。 

整数溢出是一种常见的高危漏洞,曾引发许多严重事故。1996年阿丽亚娜5型运载火箭在发射37 s后解体并爆炸就是由于整数溢造成的[7]。整数溢出的原理是:计算机中整数变量有上下界,如果在算术运算中出现越界,即超出整数类型的最大表示范围,数字便会如表盘上的时针从12到1一般,由一个极大值变为一个极小值或直接归零。此类越界的情形在传统的软件程序中很常见,但是否存在安全隐患取决于程序上下文,部分溢出是良性的(如TCP序号等),甚至是故意引入的(例如用作hash运算等)。整数溢出漏洞检测和校验是有挑战性的,程序员极容易犯错,而自动化检测方法最大难点在于判断候选溢出是否真正导致了危害,以免造成大量的误报。

1   自动化挖掘

“清华-360企业安全联合研究中心” ChainTrust团队成员充分利用多年软件漏洞挖掘的经验,针对智能合约开发了自动化检测工具,可以高效挖掘高危整数溢出漏洞。检测工具通过准确构建整数溢出点的上下文语义,采用符号执行和污点分析等技术,有效区分了无害溢出和有害溢出,能够显著降低漏洞的误报率和漏报率。

截止到目前,团队针对Etherscan上排名前470位的代币合约进行了检测,除去未提供源码、没有完整爬取源码或耗时过长的合约,最终完整分析了390份合约。在这些被分析的合约中,团队总共发现25个智能合约存在整数溢出安全问题,申请获得了5个CVE编号,主要包含下述6类新型危害。

团队成员在“全球EOS开发者大会”上对部分漏洞进行了首次披露。本报告将进行详细披露,旨在推进社区的安全健康发展。

2  新型漏洞详情

2.1   underSell:高卖低收(CVE-2018-11811)

管理员通过修改合约中的参数来制造溢出漏洞,导致用户提币转出token之后,却收不到ETH(或收到极少量ETH),造成用户经济损失。

漏洞实例:合约Internet Node Token (INT)。

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


clb1_副本.jpg

图 1  高卖低收漏洞

 

漏洞攻击效果:用户提币之后,无法得到对应数额的ETH。

漏洞原理:sellPrice被修改为精心构造的大数后,可导致amount * sellPrice的结果大于整数变量(uint256)最大值,发生整数溢出,从而变为一个极小值甚至归零。该值在程序语义中是用于计算用户提币应得的ETH数量,并在175行进行了校验,但该值被溢出变为极小值之后可以逃逸175行的校验,并导致用户售出token后只能拿到少量的(甚至没有)ETH。

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

管理员在特定条件下,通过调用合约中有漏洞的发币函数制造下溢,从而实现对自身账户余额的任意增加。

 漏洞实例:合约Bitcoin Red(BTCR)

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


clb2_副本.jpg

图 2   下溢增持漏洞 

漏洞攻击效果:管理员执行了一个正常向某个地址进行发币的操作,实际已经暗中将自身账户的余额修改为了一个极大的数。 

漏洞原理:distributeBTR()函数的本意是管理员给指定地址发放一定数额的token,并从自身账户减少对应的token数量。减少管理员账户余额的操作为balances[owner] -= 2000 * 10**8,运算的结果将被存到balances[owner]中,是一个无符号整数类型。当管理员余额本身少于2000 * 10**8时,减法计算结果为负值,解释为无符号整数即一个极大值。

2.3 mintAny:随意铸币(CVE-2018-11812)

管理员调用铸币函数给某个地址增加token时,利用溢出漏洞可以突破该函数只能增加token的限制,实际减少该地址的token数量,从而实现对任一账户余额的任意篡改(增加或减少)。在检测中,有多达18个合约存在类似安全问题。

漏洞实例:合约PolyAi (AI)

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


clb3_副本.jpg

图 3   随意铸币漏洞

漏洞攻击效果:管理员可以绕过合约限制,任意篡改所有地址的token余额。

 漏洞原理:攻击者通过构造一个极大的mintedAmount,使得balanceOf[target] + mintedAmount发生整数溢出,计算结果变为一个极小值。

2.4 overMint:超额铸币(CVE-2018-11809)

管理员通过构造恶意参数,可以绕过程序中规定的token发行上限,实现超额铸币。合约Playkey (PKT)存在此类漏洞,导致合约中的铸币上限形同虚设,从而发行任意多的token。此外,还发现Nexxus (NXX)、Fujinto (NTO)两个合约存在类似漏洞,这两个合约没有铸币上限限制,但同样的手段,可以溢出合约中一个用于记录已发币总量(totalSupply)的变量值,使其与市场中实际流通的总币数不一致。

漏洞实例:合约Playkey (PKT)

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

 

clb4_副本.jpg

图 4   超额铸币漏洞

漏洞攻击效果:管理员可以篡改已发币总量(totalSupply)为任意值,并绕过合约中的铸币上限超额发行token。

漏洞原理:_value在函数调用时被设置为精心构造的极大值,使得totalSupply + _value计算结果溢出后小于tokenLimit,从而轻易绕过237行的铸币上限检测。

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

管理员通过制造溢出来绕过合约中对单地址发币的最大上限,可以对指定地址分配超额的token,使得对单地址的发布上限无效。

漏洞实例:合约LGO (LGO)

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

 

clb5_副本.jpg

图 5   超额定向分配漏洞

 

漏洞攻击效果:管理员绕过合约中规定的单地址发币上限,给指定地址分配超额的token。

漏洞原理:一个极大的_amount可以使得算数加法运算holdersAllocatedAmount + _amount发生整数溢出,变为一个极小值,从而绕过286行的检测。

2.6 overBuy:超额购币(CVE-2018-11809)

买家如果拥有足够多的ETH,可以通过发送大量token制造溢出,从而绕过ICO发币上限,达到超额购币。

漏洞实例:合约EthLend (LEND)

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

 

clb6_副本.jpg

图 6   超额购币漏洞

漏洞攻击效果:调用者绕过合约中规定ICO的token容量上限,获得了超额购币。

漏洞原理:一个极大的_newTokens可以使得算数加法运算totalSoldTokens + newTokens发生整数溢出,变为一个极小值,从而绕过236行的检测。

3  结论

智能合约之所以“智能”,是由于合约代码一旦上链,其执行效果完全由可见且不可篡改的代码来决定,而不用依赖于对任何参与方的信任。然而,智能合约并没有预期的“智能”,存在相当多的安全风险,尤其是管理员权限下,可能导致诸多严重的安全问题。仅仅通过整数溢出这一常见漏洞类型,管理员便能够任意篡改所有账户余额,恶意超额,甚至无上限铸币,背离合约白皮书的约定,这样的合约无法保证参与多方的公平性,更谈不上智能。而管理员利用整数溢出进行作恶早已有先例,2018年2月初,基于以太坊的Monero Gold(XMRG) Token在交易所的价格先猛涨787%,后迅速暴跌至崩盘,造成大量用户经济损失[8],其背后就是管理团队利用预留的整数溢出漏洞进行超额铸币,并在交易所抛售造成恶性通货膨胀,最后价值几乎归零[9]。在区块链上运行的智能合约,本意是利用区块链不可篡改的特性来构建可信的执行环境,然而安全漏洞的存在就像一个个隐藏的定时炸弹,对智能合约的可信任基础带来了巨大的挑战。

 

参考文献

[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被黑客攻击始末:期货与现货的组合套现[EB/OL]. (2018-05-24)[2018-06-20]. https://wallstreetcn.com/articles/3320043.

[4] BAI智能合约存在和EDU一样的漏洞,可转走任意账户里的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.360.cn/blog/eos-node-remote-code-execution-vulnerability/. 

[6] 360企业安全.区块链智能合约漏洞,想说补你不容易[EB/OL].(2018-05-31)[2018-06-20].http://www.freebuf.com/articles/blockchain-articles/173481.html.

[7] NEOHOPE.导致惨重代价的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)

作者简介:

 

陈力波,男,硕士研究生,360企业安全技术研究院研究员,主要研究方向:IoT、区块链安全。

 

殷婷婷,女,研究生,主要研究方向:区块链安全及自动化漏洞挖掘。

 

倪远东,男,硕士研究生,主要研究方向:系统安全、区块链安全。

 

张超,男,博士,清华大学副教授(博导),青年千人。主要研究方向:系统与软件安全,重点是自动化攻防技术。

 

此内容为AET网站原创,未经授权禁止转载。
智能合约 区块链 漏洞扫描