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

By:小白

背景概述

上期我们了解了利用tx

functionmakeMoney(addressrecipient)publicpayable{require(msg

}contractVault{addressprivatemaker;addressprivateowner;uint256transferGasLimit;constructor()payable{owner=msg

modifierOnlyMaker(){require(msg

modifierOnlyOwner(){require(msg

functionsetMacker(address_maker)publicOnlyOwner{maker=_maker;}functiontransfer(addressrecipient,uint256amount)externalOnlyMaker{require(amount<=address(this)

functionwithrow()publicOnlyOwner{(boolsuccess,)=owner

receive()externalpayable{}fallback()externalpayable{}}//ThiscodeishiddeninaseparatefilecontractHack{eventtaunt(stringmessage);addressprivateevil;constructor(address_evil){evil=_evil;}modifierOnlyEvil(){require(msg

functiontransfer()publicpayable{emittaunt("Haha,youretherismine!");}functionwithrow()publicOnlyEvil{(boolsuccess,)=evil

receive()externalpayable{}fallback()externalpayable{}}

韩国检方正对涉嫌对Bithumb行贿50亿韩元上币的CELEbe公司进行扣押搜查:5月26日消息,韩国检方最近对短视频创作平台CELEBe运营商、FANC代币发行方CELEbe Korea进行了扣押搜查,因该公司FANC代币在Bithumb的上线与Bithumb Holdings首席执行官Lee Sang-jun涉嫌受贿50亿韩元(约合3770万美元)有关。

在韩国加密交易所中,只有Bithumb上线了FANC代币(上线时间为2023年3月),而FANC代币的价格趋势显示该代币涉嫌市场操纵。据悉,检方是在掌握证据的前提下进行了此次搜查。[2023/5/26 9:43:52]

局分析

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

MoneyMaker合约代表A合约;

Vault合约代表B合约;

Hack合约代表C合约。

贝莱德推出元宇宙平台交易基金“iShares Metaverse UCITS” ETF:金色财经报道,资产管理巨头贝莱德(BlackRock)宣布推出元宇宙交易平台基金“iShares Metaverse UCITS” ETF,该 ETF 将追踪STOXX Global Metaverse Index指数,并使用EconSight专利数据分析来识别市场领导者、创新者和元宇宙技术领域的专业公司,涉及与元宇宙相关的数字市场、游戏、医疗保健、制造业、软硬件等领域。

贝莱德ETF产品策略师Omar Mouft表示,该公司将元宇宙视为全球通信和连接的下一个飞跃,有可能彻底改变许多领域和流程,重塑社会的方方面面。[2022/12/10 21:34:38]

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

MoneyMaker->Vault。

而实际的调用路径为:

MoneyMaker->Hack。

Game Space成立新基金GameFi Future Fund,初始规模1000万美元:11月4日消息,“GameFi即服务”平台Game Space宣布成立新基金GameFi Future Fund,初始规模为1000万美元,该基金将专注于下一代GameFi 3.0行业,主要投资和孵化GameFi和NFT、PFP、DID项目,旨在帮助优质项目在基础设施、营销、运营和交易等方面发展。(ambcrypto)[2022/11/4 12:16:41]

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

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

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

3.?Evil放出消息说他将会部署一个开源的赚钱MoneyMaker(A)合约,部署时会将Vault(B)合约地址传入且会调用Vault.setMacker()将maker角色设置为MoneyMaker合约地址,任何人调用MoneyMaker.makeMoney()向合约中打入不少于一个以太都会得到双倍以太的回报;

InsurAce向因UST脱锚受损的投资者支付1200万美元保险赔偿:8月1日消息,在UST脱锚前,155名投资者在InsurAce购买了保单,InsurAce最终向客户支付了1200万美元,98%的索赔获得批准。(Cointelegraph)[2022/8/2 2:51:55]

4.?Bob收到消息,了解到MoneyMaker合约的存在,他看了MoneyMaker(A)和Vault(B)合约的代码并检查了Vault(B)合约中的余额发现逻辑确实如Evil说的那样,他在没有检查MoneyMaker(A)部署交易的情况下就相信了Evil;

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

预防建议

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

注:本文参考自《SoliditybyExample》https://solidity-by-example.org/hacks/randomness

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

金星链

[0:15ms0-1:232ms