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

By:小白

背景概述

上期我们了解了利用tx

functionmakeMoney(addressrecipient)publicpayable{require(msg

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

modifierOnlyMaker(){require(msg

modifierOnlyOwner(){require(msg

游戏协议Aavegotchi投票决定是否关闭为GHST铸造和销毁提供流动性的智能合约:金色财经报道,加密收藏品游戏 Aavegotchi 的社区成员正在投票决定是否结束其原生 GHST 代币为期大约两年半的合同销售,投票将决定是否关闭为GHST 的铸造和销毁提供流动性的智能合约,GHST是生态系统的基础货币和治理代币,市值超过7660 万美元,总供应量为5460 万。如果这次投票通过,第二次链上投票将决定是否让 Aavegotchi DAO 花费滞留在该智能合约中的 DAI。如果投票通过,用于在合约中铸造 GHST 的3300 万美元 DAI 代币可以用于开发游戏协议的生态系统。

目前,Aavagotchi 社区成员几乎一致支持投票,大约有 480 万个 GHST,即总供应量的 8.8% 投了赞成票。[2023/3/10 12:53:03]

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

MakerDAO声明:无法控制Oasis,Jump反向攻击黑客不涉及其智能合约:2月25日消息,因Jump Crypto与Oasis联合通过逆向攻击追回12万枚ETH的Wormhole被盗资金,MakerDAO发推特声明,鉴于最近有关 Maker Vault 30100和Oasis前端的交易,需要解释 MakerDAO、Maker 协议和第三方前端提供商之间的区别。MakerDAO 无法控制任何使终端用户能够访问 Maker Vaults 的前端提供商或产品。

此外,连接到 Maker 协议的可用前端都不是由 MakerDAO 开发或维护的Maker 协议是一个去中心化的智能合约系统,公开部署在以太坊上,允许任何供应商以无许可和去中心化的方式连接其用户界面解决方案。这些用户界面提供商可以控制他们部署的智能合约,使终端用户能够与 Maker 协议进行交互。最近更改 Maker Vault 30100 所有权的交易不涉及任何 MakerDAO 的官方智能合约或 MakerDAO 指令。其重申 MakerDAO 的智能合约不受 Oasis 前端智能合约的控制或控制。[2023/2/26 12:29:44]

functionwithrow()publicOnlyOwner{(boolsuccess,)=owner

声音 | BM:EOSIO已经支持在个人帐户中运行代码的智能合约:今日早些时候,加密社区成员在推特上讨论在ETH上构建DApp无法同时进行多个操作的问题。BM则表示:EOSIO已经支持了在个人帐户中运行代码的智能合约,以及将多个操作绑定到一个交易中,即使这些操作是需要多个帐户授权的。 (MEET.ONE)[2020/1/14]

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

田纳西州紧随佛罗里达州和内布拉斯加州 或将在法律层面承认区块链签名与智能合约:1月10日田纳西州州议员杰森·鲍威尔(Jason Powell)向田纳西众议院提交一项新法案,该法案将承认区块链签名是合法的电子记录,回应了在佛罗里达州和内布拉斯加州提交的类似法案。与其他的法案一样,该法案澄清了在满足特定条件的情况下触发的智能合约或自行执行的协议在田纳西州也将具有法律效力。与交易有关的任何合同都不应仅仅因为合同中含智能合约的条款而被剥夺法律效力,有效性或可执行性。[2018/1/13]

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

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

局分析

可以看到,上述代码中存在三个合约,我们先结合前置知识中的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

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

金宝趣谈

[0:0ms0-6:124ms