宇宙链 宇宙链
Ctrl+D收藏宇宙链

深入理解重入攻击漏洞

作者:

时间:1900/1/1 0:00:00

前言

智能合约的概念于1995年由NickSzabo首次提出,它是一种旨在以信息化方式传播、验证或执行合同的计算机协议,它允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。然而智能合约也并非是安全的,其中重入(Re-Entrance)攻击漏洞是以太坊中的攻击方式之一,早在2016年就因为TheDAO事件而造成了以太坊的硬分叉。漏洞概述

在以太坊中,智能合约能够调用其他外部合约的代码,由于智能合约可以调用外部合约或者发送以太币,这些操作需要合约提交外部的调用,所以这些合约外部的调用就可以被攻击者利用造成攻击劫持,使得被攻击合约在任意位置重新执行,绕过原代码中的限制条件,从而发生重入攻击。重入攻击本质上与编程里的递归调用类似,所以当合约将以太币发送到未知地址时就可能会发生。简单的来说,发生重入攻击漏洞的条件有2个:调用了外部的合约且该合约是不安全的外部合约的函数调用早于状态变量的修改下面给出一个简单的代码片段示例:

上述代码片段就是最简单的提款操作,接下来会给大家详细分析重入攻击造成的原因。漏洞分析

在正式的分析重入攻击之前,我们先来介绍几个重点知识。01转账方法

由于重入攻击会发送在转账操作时,而Solidity中常用的转账方法为<address>.transfer(),<address>.send()和<address>.gas().call.vale()(),下面对这3种转账方法进行说明:<address>.transfer():只会发送2300gas进行调用,当发送失败时会通过throw来进行回滚操作,从而防止了重入攻击。<address>.send():只会发送2300gas进行调用,当发送失败时会返回布尔值false,从而防止了重入攻击。<address>.gas().call.vale()():在调用时会发送所有的gas,当发送失败时会返回布尔值false,不能有效的防止重入攻击。02fallback函数

Aurora CEO:彩虹桥已完全恢复,将深入审查相关问题:金色财经报道,Aurora CEO Alex Shevchenko发推称,彩虹桥已完全恢复。用户可以进行新的代币跨链,也可以完成暂停前已经开始的代币跨链。接下来将对该问题进行深入审查。

据此前报道,2月11日,Aurora CEO Alex Shevchenko发推称,彩虹桥(Rainbow Bridge)已采取预防措施而暂停使用,没有资金损失,团队正在努力恢复彩虹桥。[2023/2/13 12:03:11]

接着我们来讲解下fallback回退函数。回退函数(fallbackfunction):回退函数是每个合约中有且仅有一个没有名字的函数,并且该函数无参数,无返回值,如下所示:

回退函数在以下几种情况中被执行:调用合约时没有匹配到任何一个函数;没有传数据;智能合约收到以太币。03漏洞代码

下面的代码就是存在重入攻击的,实现的是一个类似于公共钱包的合约,所有的用户都可以使用deposit()存款到Reentrance合约中,也可以从Reentrance合约中使用withdraw()进行提款,当然了所有人也可以使用balanceof()查询自己或者其他人在该合约中的余额。

首先使用一个账户(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4)扮演受害者,将该合约在RemixIDE点击Deploy按钮进行部署。

南宁市深入推进“区块链+”人社应用和“打包快办”服务改革:8月20日,南宁市人社局召开专题党组会,传达学习市委十二届十次全体(扩大)会议精神,并就抓好贯彻落实作出部署。会议强调,局系统广大党员干部要将思想认识统一到市委决策部署上来,将学习贯彻市委十二届十次全体(扩大)会议精神和年度工作任务相结合,扎实推进各项中心工作;抓重点攻难点,切实保障和改善民生,千方百计保就业,兜住基本民生底线,深入推进“智慧人社”工作,深化“一门式”服务改革,深入推进“区块链+”人社应用和“打包快办”服务改革,确保完成全年目标任务。(南宁日报)[2020/8/23]

在部署合约成功后在VALUE设置框中填写5,将单位改成ether,点击deposit存入5个以太币。

点击wallet查看该合约的余额,发现余额为5ether,说明我们的存款成功。

而下面的代码则是针对上面存在漏洞的合约进行的攻击:

共为2020 | Block.one首席执行官:区块链深入数据,更好为用户服务:金色财经现场报道,2020年6月21日,由金色财经主办的共为2020·区块链创新应用论坛在深圳拉开帷幕。Block.one首席执行官Brendan Blumer、金色财经CEO安鑫鑫就《Block.one、EOSIO和区块链未来》进行现场连线。Block.one首席执行官Brendan Blumer指出:大家看到周围的事物往往只是表面,但往下深挖是很大的数据库。比如现在社交媒体上有很多广告,这些广告下面是数据,很多公司用算法和技术方法把广告推送到我们身边。区块链技术可以深入其中,提高更好的透明度,看是否为用户服务,让用户能更好的掌控。[2020/6/21]

使用另外一个账户(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2)扮演攻击者,复制存在漏洞的合约地址到Deploy的设置框内,点击Deploy部署上面的攻击合约。

部署成功后先调用wallet()函数查看攻击合约的余额为0。

北京方正公证处杨和平:与腾讯在多个方面达成深入合作:金色财经报道,4月17日,腾讯安全领御区块链-北京方正公证取证平台正式发布。在发布会上,北京方正公证处副主任杨和平表示:“区块链作为一种可以在完全不信任的节点之间建立信任机制的技术,具有高可靠度、高透明度、可追溯、永久保存和无法篡改的特性,这些特性与公证的职业要求和行业发展需求具有天然的融合性、互补性,特别是在公证三大效力之一的证据效力方面双方高度契合。腾讯安全与北京市方正公证处联合打造的领御区块链北京方正公证取证平台,就是要在深度整合两者优势基础上通过国家公信力+技术信任力的双重增信,向社会提供电子证据安全存储、取证维权、在线公证等智能化服务,从而形成一套规范和标准的互联网数据公证服务新模式。”

此外,北京方正公证处副主任杨和平还介绍说,未来方正公证处与腾讯将在以下几方面进行深度合作:1、构件新型公证法律服务业态上进行新的探索;2、拓展公证服务领域上取得新的突破;3、提升公证服务效率上再上新台阶;4、人才培养方面积累新经验;5、体制机制建设上走出新路子;6、公证服务助力互联网方面走出新天地。[2020/4/17]

攻击者先存款1ether到漏洞合约中,这里设置VALUE为1ether,之后点击攻击合约的deposit进行存款。

再次调用合约的wallet函数查看漏洞合约的余额,发现已经变成了6ether。

动态 | 重庆两江新区与重庆市科学技术研究院达成合作 双方将在区块链等领域深入探讨合作:金色财经报道,重庆两江新区与重庆市科学技术研究院27日在当地签署全面战略合作协议。双方要在区块链等领域深入探讨合作。[2019/11/28]

攻击者(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2)调用攻击合约的attack函数模拟攻击,之后调用被攻击合约的wallet函数去查看合约的余额,发现已经归零,此时回到攻击合约查看余额,发现被攻击合约中的6ether已经全部提款到了攻击者合约中,这就造成了重入攻击。

04源码分析

上面讲解了如何进行重入攻击已经漏洞原因,这里梳理了漏洞源码和攻击的步骤,列出了关键代码。

相关案例

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等函数回调自己造成递归调用进行循环转账操作,所以针对重入攻击漏洞的解决办法有以下几种。01使用其他转账函数

在进行以太币转账发送给外部地址时使用Solidity内置的transfer()函数,因为transfer()转账时只会发送2300gas进行调用,这将不足以调用另一份合约,使用transfer()重写原合约的withdraw()如下:

02先修改状态变量

这种方式就是确保状态变量的修改要早于转账操作,即Solidity官方推荐的检查-生效-交互模式(checks-effects-interactions)。

03使用互斥锁

互斥锁就是添加一个在代码执行过程中锁定合约的状态变量以防止重入攻击。

04使用OpenZeppelin官方库

OpenZeppelin官方库中有一个专门针对重入攻击的安全合约:https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol

参考文献

1.以太坊的几次硬分叉:https://zhuanlan.zhihu.com/p/1114467922.以太坊智能合约安全漏洞(1):重入攻击:https://blog.csdn.net/henrynote/article/details/821191163.区块链的那些事—THEDAO攻击事件源码分析:https://blog.csdn.net/Flyhps/article/details/83095036

标签:THE区块链ALLDAOEtherInc Coin区块链技术的特点All In AIDAOrayaki

火币交易所热门资讯
【Deribit期权市场播报】0620——7万持仓

播报数据由Greeks.live格致数据实验室和Deribit官网提供。即将进入6月年中期权交割,作为一年中第二大交割日,本次到期期权持仓量非常集中,接近70000张持仓,占据了目前总持仓量的接近半数.

1900/1/1 0:00:00
合成资产在DeFi世界中的重要性

合成资产协议,使得DeFi资产利用率提升,扩展资产种类,提供流动性,降低市场准入门槛,扩展用户参与度.

1900/1/1 0:00:00
关于对以太坊投资变现的思考

这两天我写了投资以太坊第二层扩展项目的经历,在文章后面的留言中,有读者谈到自己曾经在早年买了大量Matic,但是在它涨了几倍后就卖出了。恐怕这是不少投资者都有过的经历,每每想到这些都觉得难免为之惋惜.

1900/1/1 0:00:00
卡槽拍卖之际,带你简单快速的了解「波卡」的一切

公链是万亿级美元的赛道。新的公链都会宣称自己是下一代的新技术。但最终决定公链能否走得长远的是综合因素。一是创始团队的气质。有领先可落地的技术还有理想主义,这是项目可持续的重要部分,这样的团队不会因为市场的涨跌而停止构建。二是社区.

1900/1/1 0:00:00
BTC低位震荡待破位,ETH先涨后跌

随着负面消息的不断释放,币圈再遭血洗,现货资产基本上大幅缩水,在这种形势下也有逆向而为的,随着价格的不断走低,要么高位不断去做空,要么低位开始抄底,这没有对错,目前市场不稳定向因素太多,谁也说不好接下来的结局是怎么样的.

1900/1/1 0:00:00
「政策红利」释放,产业区块链突围

6月18日,据一份文件显示,四川省发改委及能源局发布了关于清理关停虚拟货币“挖矿”项目的通知,水电大省四川正式叫停比特币挖矿。这表明,各地贯彻落实国务院金融稳定发展委员会第51次会议关于“打击比特币挖矿和交易行为”的要求不断走向深入.

1900/1/1 0:00:00