主页 > imtoken钱包安全性 > <转贴> 如何创建安全的以太坊智能合约
<转贴> 如何创建安全的以太坊智能合约
作者| 共享比特
以太坊是一个具有智能合约功能的开源公共区块链平台。 区块链上的所有用户都可以看到基于区块链的智能合约。 但是,这会导致所有漏洞(包括安全漏洞)都可见。 智能合约语言 Solidity 本身和合约设计可能存在漏洞。 如果智能合约开发者疏忽或测试不充分,导致智能合约代码出现漏洞,极易被黑客利用和攻击。 而且智能合约越强大,逻辑越复杂,越容易出现逻辑漏洞。
以太坊的安全漏洞
如果区块链也有315,那么以太坊肯定榜上有名。 以太坊自运行以来,因漏洞引发的重大安全事件屡见不鲜。
2016年6月17日,发生了历史上对区块链的重创。 由于以太坊智能合约存在重大缺陷,区块链行业最大的众筹项目TheDAO(攻击前拥有约1亿美元资产)遭到攻击,导致超过300万以太坊资产从TheDAO的资产池中剥离。
2017 年 7 月 21 日,智能合约编码公司 Parity 警告其钱包软件 1.5 及更高版本存在漏洞。 根据 Etherscan.io 的数据,价值 3000 万美元的 150,000 个以太币被盗。 2017 年 11 月 8 日,Parity 钱包又出现一个重大漏洞。 多重签名漏洞被黑客利用,导致数亿美元资金被冻结。
以太坊开源软件主要由社区极客编写。 目前已知的漏洞有Solidity语言漏洞、短地址漏洞、交易顺序依赖、时间戳依赖、重入攻击等。 该漏洞可能在调用合约时被利用,而智能合约部署后难以更新也使得该漏洞的影响更为广泛和持久。
根据相关调查统计,以太坊的主要漏洞如下表所示:
<显示不全请左右滑动> 序号 漏洞名称 漏洞描述
1个
DAO 漏洞
运行在以太坊公链上的 TheDAO 智能合约被攻击。 合约募集的公募资金,通过函数的递归调用不断转移到其子合约中,共涉及超过300万个以太币。 该代码通过 addr.call.value() 而不是 send() 发送 Ether,这为黑客留下了空间。 黑客只需要创建一个回退函数,并在该函数中再次调用 splitDAO() 即可。
2个
奇偶多重签名
钱包合约漏洞
要让多重签名的智能合约无法使用,核心问题在于未授权的函数调用。 黑客间接调用了初始化钱包软件的库函数,使自己成为多个Parity钱包的新主人。 黑客调用了一个名为 initWallet() 的函数,该函数没有检查以防止攻击者在合约初始化后调用 initMultiowned()。 该函数将合约的所有者更改为攻击者,相当于从 Unix 获得了 root。 权威。
3个
奇偶多重签名
钱包提现漏洞
钱包提现功能失效,150多个地址的50万多个ETH被完全冻结。 该漏洞允许黑客通过库函数成为库的所有者,然后调用自杀函数报废整个合约库。
4个
太阳风暴
Solidity 是以太坊用来开发智能合约的类 JavaScript 语言,被发现存在安全漏洞,当以太坊合约相互调用时,它们自己的程序控制和状态函数就会丢失。 因为它可以切断以太坊智能合约之间的通讯,就像太阳风暴可以切断地球的通讯设备一样,它可以影响到整个以太坊。
5个
以太坊编程语言
可靠性漏洞
智能合约中的部分地址和数据类型受到影响,大部分受影响的合约将无法撤销或更改。
6个
智能合约
回退功能
在调用某个智能合约时,如果找不到指定的函数,或者根本没有指定函数(比如发送以太币),就会调用回退函数。 黑客可以使用回退功能对系统造成很大的破坏。 事情。
7
智能合约递归调用递归
用户提现代码存在严重的递归调用漏洞,用户可以轻松提现账户中的所有以太币。
8个
call depth 限制调用深度
以太坊虚拟机EVM中的一个智能合约可以通过消息调用调用其他智能合约,被调用的智能合约可以通过消息调用继续调用其他合约,甚至回调(递归)。 黑客可以利用嵌套调用的深度限制在1024来发起攻击。
9
以太坊浏览器 Mist
该漏洞来自底层软件框架Electron,影响加密数字货币私钥的安全。
10
区块节点漏洞
该漏洞来自以太坊区块链2283416区块节点,主要导致包括Geth在内的所有基于Go的Ethereum 1.4.11客户端出现内存溢出错误,无法继续挖矿。
11
日蚀攻击 日蚀攻击
eclipse 攻击是由其他节点执行的网络级攻击。 攻击方式是囤积和占用受害者的点对点连接时隙,使节点处于孤立的网络中。 此类攻击旨在阻止最新的区块链信息到达eclipse节点,从而隔离节点。
12
以太坊短地址漏洞
由于EVM没有严格校验地址位数,还擅自自动补齐了缺失的位数,所以合约发送了很多token。
13
Geth客户端
DoS攻击漏洞
大约 75% 的以太坊节点都在运行 Geth,这个漏洞可能会使那些运行拜占庭兼容版本的节点在硬分叉后更容易受到 DoS 攻击。
14
浪子契约漏洞
交易资金返还给所有者,交易者过去发送给以太币的地址,由于漏洞导致的具体地址。 这种漏洞就像一只空手而归的白狼,买家拿到了货,卖家却拿不到加密货币。
15
自杀合约漏洞
智能合约的所有者可以选择在以太坊出现故障时回退,类似于微信中的提现选项。 但是这个指令也可以被其他人执行,使得交易失败。
16
贪婪合约漏洞
这是指那些永远留在以太坊中的智能合约。 上面提到的 Parity 漏洞只是一个贪心合约。 它将智能合约涉及的商品和加密货币锁定在以太坊中,交易双方都无法获取,也无法取消。
17
遗嘱合约的漏洞
在那些完成或关闭的智能合约中,虽然它们的代码和全局变量被清除了,但其中一些仍然继续执行。 遗嘱合约和贪婪合约一样,是以太坊的错误造成的,目前还不能被黑客利用。
18
交易顺序依赖
一笔交易被传播并被矿工接受并包含在一个区块中需要一定的时间。 如果攻击者在网络中监听对应合约的交易,然后发送自己的交易改变当前合约状态,例如以太坊全节点钱包,为了奖励合约而减少合约奖励,则有一定几率两笔交易将被包含在同一个区块中,攻击将在另一笔交易之前完成。 而这个攻击者甚至可以自己直接参与挖矿,并提出更高的gasPrice来激励矿工收录这笔交易。
19
时间戳依赖
一些智能合约使用块时间戳作为某些操作的触发器。 一般来说,使用矿工本地时间作为时间戳,这个时间可以在900秒左右的范围内波动。 当其他节点接受一个新区块时,只需要验证时间戳是否晚于前一个区块,并且与本地时间一致,误差在900秒以内。 矿工可以通过设置区块的时间戳来尽可能满足对他有利的条件来获利。
20
重入
当一个合约调用另一个合约时,当前执行进程停止并等待调用完成,这导致一个可以被利用的中间状态。 利用合约的中间状态,当一个合约还没有被调用时,发起另一个调用交易来完成攻击。
21
挖矿中心化
以太坊前三名矿工控制50%以上算力,存在联手作恶风险。
上述漏洞已经广泛存在于以太坊网络中。 2018 年 2 月 24 日,新加坡和英国的多名研究人员指出,超过 34,000 个以太坊智能合约可能存在易受攻击的漏洞,导致数百万美元的以太坊被曝光。 在那些面临风险的人中,有 2,365 人属于著名项目。
鉴于以太坊运行不到3年,上述漏洞可能只是其所有漏洞的冰山一角。 为保证业务在区块链上安全可靠运行,保护数字资产安全,采用以太坊作为区块链技术。 在规划解决方案时,必须对智能合约代码进行全面测试。
如何构建安全的智能合约
在构建智能合约时,国内知名独立区块链技术解决方案提供商中享比特(Zhongxiangbit)的安全建议如下:
◈ 限制存储在智能合约中的以太坊数量。 如果智能合约源代码、编译器或平台出现问题,这些资金可能会丢失。 ◈ 确保智能合约中的功能尽可能小型化和模块化。 必须保证源代码的质量(比如限制局部变量的个数和函数的长度),程序注释尽量完整,以方便日后维护,增加代码的可读性。 ◈ 尽量减少交易中GAS的消耗。 如果有一定要用到大量计算的地方,尽量放到链下处理。 ◈ 在智能合约中增加一个功能来进行一些自检以太坊全节点钱包,比如“是否有以太币泄漏?”。 如果自检失败,智能合约会自动切换到某种“故障安全”模式,例如,禁用大部分功能,将控制权移交给固定且可信的第三方,或者将智能合约转换为简单的“把我的钱还给我”的智能合约。