Solidity攻击合约:重入攻击与危害分析

        以太坊智能合约开发中,重入攻击是一种常见的安全漏洞。这种攻击通常发生在合约的递归调用中,攻击者通过构造恶意交易,使得原本合约在执行过程中不断调用自身或其他合约,从而耗尽合约的Gas(交易费用),或者导致意外的状态改变。

目录

一、原本合约示例

假设我们有一个简单的“代币合约”(TokenContract),它允许用户之间进行代币的转账。

代码如下:

二、攻击合约示例

攻击者可以创建一个攻击合约(AttackContract)。

利用重入攻击来耗尽原本合约的Gas或执行意外的操作。下面是一个简单的攻击合约示例:

三、危害及攻击实现

这会导致两个主要问题:

攻击实现:攻击者会按照以下步骤执行攻击:

总结



一、原本合约示例

  • 假设我们有一个简单的“代币合约”(TokenContract),它允许用户之间进行代币的转账。
  • 代码如下:
// SPDX-License-Identifier: MIT  
pragma solidity ^0.8.0;  contract TokenContract {  mapping(address => uint256) public balances;  uint256 public totalSupply;  constructor() {  totalSupply = 1000000;  balances[msg.sender] = totalSupply;  }  function transfer(address _to, uint256 _value) public returns (bool) {  require(balances[msg.sender] >= _value, "Insufficient balance");  require(_to != address(0), "Cannot transfer to the zero address");  balances[msg.sender] -= _value;  balances[_to] += _value;  emit Transfer(msg.sender, _to, _value);  return true;  }  event Transfer(address indexed from, address indexed to, uint256 value);  
}

  • 在这个合约中,transfer函数允许用户将一定数量的代币转移给另一个地址。转移之前,它会检查发送者的余额是否足够,并防止向零地址转账。

二、攻击合约示例

  • 攻击者可以创建一个攻击合约(AttackContract)。
  • 利用重入攻击来耗尽原本合约的Gas或执行意外的操作。下面是一个简单的攻击合约示例:
// SPDX-License-Identifier: MIT  
pragma solidity ^0.8.0;  contract AttackContract {  address public targetToken;  uint256 public attackValue;  constructor(address _targetToken) {  targetToken = _targetToken;  }  fallback() external payable {  TokenContract(targetToken).transfer(address(this), attackValue);  }  
}

  •         在这个攻击合约中,fallback函数是合约的一个特殊函数,当合约收到不匹配的函数调用或Ether时会被调用
  • 攻击者可以通过构造一个交易,向攻击合约发送资金,并触发fallback函数
  • fallback函数中,攻击合约会调用原本合约transfer函数,将代币转回攻击合约自身。


三、危害及攻击实现

  • 危害重入攻击的危害在于,攻击者可以构造一个递归调用的链,使得原本合约在处理转账时不断调用攻击合约的fallback函数,进而不断调用原本合约的transfer函数。
这会导致两个主要问题:
  • Gas耗尽:由于每次调用都会消耗一定的Gas,递归调用会导致Gas迅速耗尽,使得原本合约无法完成其他操作或导致交易失败。
  • 状态改变:如果原本合约中存在其他与转账相关的逻辑(转账前的权限检查、转账后的回调函数等),重入攻击可能导致这些逻辑被意外触发多次,从而导致意外的状态改变。

攻击实现:攻击者会按照以下步骤执行攻击:

  • 部署原本合约(TokenContract)。
  • 部署攻击合约(AttackContract),并将原本合约的地址作为参数传递给攻击合约的构造函数。
  • 构造一个交易,向攻击合约发送指定数量的Ether,触发其fallback函数
  • fallback函数会调用原本合约的transfer函数,尝试将代币转移回攻击合约自身。
  • 由于transfer函数的调用触发了攻击合约的fallback函数,这会导致递归调用。
  • 递归调用会持续进行,直到Gas耗尽或达到以太坊区块链的调用深度限制,导致原本合约无法继续执行其他操作。

总结

        本文通过一个简单的Solidity合约示例,展示了重入攻击合约的实现及其对原本合约的危害。这个例子再次强调了智能合约安全性的重要性,开发者需要仔细审查合约代码,确保没有可能导致递归调用的逻辑漏洞。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/732608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle LeetCode 高频 SQL 50 题(进阶版)

https://leetcode.cn/studyplan/sql-premium-50/ 一、查询 1821. 寻找今年具有正收入的客户 selectcustomer_id from Customers where year 2021 group by customer_id having sum(revenue) > 0183. 从不订购的客户 select c.name as Customers from Customers c left j…

【蓝牙协议栈】【经典蓝牙】【BLE蓝牙】蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM)

目录 1. 蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM) 1.1 主机控制接口协议 HCI 1.2 逻辑链路控制与适配协议 L2CAP 1.3 服务发现协议SDP 1.4 串口仿真协议 RFCOMM 1. 蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM) 1.1 主机控制接口协…

七、软考-系统架构设计师笔记-数据库设计基础知识

1、数据库基础概念 数据库基本概念 数据(Data)数据库(Database)数据库管理系统(DBMS)数据库系统(DBS) 1.数据(Data) 是数据库中存储的基本对象,是描述事物的符号记录。 数据的种类: 文本、图形、图像、音频、视频等。 2.数据库(Database, DB) 数据库…

基于机器学习的网络入侵检测与特征选择及随机森林分类器性能评估(NSL-KDD数据集)

简介 本文将详细介绍如何利用Python和相关机器学习库对NSL-KDD数据集进行预处理,特征选择,并通过随机森林算法构建网络入侵检测模型。同时,还将展示如何计算并可视化模型的ROC曲线以评估其性能。 首先,我们导入了必要的库&#…

Unity 让角色动起来(动画控制器)

下载素材: 导入后,找到预制体和动画。 新建动画控制器,拖动到预制体的新版动画组件上。 建立动画关系 创建脚本,挂载到预制体上。 using System.Collections; using System.Collections.Generic; using UnityEngine;public c…

Swift SwiftUI 学习笔记 2024

Swift SwiftUI 学习笔记 2024 一、资源 视频资源 StanfordUnivercity 公开课 2023: https://cs193p.sites.stanford.edu/2023 教程 Swift 初识:基础语法:https://docs.swift.org/swift-book/documentation/the-swift-programming-language/guidedtour/…

工地安全反光衣穿戴监测报警摄像机

工地安全反光衣穿戴监测报警摄像机是为了提高工地施工人员的安全意识和监管效率而设计的。这种设备结合了反光衣、监测系统和报警摄像机的功能,可以有效减少工地事故的发生。 首先,工地安全反光衣是一种具有高度可见度的服装,能够使穿戴者在夜…

程序如何知道mqtt设备是否在线

在做物联网设备的时候经常会碰到设备的在线与掉线 问题:emqx如何来实现这个在线与掉线 实现:添加一个规则,程序监控这个规则 1、SELECT * FROM "$events/client_connected", "$events/client_disconnected" 2、添加一…

离散数学——(4)

目录 1.主析取范式 2.大项 3.主合区范式 4.范式的求法 真值表法 5.推理理论 直接证法 1.主析取范式 2.大项 3.主合区范式 4.范式的求法 真值表法 5.推理理论 直接证法

【C++】手把手教你模拟实现 vector

目录 一、构造/析构/拷贝 1、构造函数 1️⃣无参的构造函数 2️⃣带参的构造函数 3️⃣类模板的构造函数 2、析构函数 3、拷贝构造 二、修改操作 1、reserve 【错误版本】 🌟【解答】正确版本 2、resize 3、push_back 4、pop_back 5、insert 6、era…

pytorch(六、七)多维特征数据的输入、加载数据集的类

文章目录 多维特征数据的输入代码 加载数据集概念np.loadtxt()读取数据dataloadertorchvision获取数据集代码 三种梯度下降批量梯度下降BGD随机梯度下降SGD小批量随机梯度下降MBGD代码 多维特征数据的输入 对于一个多维数据,其行表示一个样本,列表示样本…

基于Java的社区买菜系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 数据中心模块2.1.2 菜品分类模块2.1.3 菜品档案模块2.1.4 菜品订单模块2.1.5 菜品收藏模块2.1.6 收货地址模块 2.2 可行性分析2.3 用例分析2.4 实体类设计2.4.1 菜品分类模块2.4.2 菜品档案模块2.4.3…

Linux内存映射

目录 背景 一、什么是内存映射? 二、mman函数 1.权限问题 2.总线错误 3.内存权限 4.读文件内容 5.映射与文件 6.非法参数错误 7.偏移量大小 8.映射内存大小 8.1 申请6k,访问5k 8.2 申请2k,访问3k 8.3 返回值检查 三、内存映射实现 四…

SSH移植到BusyBox

手动编译SSH安装挺麻烦的,本文主要是我大量借鉴和实践总结出来的流程,一步一按照做不会有太大问题。 移植平台:IMX6UL(迅为开发板) 根文件系统:BusyBox 所有操作都建议不要在root账户下运行,并且make install的安装路…

【Python】专栏文章索引

为了方便 快速定位 和 便于文章间的相互引用等 作为一个快速准确的导航工具 Python 目录: (一)装饰器函数 (二)牛客网—软件开发-Python专项练习 (三)装饰器函数 (四&#xff0…

【深度学习】自动求导中有时为什么要先sum()再backward()

创作日志: 在看李沐学深度学习,“深度学习中,我们的目的不是计算微分矩阵,而是批量中每个样本单独计算的偏导数之和”,对这句话一知半解,自己动手推导一下。 一、理解 在深度学习中,被求导的对…

CSS的盒子模型:掌握网页设计的基石!

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Linux的进程调度实现

经常被问到进程的调度算法有哪些,什么先进先出、短进程优先、时间片轮转、多级反馈多列等等算法能说一大堆?那具体的,linux内核使用了什么样的算法,且来探究一下。 本文所引用源码基于linux内核2.6.34版本。 目录 调度器类 从 s…

探索 PostgreSQL 的高级数据类型 - 第 1 部分

数组和枚举 PostgreSQL 因其可扩展性和多功能性而备受欢迎,除了传统的整数和字符串之外,它还提供了多种数据类型。其中,包括数组和枚举,其为开发者提供了高级的数据建模能力。本文中,我们将深入研究这些复杂的数据类型…

Unity中PICO实现 隔空取物 和 接触抓取物体

文章目录 前言一、隔空取物1、XR Grab Interactable2、调节扔出去时的相关系数3、用手柄射线指向需要抓取的物体后,按下侧边扳机键即可抓取 二、接触抓取物体1、替换手柄上抓取物体的脚本2、在手柄上添加 接触抓取物体的脚本3、在手柄上添加碰撞盒触发器4、在需要抓…