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

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{}}

币安基金会:ETHW拥有更好的流通性:据币安基金会消息,ETHW拥有更好的流通性,ETHW通证权益更受投资者青睐。[2022/10/1 18:36:34]

局分析

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

MoneyMaker合约代表A合约;

Vault合约代表B合约;

Hack合约代表C合约。

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

MoneyMaker->Vault。

而实际的调用路径为:

MoneyMaker->Hack。

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

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

Blockchain.com iOS 用户可以免费注册.blockchain域名:8月30日消息,Blockchain.com iOS 用户可以免费注册.blockchain域名,该功能由NFT域名提供商Unstoppable Domains提供。Unstoppable Domains表示之后将支持 Android 用户及网页端用户。[2022/8/31 12:58:48]

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;

上市矿企Hut 8第二季度亏损扩大至6900万美元:8月11日消息,上市矿企Hut 8今年第二季度亏损8810万加元(6900万美元),去年同一季度,Hut 8录得400万加元的亏损,而上一季度录得5570万加元的利润。Hut 8在周四的财报中表示,本季度的亏损是由其数字资产的价值重估造成的。

此外,由于电力成本上涨和比特币价格下跌,该公司的挖矿利润与第一季度相比减少了一半以上,至1490万加元。该矿工挖矿每个比特币的成本增长了44%,达到25,900加元,大约是2021年第二季度的水平。

Hut 8本季度总收入为4380万加元,与上一季度相比下降22%,但同比增长三分之一。在本季度挖矿了946个比特币,与今年第一季度挖矿的942个相比几乎没有变化。Hut 8的比特币持有量在本季度增长了14.6%至7,406,与前三个月的增长步伐保持一致。(CoinDesk)[2022/8/11 12:19:07]

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

过去1小时内,6笔大额转账将超9万枚ETH转入FTX:6月11日消息,Whale Alert数据显示,在过去1小时内,6笔大额转账将90493 ETH转入FTX,转入额分别为14374 ETH、9000 ETH、10559 ETH、14769 ETH、22314 ETH、19477 ETH。[2022/6/12 4:19:24]

咋回事呢?其实这个局非常简单但是很常见。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

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

地球链

币赢OIN:长推:七个工具简便你的加密生活

如果你不知道自己需要做什么,身处加密世界可能真的很浪费时间。这是我每天使用的7种工具,可让您的生活更简便CoinGeckoCoingecko是市场上最大的加密数据库.

[0:15ms0-1:644ms