以太坊漏洞与被盗的案例,为什么以太坊频繁被盗?| Tokenview
大约 8 分钟
以太坊漏洞与被盗的案例,为什么以太坊频繁被盗?| Tokenview
以太坊(Ethereum)是一个开源的有智能合约功能的公共区块链平台。但最近几年频频出现以太坊被盗的情况。延展阅读:区块链地址追溯 | 如何使用Tokenview 区块链浏览器追踪交易所 (Upbit交易所)被盗资金?
我们先盘点一下有哪些被盗的经历:
- 2016年6月17日发生了在区块链历史上沉重的一次攻击事件。由于以太坊的智能合约存在着重大缺陷,区块链业界最大的众筹项目TheDAO(被攻击前拥有1亿美元左右资产)遭到攻击,导致300多万以太币资产被分离出TheDAO 资产池。
- 2017年7月21日,智能合约编码公司Parity警告1.5版本及之后的钱包软件存在漏洞,据Etherscan.io的数据确认有价值3000万美元的15万以太币被盗。
- 2017年11月8日,以太坊Parity钱包再出现重大bug,多重签名漏洞被黑客利用,导致上亿美元资金被冻结。
以太坊钱包为什么频繁被盗?
首先,以太坊是一个开源的智能合约公共区块链开发平台,所有用户都能够看到基于该平台开发的智能合约代码,当然也包括其中的安全漏洞。如果因智能合约开发者疏忽或者测试不充分,而导致代码有漏洞的话,就非常容易被黑客利用并对其发起攻击。
其次,由于智能合约的复杂性,越是功能强大就越容易出现逻辑上的漏洞;同时,智能合约开发语言soildity与合约设计本身也有可能存在漏洞。 2018年2月,一个名为powhcoin的以太坊区块链项目,因开发者的一段错误代码,而导致850ETH被冻结。
作为一个开源平台,任何人都可以对其中的代码进行修改。
目前作为Tokenview全币种区块链浏览器可查询主流币种链上的交易情况,而且,Tokenview以太坊区块浏览器新出以太坊事件日志,可查询更多合约信息。
### 目前已知的以太坊安全漏洞描述:
- **1. The DAO 漏洞。**运行在以太坊公有链上的TheDAO智能合约遭遇攻击,该台约筹集的公众款项不断被一个函数的递归调用转向它的子合约,涉及总额三百多万以太币。代码中通过 addr.call.value()()的方式发送以太币,而不是send(),这给黑客留下了空间。黑客只需要制造出一个fallback函数,在该函数里再次调用splitDAO()即可。
- **2. Parity多重签名钱包合约漏洞。**使多重签名的智能台约无法使用,核心问题在于越权的函数调用。黑客间接调用了初始化钱包软件的库函数,让自己成为多个 Parity钱包的新主人。黑客调用了一个叫做 initWallet的函数, initWallet 没有检查以防止攻击者在合同初始化后调用到 initMultiowned,这个函数使得这个合约的所有者被改为攻击者,相当于从unⅸ中获得了root权限。
- **3. Parity多重签名钱包提款漏洞。**钱包的提款功能都失效,150多个地址中超过50万个ETH被彻底冻结,漏洞使得黑客能通过库函数成为库的主人,然后调用自杀函数报废整个合约库。
- **4. 太阳风暴。**Solidity,以太坊用于开发智能合约的类java- script语言,被发现有一个安全漏洞,当以太坊合约进行相互调用时,它们自身的程序控制和状态功能会丢失。因为它能切断以太坊智能台约间的沟通就像太阳风暴能切断地球的通讯设备一样,可以影响整个以太坊。
- **5. 以太坊编程语言Solidity 漏洞。**影响了智能合约中一些地址以及数据类型,大多数受影响的台约将无法被撤回或更改。
- **6. 智能合约Fallback 函数。**当调用某个智能合约时,如果指定的函数找不到,或者根本就没指定调用哪个函数(如发送以太币)时, fallback函数就会被调用,黑客可以利用 fallback函数做出很多危害系统的事情。
- **7. 智能合约递归调用(recursive)。**智能合约递归用户取款的代码存有严重的递归调用漏洞,该用户可轻松地将你账户里的以太币全部提走。
- **8. 调用深度限制(call depth)。**以太坊虚拟机EVM中一个智能合约可以通过 message cal调用其它智能台约,被调用的智能合约可以继续通过 message call再调用其它智能合约,甚至是再调用回来(recursive)。黑客可以利用嵌套调用的适度被限定1024发动攻击。
- **9. 以太坊浏览器Mist。**这个漏洞来源于底层软件框架 Electron,使得加密数字货币私钥安全受影响。
- **10. 区块节点漏洞。**来自于以太坊区块链上2283416区块节点的漏洞,主要造成了包括Geth在内的所有基于Go语言编写的以太坊1.4.11版本客户端出现内存溢出错误,并阻止了进一步挖矿。
- **11. 日食攻击(eclipse attack)。**日食攻击是其他节点实施的网络层面攻击,其攻击手段是囤积和霸占受害者的点对点连接时腺(sot),将该节点保留在一个隔离的网络中,这种类型的攻击旨在阻止最新的区块链信息进入到日食节点,从而隔离节点。
- **12. 以太坊短地址漏洞。**由于EWM并没有严格校验地址的位数,并且还擅自自动补充消失的位数,使得合约多发送很多代币出来。
- **13. Geth 客户端 DOS攻击漏洞。**大约75%的以太坊节点都在运行eth,这个漏洞可能会使那些运行兼容拜占庭的版本的节点在硬分叉之后更加容易遭受DoS攻击。
- **14. 浪子合约漏洞。**小交易资金因为漏洞返还给所有者、交易者过去发送给以太网的地址以及特定地址。这种闹洞就像是空手套白狼,买家得到商品,而卖家无法得到加密货币。
- **15. 自杀合约漏洞。**智能合约的拥有者可以在以太坊发生故时选择退回,类似于微信中的撤回选项。但是这个指令也可以被其他人执行,使得交易失败。
- **16. 贪婪合约漏洞。**这是指那些永远停留在以太坊的智能台约,上述的Paty漏洞正是种贪婪台约,它会把智能合约所涉及的商品以及加密货币锁定在以太坊中,交易双方均无法得到,也不能取消。
- **17. 遗嘱合约漏洞。**在那些已完成或者被关闭的智能台约中,虽然他们的代码和全局变量被清楚了,但是其中一部分仍然在继续执行,遗嘱台约和贪婪合约一样,均是由以太坊的精误引起,目前并不能被黑客利用。
- **18. 交易顺序依赖性。**一笔交易被传播出去并被矿工认同包含在一个区块内需要定的时间,如果一个攻击者在监听到网络中对应合约的交易,然后发出他自己的交易来改变当前的合约状态,例如对于悬赏合约,减少合约回报,则有一定几率使这两笔交易包含在同一个区块下面,并且排在另一个交易之前,完成攻击。而这个攻击者甚至可以自己直接参与挖矿,并提出更高的 gasTric来激励矿工包含这笔交易。
- **19. 时间戳依赖性。**有一部分智能合约使用区块的时间戳来作为某些操作的触发条件。通常来说都是使用矿工的本地时间作为时间戳,而这个时间大约能有900秒的范围波动,当其他节点接受一个新区块时,只需要验证时间戳是否晚于之前的区块井且与本地时间误差在900秒以内。一个矿工可以通过设置区块的时间戳来尽可能满足有利于他的条件,从中获利。
有哪些安全建议呢?
限制在智能合约中存储以太坊的数量。如果智能合约源代码、编译器或者平台有问题,这些资金可能丢失。
尽可能保证智能合约中的功能小而模块化。源码质量一定要得到保证(比如限制局部变量的数量,函数的长度),程序注释尽量完整,以便方便日后的维护和增加代码的可读性。
尽可能减少交易中gas的消耗,如果有必须使用大量计算的地方,尽量将其放到链下去处理。