智能合约编程/Dapp漏洞 -- 交易授权/Tx.Origin Authentication

solidity tx.origin和msg.sender那些事儿 tx.origin与msg.sender是solidity中容易令人迷惑的两个变量,尤其是当我们直接调用合约时两者的值是相同的。为了更清晰的说明两者的关系我们需要构造合约间的链式调用,来观察两者值的变化。 阅读详情

Solidity有一个全局变量tx.origin, 它回溯整个调用栈返回最初的,真正发起调用/交易的账户地址。在智能合约里使用这个变量做用户验证的话,就会留下一个受钓鱼攻击的漏洞。可以看这个Stack Exchange问答: Peter Venesses’s Blog and Solidity — Tx.Origin attacks(https://medium.com/coinmonks/solidity-tx-origin-attacks-58211ad95514)。

攻击原理

如果一个合约使用tx.origin来授权相应的操作的话,钓鱼攻击会引诱用户在有漏洞的合约上执行一些需要授权的操作。

看看下面简单的合约

 contract Phishable {
  address public owner;
  
  constructor (address _owner) {
     owner = _owner; 
  }
  
  function () public payable {} // collect ether
  function withdrawAll(address _recipient) public {
     require(tx.origin == owner);
     _recipient.transfer(this.balance); 
  }
 }
 

注意合约里在函数withdrawAll()在require语句里使用了tx.origin。 下面是一个攻击者创建的合约

 import "Phishable.sol";
 contract AttackContract { 
  
  Phishable phishableContract; 
  address attacker; // The attackers address to receive funds.
  constructor (Phishable _phishableContract, address _attackerAddress) { 
     phishableContract = _phishableContract; 
     attacker = _attackerAddress;
  }
  
  function () { 
     phishableContract.withdrawAll(attacker); 
  }
 }
 

攻击者会部署上面这个攻击者合约,同时说服受攻击合约拥有者送给攻击者合约一些ether。然后攻击者可以把这个合约假装成共同的私有地址,然后引诱受害者发送ether到这个攻击者合约。受害者,除非很小心,大都不会注意到在攻击者合约地址里的代码,或者攻击者可以发送一个多签的钱包或者其他高级存储的钱包。

如果受害者成功发送了一个交易给攻击者合约,这将触发Fallback函数执行。在fallback函数里将调用被钓鱼/被攻击合约里的withdrawAll()函数。这将导致从被钓鱼合约里的所有资金被提取到了攻击者的地址。这是因为,发起这个调用的最初的调用者是受害者合约地址(这里是受攻击的合约地址)因而,tx.origin等于所有者,在被钓鱼合约的第11行上的require语句就会不起作用,然withdrawAll()函数得以继续执行。

防护技术

在智能合约的鉴权机制中不应使用tx.origin。不是说绝对不能用tx.origin变量。该变量还是有合理的使用场景的。比如, 如果想要控制外部合约调用本合约,可以使用require(tx.origin == msg.sender). 这个语句防止一些中间的合约来调用本合约,限制本合约仅可供常用的codeless地址访问。

我们通常使用tx.origin来区分调用者是一个账户而不是一个合约。

if(msg.sender == tx.origin)

如果调用者是一个账户,上面的条件永远是True。如果是合约账户,则条件就为False.

USDT/DAPP授权原理/USDT接口实现 USDT/DAPP授权原理/USDT接口实现功能实现页面 阅读详情

相关推荐

智能合约模板(交易者授权即可获得持币者的转账权限)

智能合约交易可以用来执行转账或其他金融交易,这些交易是在特定条件触发时自动执行的。你可以在智能合约中编写一个条件,当授权给你的交易者给你的地址转账时,就会触发这个条件。如果你想授权其他交易者获得转账权限,可以调用 authorize 函数。需要注意的是,只有当前的授权交易者才能授权其他交易者。它需要一个地址参数 _trader,表示新的授权交易者的地址。如果你是授权交易者,就可以调用 transfer 函数进行转账。需要注意的是,只有授权交易者才能转账。在创建合约时,当前交易者会成为授权交易者。

HongYingClub-优快云 1906

1.7 什么是授权的DApp

到目前为止,我们学习了完全开放的免权限DApp,即任何人都不需要建立身份就可以参与。另一方面,授权的DApp并不对所有人开放。授权的DApp继承了免权限DApp的全部属性,但需要权限才能参与到网络中去。各种授权的DApp用到的权限系统不同。要加入一个授权的Dapp就需要权限,免权限DApp的共识协议可能在授权的DApp中并不好用,因此授权的Dapp与免权限Dapp的共识协议是不同的。授权的DA...

1239

【信息科学与工程学】【安全领域】第二百零五篇 漏洞治理 01

形式:RabbitMQ管理插件SSRF CVE-2026-57211(CVSSv4 8.3,Windows多插件可诱发SMB NTLM泄露)、管理API资源无限CWE-770 CVSSv4 5.3、管理UI存储XSS CVE-2026-57214/其他;用法:GET /cgi-bin/.%2e/%2e%2e/etc/passwd→读密文/源码→RCE。定量:CVSS 9.0;例:Spectre CVE-2017-5753、Meltdown CVE-2017-5754(CPU越界/未授权内核读);

weixin_49199313的博客 107

智能合约中授权与转账的分离可行性分析

本文档旨在探讨智能合约中授权与转账操作为何通常被设计为分离的步骤,以及在授权与转账之后,是否能够立即进行连续的代币转移。我们将从安全性、效率、灵活性和操作流程的角度分析这些问题。智能合约设计中,授权与转账的分离是为了增强安全性和灵活性,而连续转账的可行性取决于合约逻辑、权限设置和网络状况。理解这些原则对于构建安全、高效和用户友好的区块链应用至关重要。

以择人之心择己,以恕己之心恕人。 5086

新手如何学习车载底层嵌入式软件开发(AutoSar)

汽车嵌入式开发

ACarSoft的博客 4221

头歌OpenGauss数据库 - 单表查询 答案

本关任务:用SELECT语句检索数据表中指定字段的数据;用SELECT语句检索数据表中所有字段的数据。为了完成本关任务,你需要掌握: 1.如何获取数据表中指定字段的数据;2.如何获取数据表中的所有数据。

d214493517的博客 5720

solidity 合约权限授权_以太坊智能合约课3 - 水清鱼

第03课-部署智能合约第03课--部署智能合约1.部署到TruffleTruffle中文文档地址:https://learnblockchain.cn/docs/truffle/index.html1.安装 Truffle:2.新建项目文件夹mkdir myProject cd myProject truffle init3.安装Openzeppelinnpm install @ope...

weixin_39609071的博客 563

BERTopic模型入门教程(附代码+参数调节)

BERTopic 是一种用于从文本数据中提取主题模型的新型方法。通过结合 BERT嵌入和传统的主题模型来生成语义丰富的主题。传统的主题模型(如LDA)主要依赖于词频矩阵,而 BERTopic 通过预训练语言模型生成高维语义嵌入来捕捉词语间的复杂关系,因此可以更好地处理上下文信息。BERTopic模型可以看作是创建其主题表示的一系列步骤。核心原理如下:就本质而言,BERTopic就是一个拼装框架,可以把每部分都替换成其他模型,只要完成任务即可。

m0_52069102的博客 1万+

tx.origin 与 msg.sender

web3/solidity 游戏,在第 4 级上,我浪费了几分钟来了解 tx.origin 和 msg.sender 之间的区别,它们在solidity 中构建全局变量。您可能会注意到,账户地址和智能合约地址都可以是 msg.sender 但 tx.origin 将始终是账户/钱包地址。,tx.origin 保存交易发送者的地址,msg.sender 保存消息发送者的地址。指调用智能合约函数的账户地址,只有账户地址可以是tx.origin。最近损失了 800 万美元,是的,由于。一张图片胜过千言万语。

qq_42200107的博客 3585

MinIO vs 华为云OBS:成本、性能与兼容性深度对比(含实测数据)

本文深度对比了开源对象存储MinIO与华为云OBS在成本、性能、兼容性及运维方面的核心差异。通过实测数据与全生命周期成本分析,为技术决策者提供选型依据。文章指出,MinIO在长期成本控制、性能深度优化及S3 API兼容性方面优势显著,而华为云OBS则提供开箱即用的便利性。

kmeans3miner的博客 593

伺服电机三环控制实战:从参数整定到系统优化

本文以实战视角,深入解析伺服电机三环控制(位置环、速度环、电流环)的参数整定与系统优化全流程。文章摒弃复杂理论,通过生动的比喻和分步调试指南,详细阐述了从电流环快速响应、速度环平滑调节到位置环精准定位的调试方法,并提供了常见问题排查与进阶优化技巧,帮助工程师有效提升伺服系统性能与稳定性。

weixin_29201933的博客 244

solidity 合约权限授权_智能合约的调配模式:如何让你的智能合约安全协作?

由于所有已部署合约都有 24KB 的硬限制,所以除了少数极其简单的应用程序外,其他所有的 Ethereum 应用都是由多个智能合约组成的。如何才能确保各智能合约间的安全协作呢?在将代码分解为多个可操作的合约后,我们便会发现有的合约中的函数需要通过另一个合约才能进行调用。例如,在 Uniswap v2 中,只有合约工厂(contract factory)可以对 Uniswap Pair 进行初始化。...

weixin_39586335的博客 909

深入解析ffmpeg编码错误:avcodec_send_frame()返回-22的排查与修复

本文深入解析FFmpeg编码中avcodec_send_frame()返回-22(AVERROR(EINVAL))错误的根本原因与系统排查方法。核心问题通常在于编码器未正确打开或上下文传递错误。文章提供了从检查编码器查找、确认avcodec_open2()调用,到验证上下文传递的完整修复指南,并附有可运行的代码示例,帮助开发者快速定位并解决这一常见编码障碍。

weixin_28049429的博客 390

EOS dApp 漏洞盘点-EOSDice弱随机数漏洞二

Written by WeaponX@零时科技 本文所有过程均在本地测试节点完成 文章用到的所有代码均在 https://github.com/NoneAge/EOS_dApp_Security_Incident_Analysis 0x00 背景 零时科技监测到,EOSDice在2018年11月10日受到黑客攻击,根据EOSDice官方通告,此次攻击共被盗4,633 EOS,约合 2.51 万美元...

m0_37598434的博客 472

Unity GameObject 核心机制深度解析:从底层结构到工程实践

从底层机制讲透 Unity GameObject:托管壳加原生芯的双层对象模型如何制造假 null 陷阱、Transform 层级与组件通信的原理、生命周期回调的确切顺序。文章同时给出 Instantiate 成本分析与对象池等高频场景的工程实践。

游戏人生 40

使用Clumsy和Process Explorer定位软件高CPU占用问题

使用弱网模拟工具Clumsy和进程查看工具Process Explorer定位软件高CPU占用问题。

dvlinker的技术专栏 5708

Solidity - 安全 - tx.origin

在官网中对tx.origin有一段描述:Never use tx.origin for authorization.(永远不要使用tx.origin 做身份认证),即类似验证语句如 require(tx.origin == owner); 举2个例子说明一下,同时也提出了一个问题。

ling1998的博客 754

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

理解Solidity 中的 tx.origin 和 msg.sender

开发者需要了解在Solidity中tx.origin和msg.sender的区别。这两个全局变量经常被混淆,尽管它们之间有着根本的不同。虽然乍一看它们可能相似,但在交易的上下文中,tx.origin和msg.sender代表不同的地址。在这篇博客文章中,我们将深入探讨这些变量的含义。

Spade_sec的博客 1614

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

智能合约漏洞——通过tx.origin授权(Authorization Through tx.origin)

tx.origin(原始交易发起者的外部地址)是一个全局变量,它返回发送交易的地址。重要的是千万不要使用tx.origin,因为另一个合约会使用fallback函数来调用你的合约并获得授权,授权地址存储在tx.origin中。如果有人现在欺骗你向TxAttackWallet合约地址发送ETH,攻击者可以检查tx.origin找到发送交易的地址来窃取你的资金。上述我们可以看出TxUserWallet通过tx.origin授权了transferTO()。

peijiapao的博客 365

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

智能合约Solidity入门精讲(转行区块链必修课)

市面上很多智能合约的教程多是参考国外教程或官方文档,第一不太符合国人学习习惯,第二缺乏足够的系统性。讲师结合多年区块链行业授课经验,整理了智能合约开发相关知识点,用目前较新的0.6.x编译器版本对智能合约开发进行详细介绍。课程分为5个部分:1. 开发环境准备与Geth基本使用;2. Solidity基础语法;3. 智能合约经典案例;4. ERC合约标准介绍;5. 智能合约升级探讨。讲师授课经验丰富,代码驱动能力强。智能合约是区块链应用开发最为关键的一环,想要转行区块链开发的同学建议学习本课程!

solidity中tx.origin是一个全局变量,返回发送交易的账户地址。

solidity中tx.origin是一个全局变量,返回发送交易的账户地址。

wuygh的博客 487

Solidity智能合约:msg.owner,msg.sender,tx.origin

Difference between msg.owner and msg.sender?     当部署合约时,msg.sender是合约的所有者,如果合约中定义了一个名为“owner”的变量,则可以为其分配值(地址)msg.sender。                                                               address owner =...

Messi-Q Blog 1万+

Solidity&Foundry 安全审计测试 tx.origin 漏洞

在 Attack.attack() 中,它要求将 Alice 钱包中的所有资金转移到 Eve 的地址。由于 Wallet.transfer() 中的 tx.origin 等于 Alice 的地址、就授权了转账。钱包是一个简单的合约,只有所有者才能将以太币转移到另一个地址。由于tx.origin可能存在安全隐患,因此建议始终使用msg.sender进行授权或检查调用智能合约的地址。指调用智能合约功能的账户地址,只有账户地址可以是tx.origin。指直接调用智能合约功能的帐户或智能合约的地址。

The future is already here it's just not evenly distributed。 884

【solidity必知】常见的address(this),tx.origin 和 msg.sender 语句解释

address(this):当前合约的地址tx.origin:合约调用源地址msg.sender:合约的调用者。

sinat_33255495的博客 723

区块链安全—简单函数的危险漏洞(二)

一、前言 上回文章中我们提到了简单函数的漏洞利用情况。我们对Fallback()这个回调函数进行了安全漏洞的分析,也针对竞赛题目复现了一些漏洞利用过程。 在本篇文章中,我们继续对简单函数进行安全机制分析。本文我们将要对构造函数以及tx.orgin、msg.sender进行安全分析。在真实的合约开发中,上述这几个函数的使用频率是十分高的,而对于合约来讲,由于其面向对象的特性所迫,所以在编写合约的...

Fly_鹏程万里 814
上一篇: Java 获取各时区时间,获取当前时间到格林威治时间1970年01月01日00时00分00秒的秒数
下一篇: Remix本地环境搭建
sooxin
博客等级 码龄20年 19粉丝 139原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值