月亮链 月亮链
Ctrl+D收藏月亮链
首页 > TRX > 正文

区块链:深入理解重入攻击漏洞_BETHER价格

作者:

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

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

前言

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

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

漏洞概述

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

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

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

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

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

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

漏洞分析

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

转账方法

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

火币区块链研究院李慧:未来银行会更加深入布局区块链技术:4月7日消息,火币区块链研究院副院长李慧表示,未来银行业对区块链技术布局会否更加深入的答案是肯定的。她认为,“通过区块链技术的嵌入,银行实现原有业务基础上的降本提效,并且吸纳更多客户,达到双赢局面。上面所提到的区块链在银行各业务的布局以B2B业务居多,随着区块链技术的普及与发展,银行会逐渐将区块链布局到更多的toC业务领域,如信用卡积分管理等。”(证券日报)[2020/4/7]

<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{???

???...

}

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

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

没有传数据;

智能合约收到以太币。

漏洞代码

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

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

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

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

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

声音 | Evolution capital创始合伙人:熊市有更多时间做深入思考:11月16日, Evolution capital 创始合伙人老葛在“499加油站第二十期”接受火币英才CEO张晓媛和节点资本合伙人及贝壳公关CEO姜晓玉的采访时表示, 熊市过冬宝典一,是意识的升级,慢慢对这个行业的理解跟上了,自然比隔岸观火的人理解更深。熊市过冬宝典二,是多宣传,PR成本低;好好做社群,做精,有更优质的用户;扎实的做合规。花时间在这些领域提升,积累经验和技能的小伙伴,下一波行情来的时候,就有了更多的优势。保持敏锐,等下一波机会大批涌来的时候,肯定是观念超前,行动在一线的人,最有机会把握住。[2018/11/17]

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

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

动态 | SAP与苏宁将在区块链等领域开展深入研究:在“第9届中德经济技术合作论坛”上,中国国务院总理李克强与德国总理默克尔,共同见证了SAP与苏宁控股集团的战略合作签约。根据合作协议,未来,双方将联合开展技术创新和行业实践,在人工智能、机器学习、区块链、物联网等领域开展课题研究,共同促进数字经济发展。[2018/7/10]

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

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

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

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

五粮液牵手IBM 将在区块链等方面展开深入合作:近日,在宜宾举行的五粮液(000858.SZ)数字化转型项目启动大会上,五粮液和IBM双方表示,将在区块链、云计算、人工智能等领先科技方面进行深入的合作应用,借用IBM丰富的行业数字化转型经验和技术,按照“年轻化”“低度化”“数字化”“国际化”的创新思维,带动酒业乃至及“大机械、大物流、大包装、大金融、大健康”五大板块快速有序发展,助力五粮液构建“智慧商业”模式,实现高质量发展。[2018/4/29]

源码分析

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

相关案例

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

标签:区块链THEDAOALL区块链的未来发展前景BETHER价格Play It Forward DAOtrustwallet钱包下载

TRX热门资讯
区块链:区块链在数据管理中有哪些价值?_Uncharted

在数字化转型时代,更多企业开始积极拥抱区块链、人工智能、物联网等新型数字技术改造传统流程,应对数字化新挑战。其中区块链技术正受到越来越多企业的关注.

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

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

1900/1/1 0:00:00
EFI:一文带你深入了解DeFi收益聚合器_UNION Finance

本文对论文“SoK:YieldAggregatorsinDeFi”进行了总结,它是伦敦大学学院区块链数据中心和伦敦帝国理工学院的联合研究的成果.

1900/1/1 0:00:00
LON:美国众议员:向勒索软件支付加密赎金形成了“危险先例”_OLO

本文来自?Decrypt,原文作者:JeffBenson摘要:各公司今年已经为勒索软件支付了至少?9000?万美元的比特币赎金.

1900/1/1 0:00:00
比特币:比特币创下最大单月跌幅 你害怕了吗?_加密货币行情英为行情

最近,比特币从高点发生巨大的回撤,创下了10年来的最大单月跌幅,大多数市场参与者对加密货币市场未来的走势感到十分焦虑和恐慌.

1900/1/1 0:00:00
比特币:嘉楠科技张楠赓:海外客户已恢复下单,币价对矿机销售影响不大_比特币历史价格图表

北京时间6月1日,嘉楠科技发布2021年第一季度财务报告。财报显示,得益于一季度交付的比特币矿机数量增长,一季度嘉楠科技收入4.028亿元,同比增长近4.9倍,环比增长9.5倍.

1900/1/1 0:00:00