黑基网 首页 教程 网络安全 查看内容

Solidity中的重入漏洞分析

2018-8-9 00:47| 投稿: xiaotiger |来自: 互联网

摘要: 前言Soildity 作为编写智能合约的语言,已经被广泛的应用。但同时,开发者和用户也得到了惨痛的教训,智能合约的安全问题层出不穷。因此,区块链安全公司WF曲速未来总结了一些常见的Solidity安全问题。前车之鉴,后 ...

前言

Soildity 作为编写智能合约的语言,已经被广泛的应用。但同时,开发者和用户也得到了惨痛的教训,智能合约的安全问题层出不穷。

因此,区块链安全公司WF曲速未来总结了一些常见的Solidity安全问题。前车之鉴,后车之师,希望后来者能有所警惕。

重入漏洞介绍

重入漏洞,按照表面意思就是可以重复进入。在以太坊的智能合约中,向为外部地址发送ETH需要调用外部合约的代码。黑客通过劫持外部调用,从而重复进入以太坊智能合约的转账函数进行转账。

代码分析

首先是以太坊的智能合约的转账函数

假如账户有10个币,你要转9个出去。肯定是可以的,你要转11个,就不行。因为你没有11个。所以此处要转9个出去肯定是可以的。因为10>=9。最后一步就是减去你账户中的9个币了。此时账户里面只有1个币了。

看看黑客如何进行攻击的:

攻击者首先构造一个恶意合约Mallory,将Mallory部署之后,攻击者调用withdraw函数向Mallory合约捐赠一点以太币。看似没什么问题。

但是withdraw函数中的msg.sender.call.value(amout)执行之后,由于转账 操作特性 ,会在转账结束之后自动调用Mallory 的 fallback函数,于是再次调用 withdraw函数。因为此时credit中并未更新额度,所以依然可以正常取款,便陷入递 归循环,每次都提取DAO中的一部分以太币到Mallory合约中。

在这里,我们上面分析过了,我们是先进行转账再进行扣款的。那么这样有什么坏处呢?也就是说,如果在转账处一直循环卡住了,那么扣款就不会执行。但是转账操作会一直执行。

相关事件

2016年6月以太币组织 The DAO 被攻击,攻击者利用两个代码漏洞创建子合约提取了360万个以太币。接下来我们详细分析一下这个事件

从splitDAO代码开始

函数调用者只能是TokenHolder。不能是ether账户。这里没什么问题,符合预期

splitDAO的代码有点长,我们看到如下的代码

在这里是计算需要支付的金额,然后调用createTokenProxy函数。我们需要记住这点。根据BLOG 2,在DAO.sol中,function splitDAO函数有这样一行:

合约中,为msg.sender记录的dao币余额归零、扣减dao币总量totalSupply等等都发生在将发回msg.sender之后,这里是在Blog 1中指出的一个典型“反模式”。

接下来看withdrawRewardFor函数。目前github中所见最新代码并非部署于Ethereum livenet的代码:

paidOut[_account] += reward 在原来代码里面放在payOut函数调用之后,最新github代码中被移到了payOut之前。再看payOut函数调用。rewardAccount的类型是ManagedAccount,在ManagedAccount.sol中可以看到:

_recipient.call.value 这个函数调用时,转账_amount个Wei,call调用默认会使用当前剩余的所有gas,此时call调用所执行的代码步骤数可能很多,基本只受攻击者所发消息的可用的gas限制。

把这些拼起来,黑客的攻击手法就浮现了:

我们现在可以建立一个攻击合约。

创建一个钱包,调用splitDAO多次,直到到达合约的gas limit,或者stack limit。

创建一个分割提案到一个新的钱包地址。

等待7天。

调用splitDAO

调用了两次splitDAO,withdrawRewardFor也调用了两次,并且两次都是成功。成功窃取ether。

区块链安全公司WF曲速未来 表示:作为已经有过被利用先例的漏洞,开发者在编写合约时应更小心一些。


小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里 注册黑基账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!

本文出自:https://www.toutiao.com/a6587317503435735559/

免责声明:本文由投稿者转载自互联网,版权归原作者所有,文中所述不代表本站观点,若有侵权或转载等不当之处请联系我们处理,让我们一起为维护良好的互联网秩序而努力!联系方式见网站首页右下角。


鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

最新

返回顶部