摘要:重入攻击本质上与编程里的递归调用类似,当合约将以太币发送到未知地址时就可能会发生,威胁以太坊智能合约的安全性。知道创宇区块链安全实验室?从转账方法、fallback函数、漏洞代码、源码分析四个方面入手,深入分析攻击原因,详解?The?DAO事件。
前言
智能合约的概念于1995年由NickSzabo首次提出,它是一种旨在以信息化方式传播、验证或执行合同的计算机协议,它允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。
然而智能合约也并非是安全的,其中?重入(Re-Entrance)攻击?漏洞是以太坊中的攻击方式之一,早在2016年就因为TheDAO事件而造成了以太坊的硬分叉。
漏洞概述
在以太坊中,智能合约能够调用其他外部合约的代码,由于智能合约可以调用外部合约或者发送以太币,这些操作需要合约提交外部的调用,所以这些合约外部的调用就可以被攻击者利用造成攻击劫持,使得被攻击合约在任意位置重新执行,绕过原代码中的限制条件,从而发生重入攻击。重入攻击本质上与编程里的递归调用类似,所以当合约将以太币发送到未知地址时就可能会发生。
何宝宏:元宇宙将推动数字经济与实体经济走向深入融合:金色财经报道,中国信息通信研究院云计算与大数据研究所所长何宝宏在接受采访时表示,我国产业数字化规模仍有不小的提升空间,数字技术创新应用依然迫切,此外,元宇宙将推动数字经济与实体经济走向深入融合。当前的数字经济更像是传统经济的数字化转型,而未来的数字原生世界,元宇宙或者Web3.0里面企业的组织形态理应发生非常大的变化。
元宇宙是数字技术、数字产品、数字产业发展的必然形态,将推动数字经济与实体经济走向深入融合。何宝宏表示,当前,元宇宙概念边界仍在持续探索,技术工具还有较大优化空间,现象级应用有待开发,整体还处于起步培育的初级阶段。[2023/4/9 13:52:13]
简单的来说,发生重入攻击漏洞的条件有2个:
调用了外部的合约且该合约是不安全的
外部合约的函数调用早于状态变量的修改
下面给出一个简单的代码片段示例:
上述代码片段就是最简单的提款操作,接下来会给大家详细分析重入攻击造成的原因。
声音 | 东华软件:未来将持续推动区块链在医疗健康领域的深入应用:金色财经报道,东华软件股份公司在其关于投资者交流会召开情况的公告中表示,公司医疗行业未来发展方向之一为,持续推动区块链技术在医疗健康领域的深入应用,帮助用户建立全生命周期的健康档案,实现健康数据的记录和安全共享。[2020/2/12]
漏洞分析
在正式的分析重入攻击之前,我们先来介绍几个重点知识。
转账方法
由于重入攻击会发送在转账操作时,而Solidity中常用的转账方法为
.transfer(),.send()和.gas().call.vale()(),下面对这3种转账方法进行说明:
.transfer():只会发送2300gas进行调用,当发送失败时会通过throw来进行回滚操作,从而防止了重入攻击。
.send():只会发送2300gas进行调用,当发送失败时会返回布尔值false,从而防止了重入攻击。
.gas().call.vale()():在调用时会发送所有的gas,当发送失败时会返回布尔值false,不能有效的防止重入攻击。fallback函数
声音 | 物美集团创始人张文中:区块链仅靠热度不能解决问题 须针对场景做深入开发:物美集团创始人张文中近日在接受采访时表示,新技术对现有技术企业都会有比较大的影响。比如,最近大家谈论比较多的区块链对企业影响是必然的。但我们也应该清醒认识到,区块链仅靠热度不能解决问题,它必须针对所面对的场景做深入开发和挖掘,比如在食品追溯方面,如果能够追溯源头,这也能助力实体企业转型。(联商网)[2019/11/6]
接着我们来讲解下fallback回退函数。
回退函数(fallbackfunction):回退函数是每个合约中有且仅有一个没有名字的函数,并且该函数无参数,无返回值,如下所示:
function()publicpayable{???
???...
}
回退函数在以下几种情况中被执行:
调用合约时没有匹配到任何一个函数;
没有传数据;
智能合约收到以太币。
动态 | 报告:随着区块链技术的深入应用 引发的网络安全问题将逐渐增多:据齐鲁网6月11日消息,今天下午,《2018年山东省互联网网络安全报告》在济南发布。报告提到,随着区块链技术的深入应用,引发的网络安全问题将逐渐增多,以数字加密货币为基础的黑产交易、网络勒索等行为出于不可控状态,挖矿恶意软件持续猖獗。[2019/6/11]
漏洞代码
下面的代码就是存在重入攻击的,实现的是一个类似于公共钱包的合约,所有的用户都可以使用deposit()存款到Reentrance合约中,也可以从Reentrance合约中使用withdraw()进行提款,当然了所有人也可以使用balanceof()查询自己或者其他人在该合约中的余额。
首先使用一个账户(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4)扮演受害者,将该合约在RemixIDE?点击Deploy按钮进行部署。
在部署合约成功后在VALUE设置框中填写5,将单位改成ether,点击deposit存入5个以太币。
声音 | Evolution capital创始合伙人:熊市有更多时间做深入思考:11月16日, Evolution capital 创始合伙人老葛在“499加油站第二十期”接受火币英才CEO张晓媛和节点资本合伙人及贝壳公关CEO姜晓玉的采访时表示, 熊市过冬宝典一,是意识的升级,慢慢对这个行业的理解跟上了,自然比隔岸观火的人理解更深。熊市过冬宝典二,是多宣传,PR成本低;好好做社群,做精,有更优质的用户;扎实的做合规。花时间在这些领域提升,积累经验和技能的小伙伴,下一波行情来的时候,就有了更多的优势。保持敏锐,等下一波机会大批涌来的时候,肯定是观念超前,行动在一线的人,最有机会把握住。[2018/11/17]
点击wallet查看该合约的余额,发现余额为5ether,说明我们的存款成功。
而下面的代码则是针对上面存在漏洞的合约进行的攻击:
使用另外一个账户(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2)扮演攻击者,复制存在漏洞的合约地址到Deploy的设置框内,点击Deploy部署上面的攻击合约。
部署成功后先调用wallet()函数查看攻击合约的余额为0。
攻击者先存款1ether到漏洞合约中,这里设置VALUE为1ether,之后点击攻击合约的deposit进行存款。
再次调用合约的wallet函数查看漏洞合约的余额,发现已经变成了6ether。
攻击者(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2)调用攻击合约的attack函数模拟攻击,之后调用被攻击合约的wallet函数去查看合约的余额,发现已经归零,此时回到攻击合约查看余额,发现被攻击合约中的6ether已经全部提款到了攻击者合约中,这就造成了重入攻击。
源码分析
上面讲解了如何进行重入攻击已经漏洞原因,这里梳理了漏洞源码和攻击的步骤,列出了关键代码。
相关案例
2016年6月17日,TheDAO项目遭到了重入攻击,导致了300多万个以太币被从TheDAO资产池中分离出来,而攻击者利用TheDAO智能合约中的splitDAO()函数重复利用自己的DAO资产进行重入攻击,不断的从TheDAO项目的资产池中将DAO资产分离出来并转移到自己的账户中。
下列代码为splitDAO()函数中的部分代码,源代码在TokenCreation.sol中,它会将代币从theparentDAO转移到thechildDAO中。平衡数组uintfundsToBeMoved=(balances*p.splitData.splitBalance)?/p.splitData.totalSupply决定了要转移的代币数量。
下面的代码则是进行提款奖励操作,每次攻击者调用这项功能时p.splitData都是一样的,并且p.splitData.totalSupply与balances的值由于函数顺序问题,发生在了转账操作之后,并没有被更新。
paidOut=reward更新状态变量放在了问题代码payOut函数调用之后。
对_recipient发出.call.value调用,转账_amount个Wei,.call.value调用默认会使用当前剩余的所有gas。
解决办法
通过上面对重入攻击的分析,我们可以发现重入攻击漏洞的重点在于使用了fallback等函数回调自己造成递归调用进行循环转账操作,所以针对重入攻击漏洞的解决办法有以下几种。
使用其他转账函数
在进行以太币转账发送给外部地址时使用Solidity内置的transfer()函数,因为transfer()转账时只会发送2300gas进行调用,这将不足以调用另一份合约,使用transfer()重写原合约的withdraw()如下:
先修改状态变量
这种方式就是确保状态变量的修改要早于转账操作,即Solidity官方推荐的检查-生效-交互模式(checks-effects-interactions)。
使用互斥锁
互斥锁就是添加一个在代码执行过程中锁定合约的状态变量以防止重入攻击。
使用?OpenZeppelin官方库
OpenZeppelin官方库中有一个专门针对重入攻击的安全合约:
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol
参考文献
1.以太坊的几次硬分叉:
https://zhuanlan.zhihu.com/p/111446792
2.以太坊智能合约安全漏洞(1):重入攻击:
https://blog.csdn.net/henrynote/article/details/82119116
3.?区块链的那些事—THEDAO攻击事件源码分析:
https://blog.csdn.net/Fly_hps/article/details/83095036
尊敬的欧易OKEx用户:为了更好地为平台商家服务,不断改进并优化商家权益,我们将对平台认证/大宗商家保证金制度进行更灵活的调整.
1900/1/1 0:00:00齐衡预言:区块链行业之于社会的核心价值到底是什么?圈外人永远看不懂的区块链行业三重价值,无论是币圈业内人还是传统领域圈外人,大凡关注区块链行业时间长了,都会经受一次次的灵魂拷问:区块链行业之于社会的核心价值到底是什么?一方面.
1900/1/1 0:00:00目前智能量化交易策略库包含网格交易、合约网格、MACD(指数平滑移动平均线)、双均线、MACD-RSI、双均线-RSI六种量化策略,用户可自由选择使用。杠杆倍数设置可放大本金,获取多倍收益.
1900/1/1 0:00:00当我们分析长、短期持币者的链上情绪时,发现比特币市场已经沦为多头和空头的决战之地。在过去的这一周,比特币价格在9,430美元的交易区间内盘整。比特币以低点价格31,327美元开盘,触及近期高点40,757美元后,再回落至低点.
1900/1/1 0:00:00尊敬的合作伙伴: 为增加OKEx云交易所交易产品的丰富度,让云交易所用户在币币交易拥有更多的交易选择,OKEx云支持上线币币杠杆交易功能.
1900/1/1 0:00:00尊敬的欧易OKEx用户:2020年3月1日至2020年5月31日,OKB启动了新一季度的回购销毁。这是OKB的第8次回购销毁,共面向二级市场回购销毁OKB3,509,874.52枚,价值约1900万美金,目前已转入黑洞地址.
1900/1/1 0:00:00