火星链 火星链
Ctrl+D收藏火星链

THE:深入理解重入攻击漏洞

作者:

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

摘要:重入攻击本质上与编程里的递归调用类似,当合约将以太币发送到未知地址时就可能会发生,威胁以太坊智能合约的安全性。知道创宇区块链安全实验室?从转账方法、fallback函数、漏洞代码、源码分析四个方面入手,深入分析攻击原因,详解?The?DAO事件。

前言

智能合约的概念于1995年由NickSzabo首次提出,它是一种旨在以信息化方式传播、验证或执行合同的计算机协议,它允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。

然而智能合约也并非是安全的,其中?重入(Re-Entrance)攻击?漏洞是以太坊中的攻击方式之一,早在2016年就因为TheDAO事件而造成了以太坊的硬分叉。

漏洞概述

在以太坊中,智能合约能够调用其他外部合约的代码,由于智能合约可以调用外部合约或者发送以太币,这些操作需要合约提交外部的调用,所以这些合约外部的调用就可以被攻击者利用造成攻击劫持,使得被攻击合约在任意位置重新执行,绕过原代码中的限制条件,从而发生重入攻击。重入攻击本质上与编程里的递归调用类似,所以当合约将以太币发送到未知地址时就可能会发生。

简单的来说,发生重入攻击漏洞的条件有2个:

调用了外部的合约且该合约是不安全的

外部合约的函数调用早于状态变量的修改

下面给出一个简单的代码片段示例:

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

漏洞分析

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

转账方法

由于重入攻击会发送在转账操作时,而Solidity中常用的转账方法为

彭博社:美CFTC和SEC正在深入调查三箭资本:金色财经报道,两位知情人士透露,美国商品期货交易委员会(CFTC)和证券交易委员会(SEC)目前正在深入调查三箭资本(Three Arrows Capital),以确定该公司是否违反了规则,在资产负债表方面误导投资者,并且没有在两家监管机构注册。两家机构均拒绝置评,但其审查可能导致对公司和个人处以罚款和其他处罚。

此前报道,总部位于新加坡的三箭公司于7月申请破产,称其业务“在加密货币市场剧烈波动后崩溃”,三箭联合创始人Su Zhu和Kyle Davies目前仍下落不明,导致该破产案的清算人及其律师无法追踪,清算人向法院申请通过二人的电子邮件地址、Twitter帐户及其律师的电子邮件地址送达传票。(彭博社)[2022/10/18 17:29:38]

<address>.transfer(),<address>.send()和<address>.gas().call.vale()(),下面对这3种转账方法进行说明:

<address>.transfer():只会发送2300gas进行调用,当发送失败时会通过throw来进行回滚操作,从而防止了重入攻击。

<address>.send():只会发送2300gas进行调用,当发送失败时会返回布尔值false,从而防止了重入攻击。

<address>.gas().call.vale()():在调用时会发送所有的gas,当发送失败时会返回布尔值false,不能有效的防止重入攻击。

fallback函数

接着我们来讲解下fallback回退函数。

回退函数(fallbackfunction):回退函数是每个合约中有且仅有一个没有名字的函数,并且该函数无参数,无返回值,如下所示:

function()publicpayable{???

???...

}

回退函数在以下几种情况中被执行:

调用合约时没有匹配到任何一个函数;

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

没有传数据;

智能合约收到以太币。

漏洞代码

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

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

动态 | 《加快推进上海金融科技中心建设实施方案》:推动区块链等技术深入研发攻关:1月15日,上海市地方金融监督管理局会同国家在沪金融管理部门共同召开新闻通气会,宣传介绍《加快推进上海金融科技中心建设实施方案》(以下简称《实施方案》)。《实施方案》指出,全速推进金融科技关键技术研发。积极推动大数据、人工智能、区块链、5G等新兴技术深入研发攻关,推动技术创新与金融创新的融合发展。深化芯片、算法、云计算等基础技术攻关,提升金融创新的基础技术支撑能力。统筹布局安全、稳定、高效的信息基础设施,积极争取国家级金融科技重大项目和平台在沪落地。(第一财经)[2020/1/15]

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

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

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

声音 | 瑞银前负责人:DLT技术已深入金融机构设计核心:据AMBCrypto今日消息,瑞银(UBS)前首席执行官Peter Wuffli认为DLT技术很强大。他表示,DLT技术深入到了金融机构设计的核心,即会计。在传统会计中,具有三层或四层控制:银行的内部会计部门,内部审计,外部审计和银行主管;而DLT技术可确保所有内容都是可追溯和正确的,并且可以通过各方之间的共识建立控制。这比官僚控制的分层链更好。同时,Wuffli还建议对新技术持谨慎态度。他说人们不应该高估技术的作用,投资者在投资加密技术之前必须对风险和回报做出正确的判断,就像对待其他任何资产类别一样。[2019/9/26]

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

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

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

“中国数谷”发布《三年行动计划》:深入推进区块链等前沿研究探索落地:今日,贵阳国家高新区正式发布《贵阳国家高新区建设“中国数谷之心”三年行动计划(2018-2020年)》。《三年行动计划》明确,深入推进物联网、人工智能、区块链以及大数据+实体经济等前沿研究探索落地全面推进中国数谷之心建设行动。[2018/4/20]

再次调用合约的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

标签:THEALLDAOTRAATHENASV2trustwallet官网最新版RATSDAO币Data Transaction

比特币价格今日行情热门资讯
BSC:盘点不安全的五月:BSC黑客攻击回顾

前言币安智能链由于其手续费低廉、出块速度快的特点,吸引了大批DeFi协议,助长了BSC链上DeFi生态的发展,而也由此逐渐成为黑客众矢之的.

1900/1/1 0:00:00
BELT:金色早报 | DEX单日交易额击穿30亿美元创历史新高

头条▌DEX单日交易额击穿30亿美元创历史新高据最新数据显示,本文撰写时DEX单日交易额已经达到3,064,865,407美元,创下历史新高.

1900/1/1 0:00:00
CHE:以吸血鬼攻击开启的Defi农场 资金粘性较差

MasterChef.sol可能是DeFi中被分叉最多的合约之一。所谓分叉是指复制代码库,其大部分功能不变。开发者可能会改变一两个变量的名称,但合约的架构以及它的界面基本上是相同的.

1900/1/1 0:00:00
以太坊:金色早报|上海将发放35万份数字人民币红包

头条▌上海将发放35万份数字人民币红包上海将发放35万份数字人民币红包,每份55元。人民银行上海总部会同市商务委、市地方金融监管局,决定在“五五购物节”期间开展“数字人民币五五欢乐购”红包活动.

1900/1/1 0:00:00
TER:V神:Eth2进展的障碍不是技术问题 而是与人有关的问题

以太坊联合创始人VitalikButerin在香港的一次会议上就Eth2路线图的障碍发表了评论.

1900/1/1 0:00:00
RAVE:买了虚拟币却卖不出去 央视揭秘“百倍币”局

原标题:买了虚拟币却卖不出去!总台记者独家揭秘“百倍币”局卖不掉的虚拟币这并不是国家第一次这么大力度来监管虚拟币了.

1900/1/1 0:00:00