木星链 木星链
Ctrl+D收藏木星链
首页 > DYDX > 正文

EFI:DeFi浪潮下的“狠角色”DEX够安全吗?

作者:

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

如今,随着人们对 DeFi 的兴趣日益浓厚,DEX(即去中心化交易所)风靡一时。它们解决了常见的 CEX (即中心化交易所)问题,那我们也会问,DEX够安全吗?

在上一篇说明了代币本身的安全问题后(纯干货分享(一) | DEFI安全问题之基础篇),现在来聊聊DEX在兑换代币时可能产生的安全问题。目前DEX主要面临的安全问题大致可分成两类:

(1)DEX项目本身存在的安全问题。

(2)作为第三方协议,与其他DEFI项目交互时产生的安全问题。

本文将对第一类安全问题进行介绍。

重入漏洞

重入漏洞在上一篇我们也提到过,它属于需要防范的经典漏洞。与普通代币的重入相比,Uniswap的重入漏洞的主要表现形式为:攻击者在一笔兑换交易中利用Uniswap未及时更新价格前发起二次兑换,由于此时Uniswap未更新价格,使得二次兑换可兑出的代币数量比正常兑换的多。此外,在Uniswap的重入攻击中,攻击者利用单笔交易可能只能获得微小的收益,因此攻击者往往倾向于使用闪电贷或者循环套利扩大战果。

以imBTC攻击事件为例,该事件是由于Uniswap V1在调用ERC777系列代币时,未充分考虑合约回调的情况。

具体表现为:攻击者使用imBTC代币兑换ETH时(如图1),合约先通过self.getInputPrice函数计算正确的ETH数额并将ETH发送到目标地址,然后调用self.token.transferFrom函数时,会调用imBTC合约的_callTokensToSend函数(如图2),而_callTokensToSend函数会调用用户指定存储imBTC代币的合约。因此,如果攻击者部署存储合约,并改写其中TokensToSend函数,那么当兑换代币时,pair(两种代币组成的交易对)合约调用攻击者部署的存储合约,就可以回调pair进行二次兑换,而二次兑换时pair合约账本还未更新,使得计算的ETH数额比正常兑换要多,以此来获利。

DeFi TVL已缩水超1200亿美元,较2021年11月峰值下跌75%:金色财经报道,据区块链分析公司Glassnode数据显示,随着加密货币市场走低,锁定在DeFi的总价值已大幅下降。在2021年11月的市场达到1600亿美元的峰值后,DeFi总锁仓TVL已经下降了超过1203亿美元(跌幅达75%),也造成DeFi抵押品价值下降到397亿美元,回到了2021年2月的水平。此外,从2020年7月到2021年5月,DeFi协议占据了所有gas fee消费的25%至30%,但目前已下降到只有14%。[2022/12/17 21:50:58]

图1?Uniswap的tokenToEthInput函数

图2 imBTC的transferFrom函数

图3 imBTC的__callTokensToSend函数

详细攻击流程如下:

Coinbase正考虑在其平台上支持第三方DeFi应用程序:金色财经报道,Coinbase首席财务官Alesia Haas周一在花旗举办的以金融科技为重点的活动中透露,Coinbase正考虑在其平台上支持第三方DeFi应用程序。根据Haas的说法,Coinbase的目标是成为“通往DeFi的桥梁”。最终,该公司认为其“可以通过使DeFi易于使用来为DeFi带来数十亿用户”。[2021/11/16 6:54:11]

图4 ETH-imBTC事件流程图

那么,为什么在第二次调用tokenToEthSwapInput函数兑换代币时,发送的ETH会比正常兑换要多呢?我们可以用公式来还原可兑换代币数量的代码逻辑:

首先,正常兑换下,getInputPrice函数计算可兑换的ETH数量为:

且正常第二次可兑换的ETH数量为:

但重入后第二次可兑换的ETH数量为:

由此可知,在重入后第二次兑换中只有ETH的储备量减少,而imBTC储备量未增加。这样在分母不增加的情况下,导致了等量的imBTC可以兑换更多的ETH。

欧易OKEx DeFi播报:DeFi总市值846.90亿美元,欧易OKEx平台ANT涨幅最大:据欧易OKEx统计,DeFi项目当前总市值为846.90亿美元,总锁仓量为1014.10亿美元;行情方面,今日DeFi代币普涨;欧易OKEx平台DeFi币种涨幅前三位分别是ANT、KNC、JST;截至18:30,OKEx平台热门DeFi币种如下。[2021/5/7 21:34:39]

针对此类安全问题,成都链安建议:

当合约涉及到资产转移时,使用“检查-生效-交互”模式来处理逻辑,对关键的业务操作可以使用OpenZeppelin官方的ReentrancyGuard进行修饰。

swap函数未对K值进行校验

Uniswap的核心是常量乘积模型K=x*y,其中的K值是该pair合约持有代币数量的乘积,且要求之后的每一笔交易完成后K值必须增加(考虑手续费)。因此如果不进行K值校验,将很容易成为攻击点。

图5 Uniswap的价格波动

以Impossible Finance事件为例,该项目是Uniswap的仿盘,实现了两种兑换代币的函数:cheapSwap和swap。其中cheapSwap函数少了k值校验(如图6),但是项目方知道缺少K值校验的后果,专门为cheapSwap函数增加了onlyIFRouter做修饰,来限制cheapSwap函数只能被指定的Router合约调用。

当前以太坊 DeFi 协议中总锁仓量突破90亿美元:金色财经报道,DeBank数据显示,以太坊 DeFi 协议总锁仓量突破90亿美元大关,达92.24亿美元,具体来看,Aave以15亿美元排在首位、Maker锁定资产总价值14亿美元暂居第二、Curve锁定资产总价值为13亿美元位居第三。Synthetix、yearn分别以9.45亿美元和8.53亿美元位居第四、第五名。

注:总锁仓量(TVL)是衡量一个DeFi项目使用规模时最重要的指标,通过计算所有锁定在该项目智能合约中的ETH及各类ERC-20代币的总价值(美元)之和而得到。[2020/8/29]

图6?合约未检查k值的cheapSwap函数

正常情况下,当用户使用Router合约兑换代币时,首先会使用getAmountsOut函数来计算正确的代币数量amounts;然后调用safeTransferFrom将用户的兑换消耗代币转入目标pair合约;最后,通过内部调用_swap函数来执行cheapSwap函数将兑换代币转至目标地址。

图7?Router01合约的swapExactTokensForTokens函数

但是,由于cheapSwap函数缺少了K值检验,如果攻击者部署恶意代币合约,在Router合约调用safeTransferFrom函数时,回调正常的pair合约进行同种兑换,由于,回调后的兑换使用的amounts仍是未更新之前的数据,已不符合改变账本状态之后的校验,那么攻击会导致以错误的价格兑换出目标代币,以此获利。

分析 | DeFi周报:DeFi项目锁仓价值11.3亿美元,过去一周环比增加9.63%:据DAppTotal.com DeFi专题页面数据显示:截至目前,已统计的32个DeFi项目共计锁仓资金达11.3亿美元,其中EOSREX锁仓3.52亿美元,占比31.08%,排名第一位;Maker锁仓3.13亿美元,占比27.66%,排名第二位;排名第三位的是Edgeware锁仓1.52亿美元,占比13.48%;Compound,Synthetix、dYdX、Nuo等其他DeFi类应用共占比27.78%。截至目前,ETH锁仓总量达327.81万个,占ETH市场总流通量的3.03%,EOS锁仓总量达1.1亿个,占EOS市场总流通量的10.64%。整体而言:1、过去一周,DAI的市场总流通量平均为8,627万美元,目前在DeFi借贷市场未偿还资产中,DAI占比84%;2、受行情波动的影响,DeFi项目整体锁仓价值较上周环比增长9.63%。[2019/10/28]

图8?合约进行k值校验的Swap函数

该事件的具体攻击步骤如下:

1. 在准备阶段攻击者部署了AAA代币合约,并使用闪电贷借来1000WBNB,兑换65140个项目方的IF代币。

2. 使用其中一半的IF代币(32570个)与攻击者自己部署的AAA代币构建IF-AAA交易池。

3. 执行AAA-IF-BUSD路径的代币兑换,且当Router合约调用AAA代币合约的transferFrom函数时会执行攻击者的恶意代码,重入至IF-BUSD的pair合约,并将另一半IF代币正常兑换出221897个BUSD。

4. 回归到AAA-IF-BUSD路径的兑换,将之前计算的amounts值传入_Swap函数中执行这笔兑换,用一半的IF又兑换了2521897个BUSBD。

5. 归还闪电贷,完成攻击。

图9?事件流程图

在关键的兑换函数中必须做k值校验,不要为了节省gas和代码量就将K值校验和安全验证依赖外部验证,做到自身功能完善。

Decentralized Exchange

通缩代币未设置pair为分红例外

通缩代币在交易时会产生额外的分红与手续费。如果交易合约中包含了此类代币,且没有进行特殊处理,那么,就可能导致交易对合约记录的代币储量与实际的代币可用余额不一致。

以XSquid事件为例,XSquid是一种通缩代币,未将其与WHT代币组成的pair合约地址添加奖励例外列表,造成了pair合约除了正常代币兑换和流动性存储外,还存有多余的XSquid分红奖励代币。因此,攻击者就可以调用Swap函数将pair合约多余的XSquid代币转换为WHT提取(如图11),或者通过skim函数将多余的XSquid代币直接提取(如图12)。

图10?XSquid交易对合约未添加奖励例外

图11?Swap函数可以兑换多余的WHT代币

图12?skim函数可以提取大于reserve的部分

DEX在添加通缩分红型代币时多注意手续费以及分红的处理情况。在创建通缩分红型代币交易对时,可以添加奖励例外来避免此类代币的分红问题。

此外,以下两类不属于DEX本身的安全问题,但是被项目方借助了DEX的特性实施,所以将其写在文章末尾。

交易池?

这类问题主要是指项目方在自己发行的代币里留有后门,创建与主流代币的交易池,诱使投资者使用手里存在价值的代币买入项目方代币,并且不断拉盘对投资者进行投资。

以下面的TRTC项目方为例,项目方创建了ETH-TRTC的交易池。但是在TRTC的代币合约对transferFrom函数做了相关限制,要求代币的转出方为owner(管理员)或者为Uniswap。因此对于投资者,仅可以通过Uniswap买入TRTC代币,而不能卖出TRTC代币。最后由项目方把投资者投入的ETH提走跑路,给投资者带来了巨大的损失。

图13?TRTC合约的transfer函数

图14?TRTC合约的ensure修饰

图15?TRTC合约的transferFrom函数

项目方Rug Pull?

Rug Pull是指项目方卷走投资者资金跑路的行为,目前已成为DeFi生态系统的最大局类型,项目方刻意制造代币价格暴涨的假象、许诺为提供流动性的投资者提供高回报等方式来大量聚集资金,一旦时机成熟就移除池子里的流动性或将代币卷走。这样的例子在DeFi屡见不鲜,AnubisDAO、Meerkat Finance、TurtleDEX、Squid token鱿鱼币等都是在卷款跑路之后,注销网站和社交媒体销声匿迹,导致投资者承担了巨大的损失。

?写在最后?

成都链安建议项目方使用锁仓和多重签名来控制代币流动性,避免出现砸盘跑路的情况。投资者不要被天上掉馅饼的事情冲昏头脑,防范虚假宣传。

标签:EFIDEFIDEFSWAPDEFI S价格XDEFI币Defend Animals FoundationEDDASwap

DYDX热门资讯
元宇宙:元宇宙究竟是“未来”还是“局”?

2021年,“元宇宙”火了。“风口”之下,处于争议旋涡之中的元宇宙在追捧者看来有着不可限量的未来,而在质疑者眼中却是难以预测的陷阱.

1900/1/1 0:00:00
区块链:中国飞机制造“试水”区块链技术:优化供应链

2月26日2022上海区块链创新策源工作推进会暨重大成果发布会在沪举行中新网上海2月26日电 (记者 郑莹莹)中国工程院院士、中国商用飞机有限责任公司(简称:中国商飞)首席科学家吴光辉26日在沪.

1900/1/1 0:00:00
元宇宙:为什么说NFT是元宇宙的入场门票?它能给元宇宙带来什么?

今年,在多地的人大上已经有多位人大代表提出了与元宇宙有关的建议,布局和规划元宇宙发展,推动元宇宙、区块链等与实体经济融合,助力建设数字经济发展,多个地方政府更是已经把元宇宙写入发展规划里.

1900/1/1 0:00:00
FIL:前FB工程师:为什么离开Facebook 拥抱Web3社交?

一场新的创意潜力的复兴正在酝酿之中——我看到了Web3的潜力,它能带来一种新的、由社区驱动的产品研发方法。它引入了新的工具和商业模式,将从根本上改变产品的构建方式.

1900/1/1 0:00:00
ADA:Michael Clare:ADAMoracle创建DataFi是出于生态发展的长远考虑

在加密货币市场,连续数月的波动使很多代币受到价格回调的影响纷纷跌落,而从目前ADAM的行情走势上看,二级市场并没有明显的抛盘,即使处在回调行情中,ADAM依旧能够保持稳步上涨.

1900/1/1 0:00:00
SHI:真假虚拟货币交易平台傻傻分不清楚:都违法

基金、盲盒、超前点播、网红雪糕、直播打赏、玲娜贝儿......这些被网友戏称为2021年十大“肉疼”的剁手项目,你都做过哪些?不过网警蜀黍发现,还有一种让你“肉疼”的东西.

1900/1/1 0:00:00