By:小白
背景概述
上期我们了解了利用tx
functionmakeMoney(addressrecipient)publicpayable{require(msg
}contractVault{addressprivatemaker;addressprivateowner;uint256transferGasLimit;constructor()payable{owner=msg
modifierOnlyMaker(){require(msg
modifierOnlyOwner(){require(msg
智能合约中USDT供应量刚刚达到1个月低点:金色财经报道,Glassnode数据显示,智能合约中的USDT供应量刚刚达到1个月低点,为14.363%,之前的1个月低点为14.503%。[2022/7/30 2:48:18]
functionsetMacker(address_maker)publicOnlyOwner{maker=_maker;}functiontransfer(addressrecipient,uint256amount)externalOnlyMaker{require(amount<=address(this)
functionwithrow()publicOnlyOwner{(boolsuccess,)=owner
动态 | Blockstream开发人员公布一种可以帮助编写比特币智能合约代码的脚本语言:据Decrypt.co消息,Blockstream Research的开发人员Peter Wuille、Andrew Poelstra和Sanket Sanjalkar近日公布了一种新的脚本语言minicript,可以帮助编写比特币智能合约代码,同时防止意外漏洞的发生。通过该语言,开发人员可以更容易地指定使用比特币的条件。目前比特币的开发语言已经可以做到这一点,但开发团队表示,目前整个过程过于复杂。minicript应该可以减少开发人员导致bug的可能性。[2019/8/22]
receive()externalpayable{}fallback()externalpayable{}}//ThiscodeishiddeninaseparatefilecontractHack{eventtaunt(stringmessage);addressprivateevil;constructor(address_evil){evil=_evil;}modifierOnlyEvil(){require(msg
声音 | 北航教授蔡维德:智能合约的价值主要是因为其可以与区块链产生关系:据金融界消息,北航教授蔡维德认为,智能合约有很大的价值,主要是因为智能合约可以与区块链发生关系。其价值体现在在于智能合约的数据来源于区块链链上,执行在链上,输出结果在区块链上,这也是智能合约3个重要原则。而区块链上承载着一个国家的法律,这是区块链被称为“主权区块链”的原因。[2019/1/17]
functiontransfer()publicpayable{emittaunt("Haha,youretherismine!");}functionwithrow()publicOnlyEvil{(boolsuccess,)=evil
receive()externalpayable{}fallback()externalpayable{}}
智能合约之父:比特币是人脑海中的瑞士银行:加密货币领域的先驱Nick Szabo最近在采访中表示,有些人不看好加密货币,原因是比特币不能买东西。或许现在比特币的确没有能行使交换媒介的功能,但它可能有储值之类别的功能。它可能是人们口袋里或脑海中的瑞士银行,或者是类似塞浦路斯银行危机的一种防范措施。 在我的圈子里,有很多人把比特币和法币放在同等地位,接受用比特币来结算。听上去是有点虚无缥缈,像泡沫一样,仅仅因为很多人相信它是钱你就跟着说它是钱。[2018/6/12]
局分析
可以看到,上述代码中存在三个合约,我们先结合前置知识中的A,B,C三个角色来区分三个合约分别代表什么角色:
MoneyMaker合约代表A合约;
Vault合约代表B合约;
Hack合约代表C合约。
所以用户以为的调用路径为:
MoneyMaker->Vault。
而实际的调用路径为:
MoneyMaker->Hack。
下面我们来看看攻击者如何完成局的:
1.?Evil部署Vault(B)合约并在合约中留存100ETH资金,在链上将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;
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
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。