首页
社区
课程
招聘
[原创]智能合约-重入漏洞 笔记
发表于: 2020-5-2 21:58 37735

[原创]智能合约-重入漏洞 笔记

2020-5-2 21:58
37735

以太坊智能合约的特点之一是能够调用其他外部合约的代码,然而这些外部合约可能被攻击者劫持,迫使合约通过回退函数进一步执行代码,包括回调本身。在 gas 足够的情况下,合约之间甚至可以相互循环调用,直至达到 gas 的上限,但是如果循环中有转账之类的操作,就会导致严重的后果

这种函数大多存在于钱包、去中心化交易所中,目的是为了让用户提款,将合约中的代币转换成通用的以太币
但是有个问题是他没有先对用户的代币余额进行清零,而智能合约进行转账的时候会调用收款方 fallback 函数

合约可以有一个未命名的函数 —— Fallback 函数。这个函数不能有参数也不能有返回值。 如果在一个到合约的调用中,没有其他函数与给定的函数标识符匹配(或没有提供调用数据),那么这个函数(fallback 函数)会被执行。另外每当合约收到以太币(没有任何数据),这个函数就会执行。此外,为了接收以太币,fallback 函数必须标记为 payable。 如果不存在这样的函数,则合约不能通过常规交易接收以太币

如果构造一个 fallback 函数,函数里面也调用对方的 withdraw 函数的话,那将会产生一个循环调用转账功能,存在漏洞的合约会不断向攻击者合约转账,终止循环结束(以太坊 gas 有上限)

<address>.reansfer()
发送失败时会通过 throw 回滚状态,只会传递 2300 个 gas 以供调用,从而防止重入

<address>.send()
发送失败时,返回布尔值 false,只会传递 2300 个 gas 以供调用,从而防止重入

<address>.gas().call.value()()
当发送失败时,返回布尔值 false 将传递所有可用的 gas 进行调用(可通过 gas(gas _value) 进行限制),不能有效防止重入攻击

部署 Attacker 合约,给 Attacker 合约 1 以太币

image.png

部署之后点击 showAccount 再点击 amount 看一下余额,成功

image.png

同样,部署 victim 合约,给他 10 以太币,目前账户余额如下:

image.png

调用 Attacker 合约的 sendMoney 函数,给 victim 转一个以太币

image.png

调用 Attacker 的 reentry 函数,进行攻击,然后看一下余额,发现原本在 victim 中的以太币全都到了 Attacker 合约中,同时 test 的值为 11,说明 fallback 函数被调用了 11 次

image.png

重入漏洞的关键在于:利用回退函数调用函数本身,形成递归调用,在递归调用的过程中进行了转账操作,导致循环转账。虽然代码中存在判断语句,但是状态更新在函数调用之后,所以状态更新会因为循环调用而迟迟无法执行<br />广义上看,重入攻击条件有一下两个:

所以,防范的关键在于编写合约的时候把写操作放在外部函数调用之前


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-5-2 22:10 被yichen115编辑 ,原因: 试试markdown
收藏
免费 3
支持
分享
最新回复 (5)
雪    币: 23
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
学习了
2020-5-6 06:08
0
雪    币: 656
活跃值: (448)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
3
用的是什么调试工具?
2021-9-30 04:53
0
雪    币: 374
活跃值: (14025)
能力值: ( LV13,RANK:606 )
在线值:
发帖
回帖
粉丝
4
Mx¢Xgt 用的是什么调试工具?
remix,我收藏了一个中文版:http://remix.hubwiz.com
2021-9-30 14:39
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
请问如何进入区块链安全这个方向
2022-2-12 22:25
0
雪    币: 374
活跃值: (14025)
能力值: ( LV13,RANK:606 )
在线值:
发帖
回帖
粉丝
6
你好,抱歉我给不了你建议,我也没有深入学习,只是之前看了本《智能合约-安全分析和审计指南》留下了些学习笔记
2022-2-14 11:34
0
游客
登录 | 注册 方可回帖
返回
//