主页 > 华为手机怎么安装imtoken > 以太坊智能合约的溢出问题
以太坊智能合约的溢出问题
介绍:
以太坊 Solidity 从设计之初就被定位为图灵完备的语言。 在solidity的设计中,支持int/uint可变长度的有符号或无符号整数。 变量支持的步长增加8,支持从uint8到uint256以太坊和智能合约,从int8到int256。 需要注意的是,uint和int默认代表uint256和int256。 uint8的取值范围与C中的uchar相同,即取值范围为0到2^8-1,uint256支持的取值范围为0到2^256-1。 当对应的变量值超出这个范围时,就会溢出到符号位,导致变量值发生巨大的变化。
(1) 算术溢出
在Solidity智能合约代码中,如果不做额外判断直接在余额校验中使用加减乘除,会存在算术溢出的隐患
上述代码中,由于没有验证_amount必须小于balances[msg.sender],因此攻击者可以通过传入大量数字造成溢出来绕过判断,从而实现海量代币的转移一气呵成。
2018 年 4 月 24 日,50,659,039,041,325,800,000,000,000,000,000,000,000,000,000,000,000,000,000,000 个 SMT 代币被恶意攻击者转移到 SMT/BEC 合约中。 恶意攻击者利用SMT/BEC合约的整数溢出漏洞导致了这样的结果。
2018年5月19日,以太坊Hexagon合约代币被披露存在整数溢出漏洞。
(2) 烧币币溢出问题
作为合约代币的智能合约,除了具备其他合约的功能外,还需要具备铸币和烧币的功能。 比较特殊的是,这两个函数一般都是乘法或者指数运算以太坊和智能合约,很容易造成溢出问题。
上面的代码没有限制token的总量,会造成索引溢出。
漏洞示例:Contract Playkey (PKT)
漏洞位置:红色标记的L237行
漏洞攻击效果:管理员可以篡改发币总量(totalSupply)为任意值,绕过合约中的铸币限制超发代币;
漏洞原理:调用函数时将_value设置为精心构造的最大值,使得totalSupply + _value的计算结果溢出并小于tokenLimit,从而轻松绕过L237行的铸币限额检测。
影响:
截至2018年9月5日,共发现391个存在算术溢出问题的合约代码,其中332个仍处于交易状态,交易量最高的10个合约如下:
截至2018年9月5日,我们共发现1,636个合约代码存在过度铸造和销售问题,其中1,364个合约代码仍处于交易状态,交易量最高的10个合约如下:
维修方法
1)算术溢出问题
调用加减乘除时,通常的修复方法是使用openzeppelin-safeMath,但也可以通过判断不同的变量来限制,但是很难限制乘法和指数。
2)烧币币溢出问题
在铸币函数中,要设置totalSupply的上限,避免因算术溢出等漏洞造成的恶意铸币。
对铸币和烧币加入合理的权限限制,可以有效降低该问题的危害。
总结
智能合约之所以“智能”,是因为一旦合约代码上链,其执行效果完全由可见不可篡改的代码决定,无需依赖任何参与者的信任。
但是,从以上漏洞分析可以看出,智能合约并没有预期的“智能”,存在相当多的安全隐患。 只有通过溢出这种常见的漏洞,管理员才能铸币和销毁币,这与合约白皮书的约定背道而驰。 合约无法保证多方参与的公平性,更谈不上智能。
管理员利用整数溢出作恶,已有先例。 2018年2月上旬,交易所基于以太坊的Monero Gold (XMRG) Token价格先是暴涨787%,随后迅速暴跌至崩盘,给用户造成大量经济损失。 背后是管理团队利用预留整数溢出漏洞超铸币,并在交易所抛售造成恶性通货膨胀,最后价值几近为零。
运行在区块链上的智能合约旨在利用区块链不可篡改的特性构建可信的执行环境。 然而,安全漏洞的存在就像一颗隐藏的定时炸弹,对智能合约的可信基础产生负面影响。 巨大的挑战来了。