织梦CMS - 轻松建站从此开始!

币安binance官网官方ios_binance下载_binance币交易平台网址_binance新闻_binance资讯_binance新闻资讯

当前位置: 主页 > binance新闻资讯 >

以太坊智能合约为何安全漏洞频发?

时间:2020-11-20 05:02来源:未知 作者:admin 点击:
广告位API接口通信错误,查看德得广告获取帮助

最近随着 DeFi 火热以太坊智能合约安全漏洞频发。究竟是什么原因造成的以及如何更好地防范这些漏洞?

概述

相比于比特币而言以太坊更易发生安全事故。这主要是因为以太坊虚拟机是图灵完备的以太坊可实现函数间相互调用、嵌套调用智能合约间相互调用等各种复杂逻辑。而比特币只实现了基于栈的非图灵完备的虚拟机并只能通过操作码进行入栈和出栈操作。另外比特币也没有复杂的 DApp 应用所以逻辑上简单故而没有太多空间引发安全漏洞。

以太坊上各种 DApp 复杂的智能合约逻辑是引发安全漏洞的主因。以太坊智能合约的安全漏洞主要可以分为

逻辑问题

合约代码问题

两种。

逻辑问题

最近频繁的“

闪电贷

”攻击是一个典型的逻辑问题引起的安全漏洞。在各种闪电贷攻击中你可以看到清晰的逻辑问题。攻击者只要制造出两个系统之间的价格差便能通过闪电贷攻击获利。

闪电贷攻击的逻辑细节大家可以阅读之前一篇专门讲闪电贷的文章:“造富神器”闪电贷。本文主要阐述

合约代码问题

合约代码问题

我们知道几乎稍微复杂一点的代码都或多或少地存在问题(bug)。了解出现问题的原因并且归纳问题类别可以帮助我们更好地防范它们。下面是 Ownbit 钱包团队整理的关于以太坊智能合约安全最容易出现问题的点。

1. 重入(Reentrancy)

这是排名第一的问题。所谓“重入”就是一个方法被多次循环调用。而这通常是合约开发者所意想不到的。例如一个取款合约:

这是一段很简单的取款合约让用户取走他的 ETH 余额。开发者并没有意识到这段代码可能会被重入。方法是:只要调用者是一个合约账户那么 msg.sender.call 将默认调用该合约账户的

fallback

函数。攻击者只需要在其 fallback 函数再次调用 withdrawEther 就可以源源不断地取走

ETH

发生在 2016年6月著名的 The DAO 攻击okex从而导致了 ETC 分叉的事件就是通过同样的方法实施攻击的。从事后看来这只是一个小小的程序问题(却造成了如此严重的后果)。要修复这个问题也非常容易只需要将两行代码调换顺序即可:

2. 让你的交易不打包

以太坊区块的打包机制是

按照给予的矿工费(GasPrice)进行优先打包

earn bitcoin并且每个区块有总 GasLimit 的限制(目前为每区块 1200万 Gas)。所以攻击者可以制造出若干使用 GasLimit 非常大并且 GasPrice 给得非常高的交易让它们优先占满区块从而让目标交易无法被打包。

所以在编写合约逻辑时不能假设你的交易会在有限时间内被打包否则就容易受到此类攻击。

著名的“Fomo3D”事件就是用了这样的攻击方法

Fomo3D 游戏规则是奖励最后一个购得某个商品的人。每次商品被买入将重置该商品的定时器区块链如果在定时器达到0之前没有其他购买者则你将获得系统的奖励。攻击者在 Fomo3D 中买入商品然后同时发送大量占用区块的攻击交易以至于在接下来的 13 个区块内其他购买者的交易无法被打包。这时定时器达到 0并认为无其他购买者。攻击者便获得了奖励完成了攻击。

3. 错误使用 tx.origin

如果你发现一个合约使用了 tx.origin那么可以留心一下此处可能存在的漏洞。在大部分情况下我们应该使用 msg.sender 来替代 tx.origin因为使用 tx.origin 容易引发安全漏洞。

很多时候合约开发人员会假定 msg.sender 和 tx.origin 是相等的但其实不是。例如:

用户A

调用

合约B

合约B

进一步调用

合约C

那么在合约B和C中 tx.origin 都将是 A比特币区块链浏览器而 msg.sender 则一个是 A一个是B。

一般攻击者会引诱 A 调用一个诱导合约B而B再去调用由 A 部署的目标合约C因为 合约C 错误地使用了 tx.origin合约B可以通过传递过来的 tx.origin 获得对 合约C 的控制权从而完成攻击。

4. 溢出攻击

智能合约里的数据是可能溢出的例如:uint256你觉得很大:2^256。它的确很大但依然可以溢出。例如一个合约允许对一个数据进行加减攻击可以通过对这个数据进行精心策划的调用让其通过溢出达到允许执行某些逻辑的目的从而实现攻击。

5. fallback可以 revert

fallback 是可以 revert 的就是说你如果向对方转移 ether对方可以让你总是不成功。

例如你编写一段合约并且依赖于你成功向某个地址转移 ether那么攻击可以部署一个合约将其 fallback 写成 revert 来让你来的调用总是失败:

6.selfdestruct 可以定义任意受益者而不会调用 fallback

当你以为可以通过 revert 进行阻止所有人向你付款 ether 时你可能又错了。攻击者通过创建一个合约并且然后销毁这个合约。销毁合约以太坊将退还一部分 ether 作为鼓励而这个退还可以指定任意受益者而对方的 fallback 函数不会被调用。

这就是说开发者要意识到你没有办法完全阻止别人向你的合约账户转移 ether。

7.未正确使用 dele

gate

call

在使用 dele

gate

call 时要注意上下文(即 msg.sender 等)的变化。用 call 进行合约调用时上下文被切换至被调用合约。而用 dele

gate

call 进行合约调用时上下文依然在本合约。

delegatecall 和 call 不同的调用上下文也是合约安全漏洞较常出现的地方。

8. 不同方法传气不一样

当我们进行 ether 转移时不同的方法传气(Gas)不一样。使用 send() 和 transfer()传递气仅为 2300而使用 call.value()()则将剩余的气全部传递。因此最新的安全规范是建议使用

call

而不是

send

或者

transfer

进行 ether 转移。

如果你发现一个合约还是使用 send 或者 transfer那么你可以制造出目标合约让其转移 Out of Gas。

结语

以上这些点是合约代码最常出现问题的点。每个错误的原因都比较原子化理解相应的原理可以帮助我们有效地避免这些问题。当合约逻辑复杂时一定会有更加复杂、隐藏得更深的逻辑问题这时这些原子点的检查依然可以帮助我们找到它们。

以太坊智能合约的安全问题主要是因为其“过于灵活”引起的。灵活性和安全性如同天平的两端。以太坊选择了灵活性某种程度上便把安全性的潜在风险留给了市场。

一个 DeFi 项目能否安全稳定地运行或是会被黑客攻击取决于合约开发人员对原理的理解、对细节的把控以及严肃认真的态度。线上合约犯错的代价是巨大的这就对合约开发人员提出了更高的要求!

buy bitcoin (责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
广告位API接口通信错误,查看德得广告获取帮助