火星链 火星链
Ctrl+D收藏火星链
首页 > Coinw > 正文

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

作者:

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

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

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

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

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

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

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

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

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

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

声音 | 立陶宛银行:央行“父母控制”已过时 应更深入了解加密资产领域:在12月10日发布的有关中央银行数字货币(CBDC)的分析中,立陶宛银行表示,在加密资产方面,中央银行的“父母控制”已经过时,因此不应阻止中央银行进入该领域以了解它。银行应参与数字资产领域,以获取此快速发展资产类别的经验。(Cointelegraph)[2019/12/11]

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

转账方法

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

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

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

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

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

fallback 函数

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

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

声音 | 原保监会副主席:区块链等技术通过保险业务流程全面深入,提升了保险行业的业务效率:金色财经报道,近日,全国政协经济委员会委员、国务院参事室特约研究员、原保监会副主席周延礼在“三亚财经国际论坛——全球格局变化下的应对与抉择”上表示,近年来,科技和互联网巨头跨入保险界,大数据与人工智能成为保险科技的主要驱动力,大数据、云计算、区块链、人工智能等技术通过保险业务流程全面地深入,提升了保险行业的业务效率,改变了产品形态与服务的交互方式,新的商业模式和保险生态随之而产生。[2019/12/11]

function() public payable{???

? ? ? ...

}

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

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

没有传数据;

智能合约收到以太币(为了接受以太币,fallback 函数必被标记为 payable)。

漏洞代码

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

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

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

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

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

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

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

声音 | 中国科学院院士:深入贯彻落实密码法 推动商用密码标准制定与产业发展:中国科学院院士王小云针对深入贯彻落实密码法、推动商用密码标准制定与产业发展有以下几点认识:1.密码法准确界定了密码的定义与内涵;2.加快推进商用密码产业发展、顶层设计并完善商用密码检测认证体系;3.加大密码核心关键技术的自主创新能力与标准制定,贡献中国密码的智慧与方案;4.加快雄安新区同步规划与建设密码防护体系;5.加快推进以密码技术为支撑的区块链技术研发以及试点工程,加快区块链行业标准、国家标准以及国际标准制定进程;6.动密码专业建设与学科发展,加大规模化密码人才培养力度。(经济参考报)[2019/11/21]

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

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

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

福建省法院网信办主任郭金焰:推动大数据、区块链等与法院工作的深度融合、深入应用:福建省法院网信办主任郭金焰介绍,法院系统将把科技理性与司法理性“两个智慧”融合好,把制度优势和技术优势“两个优势”结合好,把制度铁笼和数据铁笼“两个铁笼”建构好,推动大数据、云计算、人工智能、移动互联、区块链等与法院工作的深度融合、深入应用,促进审判体系和审判能力现代化,让人民群众充分享受信息化和智慧法院建设带来的获得感。[2018/4/22]

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

源码分析

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

2016 年 6 月 17 日,TheDAO 项目遭到了重入攻击,导致了 300 多万个以太币被从 TheDAO 资产池中分离出来,而攻击者利用 TheDAO 智能合约中的 splitDAO() 函数重复利用自己的 DAO 资产进行重入攻击,不断的从 TheDAO 项目的资产池中将 DAO 资产分离出来并转移到自己的账户中。

下列代码为 splitDAO() 函数中的部分代码,源代码在 TokenCreation.sol 中,它会将代币从 the parent DAO 转移到 the child DAO 中。平衡数组 uint fundsToBeMoved = (balances[msg.sender] * p.splitData.splitBalance) ?/ p.splitData.totalSupply 决定了要转移的代币数量。

下面的代码则是进行提款奖励操作,每次攻击者调用这项功能时 p.splitData 都是一样的(它是 p 的一个属性,即一个固定的值),并且 p.splitData.totalSupply 与 balances[msg.sender] 的值由于函数顺序问题,发生在了转账操作之后,并没有被更新。

paidOut[_account] += reward 更新状态变量放在了问题代码 payOut 函数调用之后。

对 _recipient 发出 .call.value 调用,转账 _amount 个 Wei,.call.value 调用默认会使用当前剩余的所有 gas。

通过上面对重入攻击的分析,我们可以发现重入攻击漏洞的重点在于使用了 fallback 等函数回调自己造成递归调用进行循环转账操作,所以针对重入攻击漏洞的解决办法有以下几种。

使用其他转账函数

在进行以太币转账发送给外部地址时使用 Solidity 内置的 transfer() 函数,因为 transfer() 转账时只会发送 2300 gas 进行调用,这将不足以调用另一份合约,使用 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.?区块链的那些事 — THE DAO 攻击事件源码分析:

https://blog.csdn.net/Fly_hps/article/details/83095036

标签:THEALLDAOTRANethermathwallet观察钱包DAOLaunchArbitrage Analysis Beyond Commodity

Coinw热门资讯
Maker:读懂MakerDAO的多链战略和路线图 MakerDAO会选择哪条Layer2路线?

5月28日,MakerDAO核心单元推动者Derek发文《Maker的多链战略和路线图》。介绍了MakerDAO在快速发展的多链生态中的机遇以及其中的潜在风险.

1900/1/1 0:00:00
HASH:金色观察丨比特币挖矿难度下降16% 市场感受命运翻转

金色财经 区块链5月31日讯? ?5月21日,中共中央局委员、国务院副总理、金融委主任刘鹤主持召开国务院金融稳定发展委员会第五十一次会议,会议要求打击比特币挖矿和交易行为.

1900/1/1 0:00:00
TOM:中币行情看点 :萨尔瓦多总统发文称将推行“火山”挖矿

热点摘要:1.天桥资本创始人:我们持有约5亿美元比特币;2.彭博策略师:比特币更有可能反弹至4万美元;3.萨尔瓦多总统发文称将推行“火山”挖矿;4.

1900/1/1 0:00:00
比特币:圈外人永远看不懂的区块链行业三重价值

无论是币圈业内人还是传统领域圈外人,大凡关注区块链行业时间长了,都会经受一次次的灵魂拷问:区块链行业之于社会的核心价值到底是什么?一方面.

1900/1/1 0:00:00
BOOK:摩根大通私人银行是如何看待比特币的

任何多边系统都存在网络效应。神奇的网络效应让系统内所产生的价值呈指数性增长。在现代科技的加持下,网络效应的发酵真空期被一再缩短。网络效应作为比特币系统内的重要价值组成构件,在此前并未被细节讨论.

1900/1/1 0:00:00
COI:高盛报告:比特币能否作为一种机构资产类别?

尽管可信投资者对加密货币的兴趣一直在上升,但加密货币的价格仍然极度波动,包括我们在内的传统金融机构一直在推出新的加密产品和服务,加密货币无疑是人们首要考虑的问题.

1900/1/1 0:00:00