去中心化金融(DeFi)作为区块链生态当红项目形态,其安全尤为重要。从去年至今,发生了几十起安全事件。
BlockSec作为长期关注DeFi安全的研究团队(https://blocksecteam.com),独立发现了多起DeFi安全事件,研究成果发布在顶级安全会议中(包括USENIXSecurity,CCS和Blackhat)。在接下来的一段时间里,我们将系统性分析DeFi安全事件,剖析安全事件背后的根本原因
往期回顾:(1)我为自己代言:ChainSwap攻击事件分析(2)倾囊相送:Sushiswap手续费被盗
0xffffffff.前言
北京时间2020年11月12日夜晚。DeFi聚合器Akropolis遭受攻击,黑客通过Flashloan+重入的攻击方式,盗取了存储在Akropolis中价格超过2,000,000美元的数字资产。本文将以一笔攻击交易为例,深度解读此次攻击的原理。
时间:Nov-12-202012:04:02PM+UTC#11242695
阅读建议:
如果您刚刚接触DeFi(Ethereum),可以从头看器,但是文章比较长,看不下去记得点个关注再走。
如果您对Akropolis等DeFi聚合器项目比较了解,可以直接从「0x2攻击分析」开始。
0x0.背景介绍
三星与Roblox合作推出元宇宙制造收集游戏Space Tycoon:7月12日消息,据三星官方报道,该公司推出一款面向 Z 世代的元宇宙游戏 Space Tycoon,玩法是在虚拟世界里收集虚拟主题配件和虚拟电子产品。玩家们可以在虚拟世界里的矿区采集原材料,然后在实验室区域将之组合起来打造成品。涵盖了手机、电视、手表等小工具。此外,Space Tycoon 游戏支持韩语、英语、汉语和西班牙语等 14 种语言,还有大量附加功能,可以进行交互、参加虚拟派对等等。
据悉,这并不是三星与 Roblox 的首次合作,今年早些时候双方曾携手举办了一场 Superstar Galaxy / Charli XCX 虚拟音乐会。[2022/7/12 2:08:11]
2020年可谓是去中心化金融的元年。随着DeFi生态的不断发展,越来越多的DeFi项目上线以太坊。普通用户可以选择自己喜欢的DeFi项目进行投资以获得收益。但是随着DeFi市场的急剧扩张,普通用户面临的一个问题就是在众多DeFi项目中如何选择投资的目标,他们需要有人来帮助他们来进行投资。在这种情况下,一系列资产托管平台、投资组合平台应需而生。Akropolis就是众多资产托管平台中的一个:
普通用户将个人的数字资产投入到Akropolis中,由Akropolis确定投资方向,优化投资策略。Akropolis获得投资收益之后,将收益按比例分配给投资Akropolis的普通用户。以现实中的金融活动举例子,Akropolis就像是基金,其所投资的DeFi项目就是股票,基民购买基金,基金持有股票,获得收益后将收益分配给基民。
去中心化RPC服务基础设施BlockPI启动测试网,已与Klaytn集成:6月10日消息,去中心化 RPC 服务基础设施 BlockPI 启动测试网,并与 Klaytn 集成。Klaytn 终端节点可以运行 BlockPI HyperNode 应用以加入 BlockPI RPC 网络并在不增加成本的情况下获得更多收入。此外, BlockPI 主网上线后,Klaytn 项目将能够免费试用其企业级服务。
此前报道,BlockPI 于今年 1 月宣布完成 300 万美元种子轮融资,投资方包括 NGC Ventures、Hashkey Capital 等。[2022/6/10 4:16:31]
0x1.Akropolis机制
为了便于理解,我们首先简要地介绍一下和此次攻击相关的两个实体合约:Protocolcontract和Akropoliscontract
Protocol:Protocol可以简单地理解为:用户将手中的token投资到Protocol中,获得Protocol的份额,等到将来Protocol中的资产升值了,那么用户便可以从Protocol获取到一定的收益
Akropolis:之前我们讲过,由于ETH上的DeFi项目太多了,如果用户要投资多个项目,要么不知如何抉择,要么操作难度比较大,所以Akropolis扮演了一个投资聚合器的角色:Akropolis绑定了多个DeFi投资项目,用户可以很方便地通过Akropolis使用手里的token进行投资:用户只需要简单的调用Akropolis的函数,指定想要投资的protocol,那么Akropolis就会去帮你在不同的protocol中完成投资。
Block.one宣布34家加密项目获“EOS VC Grants”计划资金支持:金色财经报道,区块链软件发行商Block.one宣布向34个加密项目提供资金支持,以推动全球加密创业发展,并促进使用EOSIO协议的开源社区增长。Block.one于2019年12月推出EOS VC拨款项目,旨在为EOSIO生态系统发展做出贡献创新产品和服务开发者提供5万美元的资金支持,许多有前途的加密项目将使用或支持EOSIO协议,将其从构想转变为创新。据金色财经了解,本次获得资金支持的共有34个加密项目,比如:AnyLog 、BREACH、Custos、Digital Oracles、EcoMatcher等。[2020/5/28]
总体的交互逻辑如图所示:
Akropolis提供了两个外部接口:functiondeposit(address_protocol,addressmemory_tokens,uint256memory_dnAmounts)和functionwithdraw(address_protocol,addresstoken,uint256dnAmount,uint256maxNAmount)
Akropolis.depositfucntion:deposit函数的功能是:
用户调用deposit。
Akropolis先计算Protocol中有多少的token:nBalanceBefore。
Blockstack成立非营利性机构以去中心化其网络:金色财经报道,Blockstack成立非营利性机构Stacks基金会,负责监督其区块链的发展,以去中心化其网络。Stacks基金会执行董事Brittany Laughlin表示,基金会的作用是协调社区改善工作,其首要任务之一是建立一个独立的技术咨询委员会,以权衡未来的建议并帮助确定该网络的未来。[2020/5/22]
Akropolis将用户的token转入到Protocol中。
Akropolis再计算protocol中token的数量:nBalanceAfter。
得到用户投资的数量:nDeposit=nBalanceAfter-nBalanceBefore。
通过用户投资的数量计算得到用户投资份额。
Akropolis.depositToProtocol函数:
Akropolis.distributeYieldInternal函数和Akropolis.updateProtocolBalance函数:
动态 | Blockport与Bitfinex联手 将存款限额提高到每位用户5万欧元:据Ambcrypto报道,总部位于阿姆斯特丹的数字货币交易所Blockport在其官方博客中宣布,Bitfinex将成为其第二个外部交易平台,并将存款限额将从每月每位用户2500欧元(约2834美元)提高到每位用户5万欧元(约56677美元)。[2018/8/15]
Protocol.normalizedBalance函数:
注意,Protocol.normalizedBalance中的_registeredTokens=。deposit函数中使用到的distributeYieldInternal函数和updateprotocolBalance函数的功能都是查询当前Protocol函数中所有代币的余额,注意这里面normalizedBalance的意思是对余额归一化处理。
用户可以调用deposit函数,通过指定Protocol和token以及token的amount,将一定数量的代币存入到和Akropolis中,Akropolis根据用户存入的代币数量给用户返还Akropolis的LPToken。随后使用用户投资的token投入到Protocol中。
withdrawfucntion:
用户通过调用withdraw函数,取出之前通过deposit函数存入的token,获取利息。
0x2.攻击原理
我们注意到,在Akropolis.deposit函数中,要先计算beforeBalance,然后调用token的transferFrom函数,将token转到Protocol中,最后计算afterbalance,正常逻辑下这种计算方式是正确的,但是如果攻击者提供的token地址是一个恶意地址,那么在这种情况下,实际有效的token并没有转到Protocol账户中,并且Akropolis.deposit没有防止重入的机制。这样就使得攻击者可以利用1.token地址未经校验,2.deposit函数没有放重入机制来对Akropolis进行攻击。攻击流程图如下:
STEP1:
攻击者首先调用Akropolis.deposit函数,传递的token地址参数是一个恶意合约地址。函数内部首先计算balanceBefore1,然后由于攻击者传递进来的token合约地址是攻击者伪造的faketoken,所以Akropolis紧接着调用了fakeToken.transferFrom函数。
STEP2:
在fakeToken.transferFrom函数中,该合约再次调用Akropolis.deposit,传递的token地址就是真实的DAI的地址,所以在第二次调用deposit的逻辑是一个正常逻辑:攻击者存入一笔DAI,然后Akropolis根据balanceAfter2-balanceBefore2为攻击者mint出对应的LPtoken。注意:这里面balanceBefore2=balanceBefore1。
STEP3:
在step2结束后,交易控制流返回到第一次的deposit之中,注意:这时候Akropolis计算了balanceAfter1并且balanceAfter1=balanceAfter2,然后根据step1中的balanceBefore1计算出balance之差,再一次给攻击者mint出LPtokens。
虽然在整个交易中攻击者只给Protocol传进去一笔约$25k的DAI,但是由于重入的机制,导致的第二次deposit之后balanceBefore1没有及时更新,使得Akropolis在函数控制流返回到第一次deposit函数中的时候以为攻击者又给Protocol转移了$25k的DAI。从而给用户再一次mint出对应的LPtokens。
Others
总体而言,攻击者通过重入+构造恶意token合约的方式,在仅仅花费$25kDAI的情况下使得Akropolis以为攻击者存入了$50kDAI,最后取出这50kDAI,完成攻击,获利25kDAI。
Step3中我们提到了其实balanceAfter2比balanceAfter1小1,这个原因是在deposit的后续操作中会将用户传递进来的token注入到Curve的池子之中,而Curve的合约中会检查Curve之中Token的余额变化,如果说池子的余额没有变化,那么Curve就会执行revert。所在faketoken的transferFrom函数中一定要往protocol之中转一笔钱,不过数量不限。
可以看出在faketoken的transferFrom函数中攻击者向Protocol转了1个DAI。
0x3.总结
由于Akropolis并没有对用户传递进来的token参数进行校验,加上deposit函数没有防重入,导致攻击者利用伪造的tokencontract重入deposit函数,从而达到偷天换日,鱼目混珠,使用少量的DAI换出大量的DAI的效果。
BlockSec团队以核心安全技术驱动,长期关注DeFi安全、数字货币反和基于隐私计算的数字资产存管,为DApp项目方提供合约安全和数字资产安全服务。团队发表20多篇顶级安全学术论文(CCS,USENIXSecurity,S&P),合伙人获得AMiner全球最具影响力的安全和隐私学者称号(2011-2020排名全球第六).研究成果获得中央电视台、新华社和海外媒体的报道。独立发现数十个DeFi安全漏洞和威胁,获得2019年美国美国国立卫生研究院隐私计算比赛(SGX赛道)全球第一名。团队以技术驱动,秉持开放共赢理念,与社区伙伴携手共建安全DeFi生态。
https://www.blocksecteam.com/
contact@blocksecteam.com
撰文:诗文仔细观察你周边的环境、你使用的物品、你的穿着以及交流时使用的文字,其实都是不同的符号在流动.
1900/1/1 0:00:00加入PolkaWorld社区,共建Web3.0! Statemint/Statemine是波卡/Kusama生态的公共利益平行链,用于创建和管理资产,包括同质化资产和NFT.
1900/1/1 0:00:00过去,我们曾讨论过“分散自治组织”(DAO)的区块链概念如何适用于想要制作东西的人群。我们称这种理论格式为“创作者DAO”.
1900/1/1 0:00:00最近NFT又火了。上周日,名为EtherRocks的单个NFT最高成交价高达45ETH(价值超10万美元).
1900/1/1 0:00:00在昨晚的众议院金融服务委员会中,美联储主席鲍威尔发表了相关讲话,这个讲话被市场解读为利好,但整个过程中也不是单向的利好,还是有模棱两可的地方.
1900/1/1 0:00:00一:元宇宙的概念元宇宙被定义为“一个集体虚拟共享空间,由虚拟增强的物理现实和物理持久的虚拟空间融合而创造,包括所有虚拟世界、增强现实和互联网的总和.
1900/1/1 0:00:00