智能合约新型漏洞详情

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值