当前位置:网站首页>tx.origin安全问题总结
tx.origin安全问题总结
2022-07-04 15:21:00 【小驹】
在合约代码中,最常用的是使用msg.sender来检查授权,但有时由于有些程序员不熟悉tx.origin和msg.sender的区别,如果使用了tx.origin可能导致合约的安全问题。黑客最典型的攻击场景是利用tx.origin的代码问题常与钓鱼攻击相结合的组合拳
的方式进行攻击。
tx.origin 是 Solidity 中的一个全局变量,它返回发送交易的账户地址。
通过调用tx.origin来检查授权可能会导致合约受到攻击,因为 tx.origin 返回交易的原始发送者,因为攻击的调用链可能是原始发送者->攻击合约-> 受攻击合约。在受攻击合约中,tx.origin是原始发送者。
前置知识
EOA账户和合约账户
以太坊账户分两种,外部账户(EOA)和合约账户(SCA)。
- 外部账户由一对公私钥进行管理,账户包含着 Ether 的余额。
- 合约账户除了可以含有 Ether 余额外,还拥有一段特定的代码,预先设定代码逻辑在外部账户或其他合约对其合约地址发送消息或发生交易时被调用和处理。
外部账户 EOA
- 由公私钥对控制
- 拥有 ether 余额
- 可以发送交易(transactions)
- 不包含相关执行代码
合约账户
- 拥有 ether 余额
- 含有执行代码
- 代码仅在该合约地址发生交易或者收到其他合约发送的信息时才会被执行
- 拥有自己的独立存储状态,且可以调用其他合约
msg.sender和tx.origin的区别
tx.origin:表示最初的调用者,通常取得的是EOA的地址。
msg.sender:表示最近的调用者,通常取得是的上级调用者的地址,可以是EOA地址,也可以是合约地址。
如果EOA用户A调用合约B,合约B调用合约C。那么
- 在C合约中,msg.sender就是B合约的地址,tx.origin为A地址。
- 在B合约中,msg.sender是A地址,tx.origin也为A地址。
通过判断tx.origin==msg.sender
来确定调用者是合约还是EOA账户。
思考 :可不可以通过判断一个账户的是否包含执行代码来区分这个账户是EOA还是SCA?
不可以。因为一个合约地址的
CODESIZE
是大于零的,但当地址的CODESIZE
等于零时,并不能保证其为非合约,因为合约在构造阶段CODESIZE
也为零。
<aside>
</aside>
漏洞演示
下面的漏洞合约代码,在transfer方法中做了检查,本意是只有owner可以进行transfer操作。在这里使用的是tx.origin==owner
进行检查。我们假设该Wallet合约的部署者是Alice.
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"); }}
黑客(假设Eve为黑客)可以这样进行漏洞利用。
- 黑客编写一个Attack的合约,并进行部署。
- 黑客通过钓鱼等手段诱导Wallet合约的部署者调用Attack合约的attack方法。
- 黑客就窃取到了Wallet合约的ETH。
Attack合约代码
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); }}
在这个过程中,Alice调用了Attack合约的attack方法,attack方法调用了wallet合约的transfer方法,在transfer方法中tx.origin是alice(在transfer方法中tx.sender是attack合约),因为alice就是Wallet合约的owner,因此通过检测,将ETH转给了黑客Eve。
还有个疑问,Alice会傻到去调用Eve的合约吗?
这依靠黑客Eve的钓鱼
的手法,如果像上面的attack方法Alice一般不会上当,但如果方法名假装成免费mint NFT的函数freemint,且代码里调用了其它的大量的正常代码,并且调用了其他的合约C,在C合约里调用wallet.transfer,可能就很难识别出该方法有问题了。而且Alice在正常生活中使用DAPP时(如使用uniswap,stepn等时),后端采用的也是调用合约方法的形式,相比于直接发送虚假链接发送钓鱼邮件类的邮件,Alice对此类钓鱼的警惕性会更低些。
所以,黑客为了钓鱼更易成功
,可以从下面方面进行增强
多个合约连接
。合约A调用合约B,合约B调用合约C,合约C调用合约D,…………,最后合约中调用wallet.transfer。- 黑客的合约可以利用
社会工程学
伪装,利用贪便宜的心理,打低价或者免费mint的旗号,或者高息诱惑的方式等。 - 黑客可以将漏洞利用隐藏在
receive函数
中,通过诱导用户向指定的合约转账内触发漏洞利用。如假装与用户进行换币,给客户很大的折扣诱导等。
安全建议
对本例中,使用msg.sender
代替 tx.origin
。确保调用者就owner。
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");}
参考
SWC-115描述https://swcregistry.io/docs/SWC-115
代码中的tx.origin==msg.sender有什么作用?https://ethereum.stackexchange.com/questions/113962/what-does-msg-sender-tx-origin-actually-do-why
使用tx-origin钓鱼https://solidity-by-example.org/hacks/phishing-with-tx-origin
边栏推荐
- Rebalance operation in spark and its difference from repartition operation
- 中银证券网上开户安全吗?
- 整理混乱的头文件,我用include what you use
- 太方便了,钉钉上就可完成代码发布审批啦!
- 散列表
- Sequence diagram data modeling and industrial chain analysis
- ECCV 2022 released: 1629 papers were selected, and the employment rate was less than 20%
- 跳跃表实例
- Solution du système de gestion de la chaîne d'approvisionnement du parc logistique intelligent
- Detailed process of DC-2 range construction and penetration practice (DC range Series)
猜你喜欢
VMware Tools和open-vm-tools的安装与使用:解决虚拟机不全屏和无法传输文件的问题
新的职业已经出现,怎么能够停滞不前 ,人社部公布建筑新职业
NoSQL之readis配置与优化(终章)
How to decrypt worksheet protection password in Excel file
对人胜率84%,DeepMind AI首次在西洋陆军棋中达到人类专家水平
电子元器件B2B商城系统开发:赋能企业构建进销存标准化流程实例
周大福践行「百周年承诺」,真诚服务推动绿色环保
《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(2)-初识Fiddler让你理性认识一下
科普达人丨一文看懂阿里云的秘密武器“神龙架构”
矿产行业商业供应链协同系统解决方案:构建数智化供应链平台,保障矿产资源安全供应
随机推荐
Integration of ongdb graph database and spark
leetcode:421. 数组中两个数的最大异或值
科普达人丨一文看懂阿里云的秘密武器“神龙架构”
Go language loop statement (under Lesson 10)
MD5加密的两种方式
Solution du système de gestion de la chaîne d'approvisionnement du parc logistique intelligent
Capvision Rongying's prospectus in Hong Kong was "invalid": it was strictly questioned by the CSRC and required supplementary disclosure
程序员怎么才能提高代码编写速度?
Li Kou today's question -1200 Minimum absolute difference
照明行业S2B2B解决方案:高效赋能产业供应链,提升企业经济效益
昆明三环闭合工程将经过这些地方,有在你家附近的吗?
Research Report on market supply and demand and strategy of tetramethylpyrazine industry in China
安信证券排名 网上开户安全吗
Which domestic cloud management platform manufacturer is good in 2022? Why?
Start by counting
周大福践行「百周年承诺」,真诚服务推动绿色环保
DC-2靶场搭建及渗透实战详细过程(DC靶场系列)
PingCode 性能测试之负载测试实践
.Net 应用考虑x64生成
Market trend report, technical innovation and market forecast of tetrabromophthalate (pht4 diol) in China