DEFIRANGER:检测DeFi App上的价格操纵攻击

阅读量    47927 |

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

 

区块链金融衍生品DeFi的快速发展促进了以太坊生态系统的发展。同时,对DeFi应用程序(app)的攻击正在增加。但是,现有的智能合约漏洞检测工具无法直接用于检测DeFi攻击,这是因为他们缺乏恢复和理解高级DeFi语义的能力,例如,用户在去中心化交易所(DEX)中交易Token对X和Y。

这项工作专注于检测DeFi App的两种新型攻击,即直接和间接的价格操纵攻击。前者意味着攻击者通过攻击易受攻击的DeFi App,在同一DEX中执行不需要的交易,从而直接操纵DEX中的Token价格。后者意味着攻击者间接操纵易受攻击的DeFi App(例如借款应用程序)的Token价格。为此,本文提出了一种独立于平台的方式来恢复高级DeFi语义,方法是首先从原始的以太坊交易中构造现金流树,然后将低级语义提升到高级别语义,包括Token交易,流动性采矿(liquidity mining)和流动性取消(liquidity cancel)。最后使用恢复的DeFi语义表达的模式检测价格操纵攻击。

本研究已经实现了一个名为DEFIRANGER的原型,并将其应用于超过3.5亿笔交易。它成功地在野检测了432次真实世界攻击,确认它们属于四个已知的安全事件和五个0-day事件,研究者已经报告了本文发现,并分配了两个CVE。之后本文进一步进行了攻击分析以揭示漏洞的根本原因、攻击足迹以及攻击的影响。

 

0x01 Introduction

随着DeFi生态系统的快速发展,安全问题也不断涌现。目前已报告了很多与DeFi相关的安全性问题,包括前端运行,Pump-and-Dump(P&D)欺诈和Flash Loan攻击。此外,DeFi应用程序中的代码和逻辑漏洞还带来了许多安全事件。

现有的检测工具主要关注代码漏洞,例如重入和整数溢出。但是由于缺乏恢复和理解高级DeFi语义的能力,它们无法直接用于检测由逻辑漏洞引起的DeFi攻击。在DeFi应用程序中,去中心化交易所和借款应用程序是最受欢迎的两种类型。根据统计,在前十个DeFi应用程序中有五个DEX和四个借款应用程序。Automated Market Maker(AMM)是提供加密货币交换服务的最受欢迎的DEX类型。 AMM中的每个池都维护两种或更多种类型的加密货币,并利用价格机制来决定汇率。此外,用户可以通过将抵押品(例如USDC Token)存入借款应用程序来从该应用程序借用加密货币。为了确定用户可以借用多少种加密货币,借出应用程序需要例如从AMM中的池中获取抵押品的当前价格。

观察到随着DEX和借款应用程序的普及,出现了两种类型的新攻击,即直接和间接价格操纵攻击。顾名思义,前者意味着攻击者直接在AMM池中操纵Token价格。通常可以通过攻击易受攻击的DeFi应用程序在同一池中执行不必要的交易来实现。后者意味着攻击者间接操纵易受攻击的DeFi应用程序(例如借款App)的Token价格,其定价机制取决于AMM中实时状态(例如Token的报价和储备)。攻击者可以通过在AMM中进行交易来操纵状态。例如,攻击者可以在AMM池中提高抵押品的价格,该资产在借款之前将价格信息提供给借款应用程序。这样,攻击者可以借用比合法借入者以相同数量的抵押物借入更多的Token。

 

0x02 Background

A.以太坊账户和交易

以太坊有两种类型的账户,即外部拥有账户(EOA)和智能合约账户。交易可用于在账户之间发送以太币或调用智能合约中的API。有两种交易类型,即外部交易和内部交易。外部交易由EOA触发,而内部交易由智能合约触发。具体来说,由EOA发送的外部交易可以调用智能合约内部的功能,这将进一步创建内部交易。内部事务可以采取类似的方式来调用智能合约并触发其他内部事务。在本文的以下内容中,未指定“外部”或“内部”的“交易”的使用意味着将外部交易和已触发的内部交易作为一个整体,如下图所示。

B.以太坊加密货币

以太坊有两种类型的加密货币:以太币和ERC20Token。以太币是以太坊中的本机Token,而ERC20Token是符合ERC20标准的第三方Token。每个帐户,包括EOA和智能合约帐户,都可以拥有Ether和ERC20Token。尽管有许多类型的ERC20Token,但以下两个与本文工作有关。

稳定币:稳定币是保证价格稳定的一类加密货币。通常,稳定币可以直接/间接支持,也可以通过不同的稳定机制进行干预。流行的稳定币包括USDC或USDT。

流动性提供者(LP)Token:DeFi应用程序可以发行LPToken以激励用户提供更多的流动性(即,将加密货币存入该DeFi应用程序)。 提供流动性的用户称为流动性提供者。 流动性提供者可以使用LPToken作为凭证来提取其存款或在那些去中心化交易所中兑换其他加密货币)。

C.DeFi

DeFi应用程序通常由多个智能合约组成,以实现其功能,并在区块链上运行。一些金融服务,例如借款,交易和投资组合管理,已经迁移到DeFi生态系统中。截至撰写本文时,在以太坊上已经部署了200多个DeFi应用程序。
去中心化交易所(DEX).DEX是一种交易所,用户可以通过与智能合约进行交互来以去中心化的方式交易不同的Token。与传统的集中式交换相比,DEX具有几个明显的优势,特别是在隐私和资本管理方面。

DEX中有两种模式,包括预订列表(LOB)和自动做市商(AMM)。使用LOB模式的DEX维护一个链下订单账本以记录用户的出价和要价,即,订单匹配将在链外完成。或者,AMM模式可实现完全分散的交换。做市商可以将两个或多个Token放入具有同等权重或自定义权重的流动性池中。池中加密货币之间的交易率将基于定价机制自动计算。由于其灵活的流动性,AMM成为DEX中最受欢迎的模式。

借款:要借用加密货币,由于以太坊的伪匿名性,要求借方对其他加密货币进行超额抵押以偿还借款。
例如,在MakerDAO中,借入100个DAI要求使用价值150以太网的Token作为抵押。此外,一旦抵押品的价值降至固定阈值以下,就会导致清算(借款应用程序将出售抵押品)以及将适用于借款人的设计罚款。

Flash Loan:一些DeFi应用提供了一种称为Flash Loan的非抵押借款。有效的“大笔借款”通常“无偿地”向用户提供了大量资本,而没有任何抵押。借款的安全性得到保证,因为用户需要在单个交易中进行借款并归还借款(随后进行多个内部交易)。否则,借款交易将由借款提供商还原。快速借款使每个人都可以临时拥有大量Token。但是,它也可以被滥用来发起攻击,并且在野外已经观察到许多此类攻击。

投资组合管理:随着越来越多的DeFi应用程序激励客户提供流动性,另一种称为投资组合管理应用程序的应用程序首次亮相以帮助用户(流动性提供者)投资其加密货币。特别是,他们会自动找到提供最高年收益率(APY)的应用,然后将客户的存款投资到这些应用上。

 

0x03 Price Manipulation Attacks

本文旨在检测两种价格操纵攻击,包括直接和间接攻击。顾名思义,前者意味着攻击者直接在AMM的流动性池中操纵Token价格。通常可以通过攻击易受攻击的DeFi应用程序在同一池中执行不必要的交易来实现。后者意味着攻击者间接操纵易受攻击的DeFi应用的Token价格,该漏洞的定价机制取决于AMM中实时状态,例如Token的报价和储备。攻击者可以通过在AMM中进行交易来操纵状态。在下文首先以Uniswap V1协议为例介绍AMM的价格机制,然后详细介绍这两种类型的攻击。

A.Uniswap协议的价格机制

Uniswap的流动资金池由两种加密货币组成。用户可以按照由Uniswap的定价机制/公式确定的价格来交易Token,如下公式(1)所示:

具体地说,F(x)表示用户可以x的数量与TokenX进行交易的TokenY的数量。 RX和RY分别是TokenX和TokenY在流动资金池中的余额。由于Token对之间的汇率取决于资产池的准备金余额(或准备金),因此有能力耗尽资金池的攻击者可以进行交易以抬高或降低Token的价格,即操纵偏离市场价格的价格。这种行为被称为价格操纵。与受控池进行交互的DeFi应用可能会遭受财务损失。

B.直接价格操纵攻击

某些DeFi应用程序具有在AMM中交易Token的接口。但是,如果接口没有得到适当的保护,则攻击者可以滥用这些接口来代表易受攻击的DeFi应用程序交易Token,这会影响Token对的汇率。然后,攻击者可以用自己的Token进行另一笔交易以获取利润。由于Token价格是通过在AMM中交易Token对来直接操纵的,因此将这种攻击称为直接价格操纵攻击。

上图显示了一个示例。假设池具有与Token对X和Y相同的初始储备金(1,000)。在正常交易中,根据公式(1),用户可以用10 X获得9.9Y。攻击者可以使用以下三个步骤来执行直接价格操纵攻击。

步骤一:价格操纵第一阶段,攻击者使用900 X(占池的大部分)来交换TokenY,这破坏了Token对的余额并提高了TokenY在池中的价格。

步骤二:价格操纵第二阶段,攻击者调用易受攻击的DeFi应用程序的公共界面来出售10X。但是,DeFi应用程序在消耗10 X后只能获得2.75Y。这是因为上一步降低了TokenX的价格。此外,该交易进一步提升了X X的价格。池中TokenY的价格。

步骤三:成本赎回和获利,攻击者通过反向交易出售473 Y,获得905X。那是因为TokenY的价格已在第二步中提高了。这样,攻击者可以获得5倍的利润。

具体来说,第一步是增加TokenY的价格,并降低TokenX在池中的价格。根公式(1),这是预期的行为。但是,第二步使易受攻击的DeFi应用程序出售其TokenX,并进一步提高TokenY的价格。这是通过利用易受攻击的DeFi应用程序的公开接口来实现的。结果,攻击者可以通过出售TokenY进行反向交换,并获得更多的X(本示例中为5)。与正常交易(10 X和9.9 Y)相比,受害者DeFi应用损失了7.15 Y(即7.15 = 9.9 – 2.75)。

C.间接价格操纵攻击

一些DeFi应用需要出于商业目的使用Token价格。例如,需要一个借款应用程序来计算抵押物的价格,以决定借款人有资格借多少枚Token。如果借款应用程序的价格机制是可操纵的,则借款人所借的Token可能会比抵押品的未偿本金余额更多(即抵押不足)。

上图给出了一个例子。借款应用程序使用从AMM中获取的Token对的实时汇率(通过调用AMM的智能合约公开的API)来确定抵押物的价值。假设TokenX和Y之间的初始汇率为1:1。在正常借款情况下,由于借款应用程序的抵押物比率为150%,因此用户将1.5个TokenX存入贷方应用程序作为抵押,并借入1个TokenY。攻击者可以采取以下步骤来发起间接价格操纵攻击。

步骤一:价格操纵,攻击者用大量的TokenY来交换TokenX,耗尽了池中很大一部分的TokenX,从而为TokenX产生了虚高的价格。由于借用应用程序的价格机制取决于AMM的实时报价,TokenX的价格也会在借款应用中被夸大。
步骤二:获利,在操纵了TokenX的价格之后,攻击者只需使用TokenX作为抵押品就可以借入TokenY。特别是,他或她可以以与正常借款情况相同的抵押物(1.5 X)借入2 Y而不是1Y。

步骤三:成本补偿,攻击者只需要通过在AMM池中进行反向交换来赎回价格操纵的成本。这种攻击的根本原因是,脆弱的借款应用利用AMM的实时报价来决定抵押物的价格。结果,攻击者可以在AMM的交易池中进行交易以影响Token价格(步骤I),然后从借款应用借入抵押不足的借款(步骤II)。之后,攻击者进行反向交易以赎回成本(步骤III)。

请注意,简化了这两种攻击的前面的步骤,以更好地说明。在实际攻击中,攻击者可能会利用Flash loan借入第一步所需的大量Token。

 

0x04 Challenges and Solutions

A.挑战

价格操纵攻击源于DeFi应用的逻辑漏洞,这使得执行检测变得不那么容易。即,检测到此类攻击需要分析多个智能合约之间的交易并了解DeFi应用程序的高级语义。

挑战一:复杂的交互, DeFi应用程序往往具有复杂的业务逻辑,并且由多个相互交互的智能合约组成。例如,每笔交易在2019年12月之前触发的智能合约调用的平均数量为1.19。由于DeFi繁荣,从2019年12月到2021年4月,该数字变为2.40。此外,多个智能合约之间与DeFi相关的交易过于复杂,无法通过现有工具进行分析。例如,Harvest Hack事件的一项攻击交易涉及1,316个内部交易。下图显示了内部事务图的一部分。显然,分析智能合约之间的复杂交互是一项挑战。

挑战二:语义鸿沟,在以太坊上观察到的原始交易与DeFi应用程序中定义的DeFi语义之间存在语义鸿沟。如下图所示,地址0x8add7002启动使用Uniswap V2协议交换Token的外部事务。此外部事务进一步触发11个内部事务。在以太坊上只能观察这些(外部或内部)交易的字段值,例如from,to和input。但是无法确定使用Uniswap V2协议在USDC-Ether池中,地址0x8add7002用0.5.ether交换861.95 USDC的高级DeFi操作。这种高级DeFi语义对于检测价格操纵攻击至关重要,因为它们通常涉及Token交易。

B.本文解决方案

本文工作采用以下方法来应对这两个挑战。

方法一:修剪不必要的事务,观察表明,并非所有与DeFi相关的交易触发的内部交易都有助于分析。这样可以通过修剪那些不必要的挑战来解决第一个挑战。

例如,上图中的事务触发11个内部事务。其中只有三个与Token交易密切相关。其余的用于辅助操作,例如查找合适的池并检查Token余额。此外,观察到Token转移(包括Token铸造和刻录)是DeFi生态系统中的原始动作。因此通过删除与Token转移无关的交易来简化DeFi相关交易中的交互。

方法二:恢复高级语义,从原始事务中恢复高级DeFi语义,以解决第二个挑战。即使Etherscan在其网站上提供了恢复的DeFi语义,信息也不完整。 实验结果表明,Etherscan在识别DeFi动作时具有较高的误报率。本文工作采用与平台无关的方式来恢复DeFi操作。将其命名为语义提升,因为它可以将原始事务中的低级语义提升为高级DeFi语义。

 

0x05 Methodology

下图显示了工作概述。特别是,首先提出一个称为DEFIRANGER的工具来检测价格操纵攻击。然后针对检测到的攻击,从多个角度进行进一步分析,例如了解漏洞的根本原因以及对易受攻击的DeFi应用程序的影响。将在本节中详细介绍DEFIRANGER.

A.概述

DEFIRANGER首先收集原始的以太坊交易,然后构造现金流量树。之后,它恢复DeFi语义,然后使用通过DeFi动作表达的预定义模式来检测价格操纵攻击。

B.数据收集

尽管包括Google的BigQuery以太坊服务在内的一些在线服务提供了查询交易的接口,但它们不足以支持对DEFIRANGER的分析。例如,执行智能合约时EVM的内部状态不可用。为了满足需求,部署了一个带有修改过的Geth客户端的以太坊完整节点,以收集所需的数据。首先,收集内部事务的元数据,包括from,to和input等。第二,在执行每个内部事务时收集EVM深度。这有助于恢复多个智能合约中不同功能的调用顺序。第三,收集内部事务和事件之间的执行顺序。这可以帮助检索Token转移的顺序。

C.CFT构造

收集以太坊原始交易后,系统将构建现金流量树(简称CFT)。 CFT用于将原始交易转换为Token转移,这为提升DeFi语义奠定了基础。为了更好的理解,以下图为例来说明整个过程,树内有三种类型的节点。

•事务节点:树中同时包含外部和内部事务。两个(外部或内部)事务之间的有向边意味着子事务是由父事务创建的。例如,外部事务⓪创建内部事务①。因此,图中有一个从⓪到①的有向边。

•事件节点:事件是由智能合约在执行期间出于记录目的发出的。智能合约可以有选择地发出事件。在图中,事件是内部事务的子节点,因为事件的发出是由内部事务初始化的,以执行智能合约。

•转移节点:转移节点表示存在由外部(或内部)交易启动的Ether或ERC20Token转移。

建立树形结构:第一步是从原始交易(包括内部交易和外部交易)构建一棵树。这个过程很简单。如果子事务是从父节点创建的,则仅需要将子节点附加到父节点。例如,一个外部事务创建了五个内部事务(从①到④和⑧),因此它们是父节点⓪的子节点。请注意,还将事件节点添加到图中作为创建事件的事务节点的子节点。例如,事件节点∆是节点②的子节点,因为它是由此内部事务创建的。

插入并替换为转移节点:使用上一步中构建的树结构,需要在树中附加转移节点。这是因为Token转移是恢复DeFi语义的基础。首先,将以太转移节点附加到树上。可以很容易地检索到这样的节点,因为以太坊转移具有事务的非零值字段。将以太坊转移节点插入到相应交易节点的第一个子节点中,例如图中的❶。其次,利用标准事件转移来定位ERC20Token的转移。将转移事件节点替换为ERC20Token转移节点,例如将∆替换为❷。请注意,内部事务②创建了两个转移,一个正在转移Ether(❶),另一个正在转移ERC20Token(❷)。

修剪树枝:统遍历树并修剪所有没有转移节点的分支。这是因为此类分支无助于提升语义。这可以极大地消除不必要的交互,以解决前文中讨论的挑战。例如,对于实际攻击,它删除了94.23%(1,241)个事务节点。在上图中,从树中删除了事务节点①、⑥和⑦。

D.语义提升

基于CFT,可以进一步恢复DeFi语义,这对于检测价格操纵攻击至关重要。在这项工作中首先定义DeFi动作,然后介绍从CFT提升DeFi语义的算法。

(1)DeFi动作

在这项工作中集中于以下四个DeFi动作。如果将来有必要采取更多行动,则可以追回。下表显示了定义。

转移:转移是指将Token(资产)从一个地址(发送方)转移到另一地址(接收方)。此外,ERC20Token标准定义,当将支出者字段设置为零地址4时,这意味着进行Token挖掘,即将Token直接存入地址(收件人)中。同样,如果收件人设置为零地址,则Token正在燃烧。它们在下表中分别表示为T,Tm和Tb。

流动性挖矿和流动性取消:为了获得更多的流动性,DeFi应用程序发行了LPToken以激励用户提供流动性(存款加密货币),这被称为流动性挖掘(LM)。此外,流动性提供者可以使用LPToken作为证书赎回加密货币,这被称为流动性取消(LC)。因此,流动性挖掘包括两个部分,即,存放用户的流动性(T)和铸造DeFi应用的LPToken(Tm)。取消流动性包括燃烧LPToken(Tb)和赎回已存入的流动性(T)。

交易:在正常情况下,交易包括两次转移。因此结合了一对转移,这些转移了不同的资产,并具有作为交易的支点地址(T1.recipient或T2.spender)。进一步将枢轴地址分配给交易的库属性。那是因为交易者通过流动资金池(作为中介人)交换Token。

(2)提升算法

借助定义明确的DeFi动作,提出一种算法来提升CFT的语义。算法1后订单遍历CFT(LiftLeaves)。对于每个非叶节点,该函数将成对重复地合并其子节点,直到无法合并它们为止(第3-11行)。

该算法遵循两个准则来合并节点MergeLeaves(第6行)。首先,如果两个相邻的叶子符合上表中定义的DeFi高级操作的条件,则它们将合并为DeFi高级操作。在本文中称为匹配,例如转移节点❸和❹合并到一个T r节点中。

第二,如果在相邻的两片叶子中存在转移链,则其中一个将并入另一个。例如,两次转移是“ A transfers x Ether to B”和“B transfers x Ether to C”,前者将合并后者。在本文中,这称为合并。例如,流动性挖掘节点中的转移节点⓿和转移节点❶构成转移链,则LM节点合并了转移节点⓿。

此外,如果一棵子树仅由一个叶子组成,则其父节点将被删除,并将其提升(第13-14行)以形成更多相邻的叶子。最后,它将删除CFT上的冗余事件(第27行)。为了更好地理解,在上图中将它们命名为“提升”和“移除”。例如,交易节点②的子树仅由一个叶子(LM节点)组成,然后算法删除交易节点②并提升其子树。此外,它也去除了冗余事件节点∆。

E.攻击检测

恢复DeFi语义后,通过将恢复的语义与攻击模式(或规则)进行匹配来检测价格操纵攻击。然后手动确认检测到的交易,下表显示了规则。

检测直接价格操纵攻击:该规则遵循前文中讨论的攻击流程。具体地,第一步和第三步通过一对反向交易(Tr1和Tr2)来识别。第二步是交易(Tr3)或转移(包括T,Tm和Tb的Ba)。那是因为转移也可能会影响AMM流动资金池的准备金。

检测间接价格操纵攻击:类似地,该规则遵循前文中讨论的流程。特别地,通过识别一对反向交易(Tr1和Tr2)来检测步骤I和步骤II。将第二步(获利)从借款(通常是转移)扩展到可以使攻击者获利的任何行动(Ba或Aa)。

注意,反向交易对广泛出现在套利中,这将导致误报。需要确定套利,然后将其从结果中删除。观察结果是,套利机器人通常只持有一种资产。他们首先购买用于套利的资产,然后再将其卖回原始资产。如下图所示,套利机器人(EC)仅持有以太币。它购买了在交易1中用于套利的资产(USDC),并在交易4中获得了以太币。交易1和交易4构成了一对反向交易。此外,抓住套利机会的交易2和交易3也构成了一对反向交易。上表列出了检测套利的规则。

F.真实示例

在Harvest Hack中使用真实的攻击交易5来显示整个过程。安全事件使Harvest损失了近2400万美元。DEFIRANGER通过两个步骤将原始交易转换为具有DeFi语义的CFT,即CFT构造和语义提升。在此过程中,它会修剪CFT中的分支以应对挑战I,并使用语义提升来应对挑战II。

在攻击检测过程中,DEFIRANGER将上图中的交易1和交易2识别为一对反向交易(T r1和T r2),将进入合约(EC)识别为攻击者(T r1.operator),将Curve识别为受控池(T r1.pool)。此外,在流动性挖掘中,攻击者将6020万美元的USDC存入,以向第三方应用程序提供流动性。然后收获,向攻击者铸造69m fUSDC作为证书(LM.pool!= T r1.pool,LM.recipient == T r1.operator)。由于满足了检测规则,因此DEFIRANGER将其标记为可疑的间接价格操纵攻击。

 

0x06 Evaluation

在本节中从两个角度评估DEFIRANGER:DeFi动作识别和价格操纵攻击检测,即,它是否可以准确识别DeFi动作,以及是否可以检测到实际的价格操纵攻击。

A.DeFi动作识别

Etherscan是唯一可识别每笔交易的DeFi操作的公共在线服务。为了评估方法的有效性,将结果与Etherscan的结果进行了比较。特别是,从Etherscan抓取了183363笔交易。然后,将系统应用于下载的交易。最后,将识别出的动作与Etherscan报告的标签进行比较。

对于相同的183、363事务,Etherscan和DEFIRANGER分别标识29201和37732 DeFi操作,如上图的左椭圆和右椭圆所示。由Etherscan和DEFI RANGER识别的动作数为25431(B),而由Etherscan识别但DEFIRANGER错过的动作数为3770(A)。此外,DEFIRANGER还标识了额外的12301(C + D)个DeFi操作。其中,手动确认1,667个(D)为假阳性。

上表显示了详细结果。将Etherscan识别的所有操作都视为真实肯定(此假设实际上有利于Etherscan),然后使用公式(2)计算精度。

具体来说,DEFIRANGER(86.9%)的准确性高于Etherscan(74.38%)。更重要的是,DEFIRANGER的误报率(9.46%)远低于Etherscan(26.7%)。这意味着DEFIRANGER可以识别Etherscan遗漏的更多动作。由于攻击检测是基于已识别的DeFi动作的,因此错过DeFi动作将导致错过实际攻击。在2021年4月撰写本文之前,Etherscan不能识别与DEFIRANGER报告的攻击有关的受害DeFi应用程序的任何DeFi操作。在下面总结了识别DeFi动作的方法的优缺点。

优点:识别DeFi动作的方法与平台无关,从而省去了理解每个新的DeFi协议的人工工作。请注意,DeFi应用倾向于使用自己的协议。此外,本工具rscan可以检测到更多的DeFi动作,从而可以检测到真实的攻击。

缺点:在一些情况下,DEFIRANGER会错误地识别操作,例如交换两种以上的Token并添加多种类型的Token以提供流动性。这将导致1,667次错误的DeFi操作(误报率为4.42%)。由于检测到的攻击将被手动确认,因此工具可以容忍此类误报。

B.价格操纵攻击检测

从2019年11月25日到2020年12月17日,本研究对350823625笔交易进行了大规模检测。如上表所示,DEFIRANGER共检测到524次攻击。手动确认其中432个为真阳性。总共检测到9个安全事件。其中四个是已知的,而五个是0-day事件。研究者报告了本文发现,并分配了两个CVE。

误报:包括51个套利交易和31个DeFi动作不正确的交易。首先,套利检测策略错过了51个套利交易。可以使用更准确的模式来识别套利来改善这一点。其次,DEFIRANGER将bZx的借入操作错误地识别为交易。结果,它进一步将借款兑现对错误地识别为一对反向交易,这会导致误报。这是因为DEFIRANGER尚不支持识别与借款相关的操作。

总而言之,DEFIRANGER不仅检测到四个已知的安全事件,而且还揭示了五个0-day事件。此外,DEFIRANGER是第一个在以太坊中检测价格操纵攻击的工具。此外,DEFIRANGER在10小时内完成了大规模实验,并且在此过程中消耗的内存可忽略不计。

 

0x07 Attack Analysis

A.漏洞根本原因分析

在分析每个安全事件后,发现该漏洞的根本原因可分为两类,即,智能合约的API的访问控制不足以及DeFi应用之间的价格依赖性不安全。

(1)访问控制不足

包括Loopring,Dracula,Seal Finance和Metronome在内的四个DeFi应用程序容易受到直接价格操纵攻击。该漏洞的根本原因是相同的:它们没有正确执行对可能更改AMM储备金的功能的访问控制。

这四个易受攻击的功能是这些应用程序中的sellTokenForLRC,drain,bread和closeAuction。攻击者可能利用前三个漏洞在AMM的流动性池中出售加密货币。攻击者可以预先操纵池以降低相关加密货币的价格,然后调用这些功能以廉价地出售它们,从而使易受攻击的应用程序遭受损失。之后,攻击者可以通过以相对较低的价格购买这些加密货币来获利。最后一个(closeAuction)将以太币直接存入节拍器的AMM池中。因此,攻击者首先将以太币换成METToken,然后调用closeAuction以增加AMM的以太币储备,从而提高了MET的价格。最终,攻击者将相同量的MET交换为比第一次交换中使用的MET还要多的以太。结果,攻击者可以在每次调用clouseAuction时获利。注意,Dracula在最新版本中实现了对功能耗尽的访问控制。

(2)不安全的价格依赖性

两种类型的易受攻击的应用程序都容易受到间接价格操纵攻击,包括投资组合管理应用程序和借款应用程序。投资组合管理应用程序利用AMM的实时报价为客户的存款定价,而借款应用程序则依靠AMM的实时储备为客户的抵押品定价。因此,攻击者可以操纵AMM中的实时报价和储备来攻击易受攻击的应用程序。下表显示了将在公式(3),公式(4)和公式(5)中使用的符号。

依赖AMM实时报价:Harvest,Plouto和Value DeFi是投资组合管理应用程序。它们提供相同的金融服务并共享相似的价格机制,以Harvest为例。

前文描述了Harvest Hack的攻击流程。关注其对价格的不安全依赖。收到用户的稳定币(例如USDC)后,Harvest会自动将稳定币存入年收益率(APY)最高的DeFi应用中。简而言之,Harvest担任客户经理,可帮助用户(客户)投资其稳定币。
Harvest的投资策略之一是将客户的USDC存入Curve Y池以提供流动性。在此过程中,客户从Harvest获得fUSDC(Harvest的LPToken)作为证书,Harvest从Y pool获得yCrv(Y池的LPToken)作为证书。公式3描述了Harvest在收到客户的存款(USDC)后应铸造并发送给客户的fUSDCToken数量,以及Harvest在收到并烧毁客户的fUSDC之后应退还给客户的USDC数量。

根据上式(3),fUSDC的铸造量等于存入的USDC份额与fUSDC的总供应量的乘积。退还的USDC金额等于已消耗的fUSDC份额与锁定总价值(TVL)的乘积。由于Harvest将USDC的一部分投资到Curve,因此TVL由USDC和yCrv的储备组成。为了统一单位,Harvest利用Curve Y池(T oUSDC)提供的实时价格。但是,可以操纵AMM(曲线)的实时价格。因此,如Harvest Hack部分所示,攻击者可以通过操纵Curve Y池来增加退款USDC的数量来获利。使用一段时间内的平均价格可以减轻间接的价格操纵攻击。实际上,Curve具有提供平均Token价格的界面(虚拟价格)。但是,Harvest在其智能合约中未使用此接口。

依赖AMM实时储备:Cheese Bank和WarpFinance是借款应用程序。他们支持Uniswap V2的LPToken作为抵押。由于Uniswap不提供其LPToken的价格,因此两个借款应用程序对Uniswap的LPToken实施自己的定价机制。

每个Uniswap V2池都维护一对加密货币。Cheese Bank仅支持有限数量的以太币相关池的LPToken,例如以太币-USDT,以太币-USDC,以太币-CHEESE和以太币-DAI。如公式(4)所示,该费用是池中以太坊储备的价值的两倍,是池中的TVL的值,TVL决定了LPToken的单价。

公式(5)显示了WarpFinance如何为Uniswap V2的LPToken定价。与Cheese Bank不同,WarpFinance将Uniswap V2池中所有储备的价值作为该池的TVL。然后,将池的TVL除以池的LPToken的总供应量作为LPToken的单价。

这两种价格机制很脆弱,因为它们都依赖于Uniswap V2池(RETH,Rtoken0和Rtoken1)的实时储备。因此,攻击者可以通过预先操纵相关的Uniswap V2池来提高抵押品的价格。在抵押了“昂贵的抵押品”之后,攻击者可以借出更多有价值的稳定币。他们当然不会赎回抵押品。

B.足迹分析

攻击者已使用类似的步骤来发起攻击。在下图中总结了攻击足迹。

•准备恶意合约:攻击者使用EOA(即攻击运营商)部署恶意合约。

•攻击易受攻击的应用程序:攻击运营商调用恶意合约来发起攻击。请注意,攻击者通常利用Flash loan来获取攻击期间需要的大量Token。

•洗钱者:攻击者随后将利润转移到另一个EOA,即Token洗钱者。Token洗钱者利用混合应用程序(例如tornoda )或跨链应用程序(例如Ren)洗钱。

此外,还会检查恶意合约是否还有其他调用者,或者恶意合约的创建者是否已经部署了其他智能合约。结果很有趣。除了用于攻击的交易外,几乎没有其他交易。这种干净的攻击策略使跟踪攻击者更具挑战性。

C.影响分析

在发生安全事件后,分析了对易受攻击的DeFi应用市场价值的影响。如上图所示,使用单价和市场容量(美元)来描述五个易受攻击的应用程序的协议Token(由DeFi应用程序发行的Token)的市场价值。价格从CoinGecko 中检索。

在相关事件发生之日,Harvest and Value的市场价值急剧下跌,怀疑它们是由安全事件引起的。此外,Loopring,Dracula和Seal Finance的市值在相关事件发生后也有所下降。但是,由于两个主要原因,不能简单地得出结论,它们受相关安全事件的影响。首先,在相关事件发生之前,市场价值正在下降。其次,LRC事件,DRC事件和SEAL事件为0-day。缺乏可见性限制了他们的后续影响。

 

0x08 Discussion

在本节中,将讨论DEFIRANGER的局限性和未来的改进。

识别更多的DeFi动作:当前,DEFIRANGER无法识别一些DeFi动作,例如与借款相关的动作。例如,与Etherscan相比,在3,770个未完成的操作中,有2,182个与借款相关的操作。未来将扩展DEFIRANGER的功能,以识别更多的DeFi动作,作为未来的工作之一。

检测更多类型的DeFi攻击:当前,DEFIRANGER仅关注两种类型的价格操纵攻击。实际上,如果可以开发检测模式,则使用恢复的DeFi语义,DEFIRANGER能够检测更多类型的DeFi攻击。为了保护以太坊DeFi生态系统,将设计更多的攻击方式并扩展DEFIRANGER的检测能力。该过程可能与DeFi语义识别的扩展结合在一起。

 

0x09 Conclusion

这项工作旨在检测DeFi应用程序上的两种价格操纵攻击。为此,提出了一种从原始交易中自动恢复DeFi语义的新方法。然后,基于恢复的DeFi语义检测攻击,在名为DEFIRANGER的工具中实现了本文方法。评估结果表明,工具可以准确地恢复DeFi语义,并有效地检测DeFi攻击。总的来说,它揭示了432种实际的真实世界攻击,其中涉及4个已知的安全事件和5个0-day安全事件。

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多