当前位置:网站首页>智能合约安全——重入漏洞
智能合约安全——重入漏洞
2022-07-29 18:07:00 【fingernft】
重入漏洞相信大家都有所耳闻,那么什么是重入漏洞呢?
众所周知,以太坊的转账不仅可以在钱包地址之间进行,合约与钱包地址之间、合约与合约之间也可以,而合约在接收到转账的时候会触发 fallback 函数执行相应的逻辑,这是一种隐藏的外部调用。攻击者就会利用这一点,在合约的fallback 函数中写入恶意逻辑重新进入到被攻击的合约内部,让被攻击的合约执行非预期的外部调用,从而到达获取不正当利益的目的。
漏洞示例
下面我们来看一个比较典型的有重入漏洞的代码:

漏洞分析
上面的代码就是个普通的充提币的合约,那么怎么对其发起重入攻击呢?我们来看这个合约的 withdraw 函数,这个函数中的转账操作有一个外部调用“msg.sender.call{value: bal}”,所以我们就可以认为这个合约是可能有重入漏洞的,让我们来进一步分析看看:
在 withdraw 函数中是先执行外部调用进行转账后才将账户余额清零的,那么就可以在转账外部调用的时候构造一个恶意的逻辑合约在合约执行 balance[msg.sender]=0之前一直循环调用 withdraw 函数一直提币从而将合约账户清空。
攻击合约
下面我们看看攻击者编写的攻击合约中的攻击手法是否与我们的漏洞分析相同:

我们看到 EtherStore 合约是一个充提合约,我们可以在其中充值和提现。攻击者先调用合约中的攻击函数先向EtherStore中充值1ether,在EtherStore中他的账户余额就为1ether,那么他就可以提现这些余额。紧接着,withdraw 函数发起提现,当EtherStore向攻击合约转账完成时,攻击合约就会调用fallback函数,再次请求提现余额,如此循环就能将EtherStore中的余额提现到不足1ether,才结束这个循环。
攻击函数调用流程图:

修复建议
看了上面的攻击手法相信大家对重入漏洞都会有一个自己的认知了,但是我们的应该怎么避免重入漏洞防御重入攻击呢?以下是我给大家的建议:
1.写代码时需要遵循先判断,后写入变量在进行外部调用的编码规范(Checks-Effects-Interactions)。
2.加入防重入锁。
下面是一个防重入锁的代码示例:

3.记住所有涉及到外部合约调用的代码位置都是不安全的。
那么智能合约中的重入攻击就讲解完了,如果想了解更多的区块链知识,或是有什么疑问,可以到区块链交流社区CHAINPIP来,一起学习和交流。
边栏推荐
猜你喜欢

【码蹄集新手村600题】pow()函数详解

【历史上的今天】7 月 29 日:Win10 七周年;微软和雅虎的搜索协议;微软发行 NT 4.0

软考高级软件架构风格定义以及分类

一次挖矿程序的清理(回忆版)

Word Embedding与Word2Vec学习

有效供应链管理的八大绩效分析指标(下)
![[Code Hoof Set Novice Village 600 Questions] Given an integer n, find all the values of x and y in floor(n/x)=y](/img/c4/7cf18fca07c8d6550cadea2c3c9db4.png)
[Code Hoof Set Novice Village 600 Questions] Given an integer n, find all the values of x and y in floor(n/x)=y
![[STM32CubeMX] STM32H743 configuration IAP upgrade](/img/4b/2445d6c9dd16d45c1ac7adddbf0ae6.png)
[STM32CubeMX] STM32H743 configuration IAP upgrade

LL(1),LR(0),SLR(1),LALR(1),LR(1)对比与分析

字节跳动 Flink 单点恢复功能及 Regional CheckPoint 优化实践
随机推荐
160亿美元!传微软计划收购全球最大语音识别公司
实时数仓:知乎实时数仓的架构演进
请问一下,我这个调度任务显示执行成功,但是并没有成功,我这个任务是odps sql ins
五种常见IO模型
机器学习:知道模型评估中的SSE、“肘”部法、SC系数和CH系数的实现原理
A redis tool class to solve cache breakdown, cache penetration
字节跳动基于 Iceberg 的海量特征存储实践
Dialogue with Academician Yu Fei of the Canadian Academy of Engineering: Looking for "Shannon's Theorem" in the field of AI
滚动条样式
【考研英语词汇训练营】Day 16 —— bankrupt,remain,regulate,construct,reflect
【历史上的今天】7 月 29 日:Win10 七周年;微软和雅虎的搜索协议;微软发行 NT 4.0
U盘拔出时总是提示有程序正在使用?
Zadig 环境负载均衡:0 人工干预,极速部署
【QT】Qt获取前几天/后几天的时间
【英语考研词汇训练营】Day 17 —— espresso,ultimate,gradually,detect,dimension
xatlas源码解析(七)
ng组件注册及使用
go的堆内存结构分析
【学习笔记】NOIP模拟赛
【码蹄集新手村600题】pow()函数详解