以太坊智能合约漏洞,以太链合约账户
以太坊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。而当对应变量值超出这个范围时,就会溢出至符号位,导致变量值发生巨大的变化。
介绍:
以太坊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日,SMT/BEC合约被恶意攻击者转走了50,659,039,041,325,800,000,000,000,000,000,000,000,000,000,000,000,000,000,000个SMT代币。恶意攻击者就是利用了SMT/BEC合约的整数溢出漏洞导致了这样的结果。
2018年5月19日,以太坊Hexagon合约代币被公开存在整数溢出漏洞。
(2)铸币烧币溢出问题
作为一个合约代币的智能合约来说,除了有其他合约的功能以外,还需要有铸币和烧币功能。而更特殊的是,这两个函数一般都为乘法或者指数交易,很容易造成溢出问题。
上述代码未对代币总额做限制,会导致指数算数上溢。
漏洞实例:合约Playkey (PKT)
漏洞所在位置:红色标注的行L237
漏洞攻击效果:管理员可以篡改已发币总量(totalSupply)为任意值,并绕过合约中的铸币上限超额发行token;
漏洞原理:_value在函数调用时被设置为精心构造的极大值,使得totalSupply _value计算结果溢出后小于tokenLimit,从而轻易绕过L237行的铸币上限检测。
影响:
截止2018年9月5日,总共发现了391个存在算数溢出问题的合约代码,其中332个仍处于交易状态,其中交易量最高的10个合约情况如下:
截止2018年9月5日,我们发现了1636个存在超额铸币销币问题的合约代码,其中1364个仍处于交易状态,其中交易量最高的10个合约情况如下:
修复方法
1)算术溢出问题
在调用加减乘除时,通常的修复方式都是使用openzeppelin-safeMath,但也可以通过对不同变量的判断来限制,但很难对乘法和指数做什么限制。
2)铸币烧币溢出问题
铸币函数中,应对totalSupply设置上限,避免因为算术溢出等漏洞导致恶意铸币增发。
在铸币烧币加上合理的权限限制可以有效减少该问题危害。
总结
智能合约之所以“智能”,是由于合约代码一旦上链,其执行效果完全由可见且不可篡改的代码来决定,而不用依赖于对任何参与方的信任。
然而,由上述漏洞分析可见,智能合约并没有预期的“智能”,存在相当多的安全风险,仅仅通过溢出这一常见漏洞类型,管理员便能够铸币烧币,背离合约白皮书的约定,这样的合约无法保证参与多方的公平性,更无谈智能。
而管理员利用整数溢出进行作恶早已有先例,2018年2月初,基于以太坊的Monero Gold(XMRG) Token在交易所的价格先猛涨787%,后迅速暴跌至崩盘,造成大量用户经济损失 ,其背后就是管理团队利用预留的整数溢出漏洞进行超额铸币,并在交易所抛售造成恶性通货膨胀,最后价值几乎归零。
在区块链上运行的智能合约,本意是利用区块链不可篡改的特性来构建可信的执行环境,然而安全漏洞的存在就像一个个隐藏的定时炸弹,对智能合约的可信任基础带来了巨大的挑战。
(作者:区块链安全档案,内容来自链得得内容开放平台“得得号”;本文仅代表作者观点,不代表链得得官方立场)
以太坊带来了那些争议和质疑呢?
以太坊和比特币是有着本质区别的,区别在哪里呢?比特币定义的是一套货币体系,而以太坊侧重的是打造一条主链(可以理解为一条公路),可以让大量的区块链应用跑在这条公路上。
从这一点来看,以太坊的应用场景更广泛,这也是为什么我们说以太坊标志着区块链
1.0时代一个单纯的货币体系,向区块链2.0时代实现其他行业以及应用场景的转变。
但是,世界上没有十全十美的事物,以太坊虽然拓展了区块链在各行各业的应用范围,还提升了处理交易的速度,但是它也存在着一定的争议与质疑。
一、以太坊的扩展性不足的解决之道:分片技术和雷电网络
以太坊的底层设计,最大的问题是以太坊只有一条链,没有侧链,这就意味着,所有程序都要对等地跑在这条链上,消耗资源的同时,还会引发系统拥堵。正如去年非常火爆的以太坊游戏“加密猫”,这个游戏火爆的时候,一度引发以太坊网络瘫痪。
对于提升处理能力这个问题,以太坊提出两种方式:一个是分片技术(shard),一个是雷电网络,下面我们分别介绍一下这两种技术。
(一)分片技术
以太坊创始人 V 神(Vitalik Buterin)认为,诸如比特币这种主流的区块链网络,之所以处理交易的速度很慢,是因为每一个矿工要处理全网的每一笔交易,这样的效率其实是非常低下的。分片技术的构想是:一笔交易不必发动全网所有节点都去处理,只要让网络中的一部分节点(矿工)处理就好了。于是,以太坊网络被划分成很多片,同一时间,每一分片都可以处理不同的交易,这样一来,会大大提升网络性能。
但是,分片技术也是有一定争议的。我们知道,区块链技术的重要思想是去中心化,全网都去见证(处理)同一交易,这才具有最高的权威性。而以太坊分片技术,并不是所有节点共同见证,而是类似于分小组见证,这样一来,它便失去了绝对的“去中心化”属性,只能通过牺牲掉一定的去中心化特性来达到高性能的目的。
(二)雷电网络
雷电网络使用的是链下交易的方式。这是什么意思呢?它的意思是:使用雷电网络的参与者在互相转账时,不需要通过以太坊主链交易确认,而是通过参与者之间创建支付通道,在链下完成。
不过,雷电网络并不是脱离主链的,在建立支付通道之前,需要先用主链上的资产做抵押,生成余额证明(Balance Proof),拥有余额证明才能表明你能做出相应余额的转账。在交易双方都持有余额证明的情况下,双方可通过支付通道在链下进行无限制次数的转账。
只有在完成链下交易,需要将资产转回链上时,才会在以太坊主链上登记主链账户的余额变化信息,而这期间不管发生多少次交易在主链上是不会有记录的。
雷电网络还有一个实实在在的好处,就是可以为你省下矿工费用。目前我们在以太坊主链上进行交易,需要消耗 Gas,需要支付矿工费用,那么一旦将交易搬到链下,就可以节省这一部分的成本。
当然,雷电网络并不是十全十美的。在使用雷电网络时需要用主链上的资产作抵押;而这部分资产作为抵押物,在使用者完成链下交易之前是不能使用的。这也就决定了,雷电交易只适合小额交易。
上面就是以太坊扩展性不足的问题,以及目前提出的两个主要解决方案:分片技术和雷电网络。
二、以太坊的智能合约存在漏洞与臭名昭著的 The Dao 事件
以太坊的智能合约很强大,但是,凡是代码都会存在漏洞的,以太坊智能合约最大的争议就在于所谓的漏洞,也就是安全性问题。据相关研究表明,在基于以太坊的近100万个智能合约上,发现有34200(约3%)个含有安全漏洞,将允许黑客窃取ETH、冻结资产或删除合约,比如说,臭名昭著的The Dao 事件。
(一)Dao是什么意思?
介绍 The Dao 事件之前, 我们先见到介绍一下 DAO 是什么。DAO 是 Decentralized
Autonomous Organization 的简称,可以理解为:去中心化自治组织。从以太坊的角度来理解,DAO 是区块链上的某一类合约,或者一个合约组合,用来代替政府的审查以及复杂等中间程序,从而实现高效的、去中心化的信任的系统。所以,DAO 不是特定的某个组织,也就说呢,可以有很多的DAO,各种各样的DAO。
(二)臭名昭著的The Dao事件
但是,我们现在提到DAO,基本上所指的都是The DAO事件,也就是我们刚刚说的那个臭名昭著的黑客攻击事件。我们知道,英文中的 The是特指的意思,The DAO事件呢就
是特指的那个DAO事件,因为我们刚刚说了DAO不是特定的某个组织,可以有很多的DAO,各种各样的DAO。
2016 年的时候,德国一家专注“智能锁”的公司 Slock.it,为了实现去中心化的实物交换(比如说:公寓啊,船只啊),在以太坊上发布了 DAO项目。并且于2016年4月
30日开始,融资窗口开放了28天。
没想到,这个DAO项目的人气非常高,短短半个月就筹得了超过一亿美元,而到整个融资期结束,一共筹集到1.5亿美元,由此呢,它成为历史上最大的众筹项目。然而好景不长,到了6月份,黑客利用智能合约里面的漏洞,成功转移了超过360万个以太币,并投入到一个DAO子组织中,这个组织和The DAO有着同样的结构。以至于当时以太币价格从20多美元直接跌破13美元。
这个事件说明智能合约的确是有漏洞的,而且一旦漏洞被黑客利用,那么后果是非常严重的。这就是现在很多人批评以太坊,说它的智能合约不智能。
对于这个问题,目前国外有很多公司为了解决智能合约的漏洞问题 ,开始提供代码审计服务。而从技术的角度来说,目前一些团队正在对智能合约进行检验,这些团队多数由哈佛、斯坦福和耶鲁的教授带队,部分团队已经获得了头部机构的投资。
除了目前以太坊存在的扩展性不足、智能合约漏洞问题,对于以太坊的争议还在于它所追求的POS共识机制,也就是权益证明机制,在权益证明机制下,如果说谁持币的数量越大、持币时间越久,获得的“权益”(利息)就越多,还有机会得到记账权力,记账又可以获得奖励,那么这样一来,容易造成“强者越强”的寡头优势。
还有一个问题就是ICO乱象的问题。ICO是区块链项目筹措资金的常用方式,咱们可以理解为预售。以太坊上ICO项目的爆发,滋生了打着ICO旗号进行资金盘、诈骗圈钱等不法行为,对社会和金融稳定造成安全隐患。
以太坊存在的问题
1.扩展性不足:
以太坊社区的主要开发人员和研究人员始终认为区块链技术要实现大规模采用,可扩展性是区块链应用程序需要解决的唯一最重要的关键。
以太坊的底层设计,最大的问题是以太坊只有一条链,没有侧链,它把所有的程序对等的跑在全球所有节点的矿机上。这样一个很耗资源的程序,会导致问题越来越严重。
2.合约程序漏洞,无法抵御DDOS攻击
据相关研究表明,在基于以太坊的近100万个智能合约上,发现有34,200(约3%)个含有安全漏洞,将允许黑客窃取ETH、冻结资产或删除合约。这几年,以太坊面对合约程序漏洞和DDOS攻击的问题,也一直无法找到很好的解决办法。(更好用的数字货币交易平台“币汇”)
3.对于ICO泡沫和项目方砸盘
目前的ETH下跌,很大程度上来自于项目方的砸盘套现,这个问题可以在ICO代币融资上进行规则限制,不能像现在这样毫无成本的就能发一个币,而且还没有任何监督惩罚机制。任何事情都需要有一套合理的演进规则,大家按规则办事,所谓无规矩不成方圆。在规则的基础上,各类ICO项目有效监督,有序进出,才是一个正常的市场,这样才可能维系着代币生态的持续、稳定发展。
4.智能合约费用过高
在以太坊上现在还是POW的挖矿模式,交易是有手续费的,用来激励矿工来处理交易和保护网络,不同的是以太坊是以“gas”的形式来收费的。
在以太坊协议中规定,交易手续费=Gas 数量 x Gas 价格,其中 Gas 数量由智能合约的复杂程度决定,而 Gas 价格则由合约发起人决定。这对开发者和用户意味着什么呢?虽然读取本地区块链是免费的,但写入和运算是花钱的,储存更是尤其昂贵,因为任何写入的信息都会被永久的储存着。
5.社区对共识协议改变的分歧
以太坊计划实现将 POW 机制改为 POW/POS 混合共识机制。但这个涉及到技术开发和矿工双方能否达到利益共识的问题了。如果协议发生了变化,社区意见不合时,就会导致分叉,大家各自玩各自的。
文章评论