区块见闻 区块见闻
Ctrl+D收藏区块见闻
首页 > Gate.io > 正文

TRA:深入理解重入攻击漏洞_trustwallet钱包被冻结

作者:

时间:

前言

智能合约的概念于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函数

顺网科技与中数链签订合作协议:将在元宇宙等方面开展深入合作:7金色财经报道,日前,顺网科技与中数链(上海)签订框架合作协议,公司旗下元宇宙瞬元智能链、Meta CJ将与对方展开包含资本性合作在内的全面深入合作。中数链是国版链的超级节点运营机构,是一家整合了专业的区块链、web3.0应用技术,链接了丰富的文化数字化上下游生态资源的元宇宙技术及应用解决方案的机构。当下,顺网科技则在不断完善元宇宙算力基础设施+应用层生态建设。[2022/7/23 2:33:07]

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

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

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

多链DeFi平台Rubic正在深入研究允许RBC被用作税收资产:官方消息,多链DeFi平台Rubic宣布,作为一个额外的用例,正在深入研究允许RBC被用作税收资产。此外,Rubic表示,在新UI的工作接近完成后,BSC Polygon桥等将在不久后启动。[2021/6/24 0:02:35]

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

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

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

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

Babel Finance创始人:中国投资者并未深入GME、狗狗币交易背后的“革命”中:1月30日消息,香港加密货币贷款机构Babel Finance创始人兼首席执行官Flex Yang在采访中表示,不管是GameStop(GME)事件还是狗狗币的暴涨,从加密货币贷款机构的角度来看,中国的散户投资者并没有深入或积极地参与这场交易狂潮背后的真正“革命”。(Coindesk)[2021/1/30 18:28:04]

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

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

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

现场 | 姜海:密码学将随着黎曼猜想等理论研究的深入迎来大发展:金色财经现场报道,今日,2018可信区块链峰会在北京召开。在主题为“区块链安全焦点关注”的区块链安全论坛上,丁牛科技有限公司CEO姜海结合最近黎曼猜想被证明引起了密码学界的高度关注,分析了黎曼猜想与区块链密码安全。他提出,尽管黎曼猜想的证明对于传统密码安全有极大的冲击,但是区块链技术的安全建立在SHA-256、椭圆曲线、算法校验等基础之上,在使用过程中能够极大地抵抗密码攻击。尽管最近有很多的安全事件发生,而其根本原因在于程序的违规操作。未来随着随机发生器、量子计算机以及黎曼几个等基础理论的研究,密码学将会有更大的发展空间。[2018/10/10]

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

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

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

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

标签:THEDAOALLTRASouth African TetherDAOstrustwallet钱包被冻结Transparent Token

Gate.io热门资讯
ETF:普及化未来可期,盘点本年度加密货币的出圈大事件_metfi币怎么样

尽管加密货币市场从5月份开始出现暴跌,但加密货币的总市值在过去一年内增长了400%,达到了约1.4万亿美元的高度.

BIF:加密市场安全事故频发,我们有什么更好的解决办法吗?_BiFrost

全球范围的加密市场尽管已经发展超过了10年,但这10年中并不是一帆风顺,一方面是行业外部监管和政策的压制,另一方面还来源于行业本身发生的一系列安全事件,尤其是交易所的安全事件,常常令人错愕.

BIF:Bifrost SALP如何赋能Polkadot生态_BiFrost

北京时间6月10日晚7:00,由Bifrost联合Odaily星球日报共同举办的「DeFi新范式-暨BifrostKusama平行链竞拍发布会」顺利举行.

DAO:如何通过链上分析追踪鲸鱼运动?_DiamondDAO

当涉及到加密货币交易时,用户可以利用技术指标和价格模式来最大化自己的回报。支持和阻力、牛市旗、布林格区间和移动平均线是常见的加密货币交易工具.

加密货币:星球日报 | 韩央行称加密资产价格被高估的可能性很大;Karura获Kusama首个平行链竞拍插槽_加密货币市场行情

头条 中证报:严禁虚拟货币交易炒作,央行约谈部分银行和支付机构中国证券报今日刊文表示,严禁虚拟货币交易炒作央行约谈部分银行和支付机构。文章认为,防止虚拟货币炒作,要及时切断交易资金支付链路.

IDEO:Filecoin打破局限?电影和流媒体是NFT的下一趋势_FILE

上周福布斯杂志发布了一片关于视频NFT的文章,文章提到电影和流媒体可能是NFT的下一个前沿领域.