木星链 木星链
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函数

上海:深入应用区块链提升在线跨境结算功能:金色财经报道,上海市人民政府今日印发《关于本市加快发展外贸新业态新模式的实施意见》,其中指出将探索区块链技术在贸易细分领域中的应用,建设数字贸易交易促进平台,深入应用区块链、大数据技术,提升在线跨境结算功能。[2021/10/15 20:32:30]

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

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

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

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

中央财经大学郭田勇:应深入研究如何用数字人民币组建更多功能:中央财经大学中国银行业研究中心主任郭田勇表示,在数字化的浪潮下,货币作为一种支付媒介,其本身的数字化是必然趋势。考虑到传统货币印制发行成本高、不易携带等局限,数字货币以其独特的优势,极大降低了交易成本。郭田勇指出,数字货币如果由政府或者中央银行来主导,必须协同好同原有银行体系为主导的支付关系。目前,中国的数字货币属于M0范畴,从金融学角度看,M0并不具有货币创造的能力,在整个货币储存量中占比也很小,因此,数字人民币的范围还非常有限,未来如何用数字人民币组建更多的功能,将其推向更大的领域,值得深入研究。这是一个循序渐进的过程,要把握好节奏。郭田勇称,数字人民币前期推进比较成功,有利于提升人民币国际化程度。随着中国经济实力增强,人民币国际业务更为广泛。面对庞大的国际结算量,数字货币高支付效率的优点更易凸显。(中国新闻网)[2021/7/7 0:32:14]

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

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

声音 | 中国互金协会副秘书长:我国区块链在金融领域应用总体处于早期尝试向深入探索转变的过渡阶段:金色财经报道,11月20日,“金融进化论:2019新京报金融科技论坛”上,中国互金协会副秘书长杨农表示,当前,我国区块链在金融领域应用,已在供应链金融、金融数据共享和金融信息存证等场景中形成了一些落地案例,总体处于早期尝试向深入探索转变的过渡阶段,且呈现出探索性应用数量较多、参与主体较为多元、底层技术原创有待加强等特点。同时,区块链在我国金融领域的应用探索也面临着如下几个方面的挑战:技术层面仍难以兼顾部分金融应用场景对安全、功能和性能的要求;研发层面自主创新有待加强,对国外开源程序的广泛应用可能导致技术依赖风险;业务层面部分金融应用环节尚存在模糊地带,部分机构在开展区块链应用创新时缺少权威的第三方评估意见作为参考;治理层面存在法律规制困难,如链上资产和智能合约等方面的法律有效性界定不清晰。[2019/11/22]

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

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

动态 | 2019年7月国内一级市场区块链融资10强发布 区块链行业的发展不断向产业端深入:据中国金融信息网报道,8月8日,中国金融信息网与烯牛数据联合发布2019年7月份国内一级市场区块链项目融资10强榜单。从榜单来看,在整体融资大幅下滑的趋势下,2019年7月份国内区块链项目融资数量出现回升。监测数据显示,数字货币和交易平台类融资项目明显增多,天秤币白皮书的发布在一定程度上提振了市场预期,但是此类项目将面临与天秤币的直接竞争,其商业逻辑未来或将受到天秤币严酷打压。与实体经济结合的项目依然占据着榜单的主流,分别涉及金融、大数据、交通运输、电商、传媒、产权、房地产和游戏领域。从连续发布的榜单来看,区块链行业的发展不断向产业端深入,应用端的开发落地越来越具体,与实体经济结合发展的想象空间逐渐立体化。从技术角度来看,加密、数据库、共识、P2P和智能合约的发展日益成熟,区块链作为集成性创新技术的发挥边界正在逐步拓展。[2019/8/8]

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

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

动态 | 报告:随着区块链技术的深入应用 引发的网络安全问题将逐渐增多:据齐鲁网6月11日消息,今天下午,《2018年山东省互联网网络安全报告》在济南发布。报告提到,随着区块链技术的深入应用,引发的网络安全问题将逐渐增多,以数字加密货币为基础的黑产交易、网络勒索等行为出于不可控状态,挖矿恶意软件持续猖獗。[2019/6/11]

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

攻击者(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

标签:区块链THEDAOALL区块链dapp开发合法吗The BeaconNFTDAOSATSALL币

火必热门资讯
EFI:DeFi的世界版图

加密货币领域在发展中国家发展逐步壮大已经成为了一个共识。今天我们想聊的就是这一领域中的DeFi板块.

1900/1/1 0:00:00
GAS:?一文了解以太坊上的新交易类型

以太坊上存在着不同的交易类型,比如,将ETH发送到某个地址,部署合约等等。在柏林网络升级之前,以太坊上就有四种不同的交易类型:带接收地址的常规交易,数据域等;没有目的地址的合约部署交易,数据域用.

1900/1/1 0:00:00
LAT:如何实现更进一步的去中心化?

今天我们讨论密码经济领域使用频率最高的一个词——去中心化。去中心化常常被视为区块链存在的全部理由,人们评价一个公链也经常把「去中心化」程度做为重要的衡量标准,在区块链技术领域的人们表现得尤其「憎.

1900/1/1 0:00:00
加密货币:监管山雨欲来,焦虑的矿工路在何方?

作者:深链六六“你看过等待戈多没有?”“现在我就很契合这个状态。”5月25日,内蒙古发改委发布《关于坚决打击惩戒虚拟货币“挖矿”行为八项措施》,根据八类对象分别提出不同的打击惩戒策略.

1900/1/1 0:00:00
数字资产:最新提案使韩国交易所「压力山大」

韩国采取措施禁止数字资产交易所的交叉交易,对此新提案,韩国数字资产交易所表示不满,因为此提案将阻止他们将交易费用转换为法定货币.

1900/1/1 0:00:00
NFT:NFT新秀StartFi:提高创作者筹资效率,保障投资者收益回报

NFT可谓2021年加密世界的现象级赛道,内容上链的创新举措,为加密技术研发者、传统艺术创作者以及数字资产投资者,另辟一条全新的创业道路。随之诞生的各类NFT项目所专注的细分领域各有不同.

1900/1/1 0:00:00