针对以太坊Dapp攻击事件的全面评估

 

以太坊去中心化应用程序(Dapps)的广泛使用带来了新的安全风险。据报告,这些Dapp受到来自网络罪犯的各种攻击以牟取暴利。本文中对现实世界的Dapps攻击进行了全面取证研究,以获取关键威胁情报(例如杀伤链),利用威胁情报提出了自动大规模地调查攻击事件的方法DEFIER。通过在104个以太坊Dapps的230万笔交易上面运行DEFIER,能够识别85个Dapps上的476,342笔被攻击交易,其中涉及75个0day受害Dapps和1.7万个先前未知的攻击者EOA,这是有史以来最大的以太坊链Dapp攻击事件数据集。

 

0x01 Introduction

区块链上新型去中心化应用程序的出现促进了在没有第三方的情况下跨用户的价值转移。这种名为Dapp的应用程序已经广泛部署在以太坊上,提供从加密货币管理到投票治理的各类服务。在线统计数据显示,截至2019年11月5日,以太坊上的3137个Dapps已经生成超过一百万笔交易(涉及755万美元),每天为6.37万个活跃用户提供服务。但是,Dapps带来的无限潜力也带来了新的安全风险。据报道,网络犯罪分子将视线投向Dapps并对其进行恶意利用,尤其是其区块链后端(即智能合约)。一个著名的例子是DAO攻击,该攻击在2016年造成了超过5000万美元的损失,导致以太坊的硬分叉。在研究中还发现,不法之徒从受害者Dapps中夺走了1.4万以太币,造成了最大的经济损失(即Fomo3D事件)。

面对这一重大威胁,安全社区对新型网络犯罪的理解仍然非常有限:从未报告过有关Dapp攻击的全面取证分析,也未从中收集任何网络威胁情报(CTI,cyber threat intelligence)来发现犯罪者的策略、能力和基础设施,更不用说利用这些知识来减轻威胁。

了解对Dapps的攻击:在本文中,基于区块链上记录取证提出了第一项分析和测量对以太坊Dapp现实世界攻击的研究,这为这种新兴的网络犯罪带来了新的见解。研究利用了以太坊区块链记录的信息,这是一个开放、不可篡改的分布式账本,记录了Dapps及其用户通过其以太坊用户帐户(即外部拥有的帐户或EOA)进行交互的全部历史记录,它们通过以太坊的数据包被记录。如果Dapp被利用攻击,则所有证据(例如攻击的溯源)将保留在相关交易中,以后可用于分析攻击。

然而,从超过3.5亿个以太坊交易中识别出攻击轨迹并非易事。从已发布的报告中查找相关交易充其量是不够的,因为当它们的EOA未包括在报告中时,它们往往会错过有关重要行为者和被利用行为的信息(例如,利用开发人员)。也缺少由每个交易触发的详细内部操作,涉及目标Dapp和EOA之间或不同EOA之间的函数调用。此类调用描述了这些团体的行为,并被发现对于在互动过程中确定其意图至关重要。为了解决这些挑战,本文提出了一种方法,该方法利用已知的与攻击有关的交易(本文中称为漏洞利用交易,exploit transaction)和EOA来查找新交易并进一步分析其执行轨迹(通过重新执行这些交易) 。通过这种方式结合42次已知攻击事件相关的25个Dapp,本研究确定了436,371条执行轨迹的58,555个漏洞利用交易,这些轨迹与56个Dapp相关,包括29个被利用但从未报告过的事件(即0day受害Dapp)。

扩展攻击发现和调查:在研究中复现的CTI(例如,杀伤链和行动意图)可能会导致Dapps面临未知威胁。本文设计了一种漏洞利用发现方法,称为DEFIER(Dapp Exploit Investigator),以发现更多的攻击实例,尤其是从未报告的攻击实例,以获得对Dapps真实攻击的更多发现,本文工具技术及数据集已经公开( https://drive.google.com/drive/folders/1cdD1gHNbWIS228QXmeUReougSL_k1kvf?usp=sharing )。DEFIER捕获了攻击者的策略和意图,如每个阶段的交易时间序列触发的操作所证明的。给定一个Dapp,DEFIER首先会收集记录在区块链上的所有交易,并从中收集所有交易,进一步找出其他相关交易和EOA。然后,根据所有交易的执行轨迹的相似性,将所有这些交易以图表的形式进行聚类,并组织为几个时间序列。通过图嵌入将每个交易的执行轨迹转换为向量之后,运行长短期记忆(LSTM)神经网络对每个时间序列进行分类,这不仅确定了该时间序列是否与漏洞利用有关,而且还确定了也是它的攻击阶段。

在104个Dapp上运行DEFIER,能够发现85个目标上的476,342个漏洞利用交易(精度为91.7%),是DEFIER报告了75个0day受害Dapps(例如SpaceWar和SuperCard),研究表明这些Dapp(在以太坊上)的交易中有很大一部分(即26%)与攻击有关。例如,Fomo3D的交易中有30%与攻击有关(从2018年7月到20194月)。 这提供了证据,证明发现的攻击生命周期确实是普遍存在的。 这样的攻击生命周期发现工具有可能被用来防止漏洞利用,甚至在造成损害之前(例如,在准备阶段发现并停止攻击)。

上图说明了合约调用交易的执行轨迹(➊-➒),该交易记录从0x73 发送,以0.01 ETH传输调用合约0x54 的函数execute()。交易触发了一组执行轨迹,例如从0x54 *到0xa6 *(➋)的内部调用airDropPot_(),然后是从0x54 *到0xa6 *(➌)的对airDropTracker_()的另一个调用。在研究中,将时间t处的交易执行轨迹et的集合建模为4元组(I,O,B,T)的序列,即e ={(Ii,Oi,Bi,Ti)| i = 1 … n},其中在步骤i中,Ii是触发收款人地址Oi上的行为Bi(所调用的函数及其参数)的行为的地址,以及汇款Ti(记录从交易的发行人转移到其接收方的Ether的交易字段)。

对Dapps的攻击:作为最大的Dapps市场,以太坊中已经看到了许多对Dapps的高影响力攻击,造成数百万美元的损失。上表列出了2016年至2019年报告的攻击类型以及攻击事件的数量。在研究中,利用这些已发表的报告作为种子,以复现有关以太坊Dapp攻击的关键CTI。

在这里提供一个以太坊Dapp攻击的真实示例,该攻击利用Fomo3D的airdrop()方法中的弱随机性漏洞(参见上表)来牟利。 Fomo3D是一款广受欢迎的以太坊游戏,每天进行超过15万笔交易,2018年的奖池约为300万美元。在游戏中,当玩家通过buyXid()购买密钥时,玩家就有机会从airDropPot_中赢得奖金。更具体地说,在调用buyXid()时,Dapp首先运行isHuman()以确保调用方是EOA而不是合约,然后通过伪随机数生成器(PRNG)airdrop()确定玩家是否获胜。 airdrop()方法利用参数airDropTracker_、消息发件人地址和块信息(例如,时间戳,难度,gas限制,数量等)来生成伪随机数。在攻击期间,如前图所示的漏洞利用交易的执行轨迹所示,攻击者从不同的消息发送者地址创建多个合约,例如0xf7 *(➎)。由于这些合约可以获取PRNG的所有参数,因此他们可以实施自己的airdrop()来确定是否会获胜,只有中标合约(例如0xf7 *(➑))才能购买密钥(➏ )。之后,合约运行suicide()将奖金转移给攻击者0x73 *(➒)。请注意,此攻击绕过了isHuman()的保护,它通过合约而不是EOA来购买密钥。这是因为isHuman()的实现根据与该地址关联的代码的大小来确定地址是EOA还是合约。这是不可靠的,因为正在执行的合约可能会绕过限制。

威胁模型:在研究中,考虑了那些为牟取暴利而对以太坊Dapps发起攻击的不法分子,他们可以对Dapp的合约漏洞进行多种类型的攻击,例如利用Dapp中的伪随机数生成器(PRNG)的弱随机性赢得奖金,或执行整数溢出/下溢来操纵汇款等。本研究没有考虑的攻击:在攻击过程中,恶意分子利用单个EOA地址生成单个漏洞利用交易,这在野是很罕见的。

 

0x02 Understanding Dapp Attacks in the Wild

在对Dapp攻击的分析中,利用了包括历史交易和交易执行轨迹等来重构真实的Dapp攻击事件。通过每个攻击事件的全部交易及其执行轨迹,旨在确定攻击者端到端溯源并了解其行动意图。下面首先描述用于重建攻击的方法,然后详细说明发现及其安全隐患。

A.数据收集与推导

在这里详细说明一种方法的设计和实现,该方法将从技术博客和报告中收集的有限信息扩展到与以太坊Dapp攻击事件(即漏洞利用交易)有关的数万笔交易,并进一步分析这些交易的攻击操作。更具体地说,方法首先通过复现攻击者EOA发出的所有交易或利用合约来重建现实世界中的以太坊Dapp攻击事件,如技术博客、新闻文章和来自区块链安全公司的安全报告所记录的,即使交易未公开披露。然后为了了解与漏洞利用交易相关的攻击操作,使用它们的执行轨迹对它们的细粒度执行行为进行建模,并通过基于漏洞利用交易的相似性和执行轨迹的时间对漏洞利用交易进行聚类,从而进一步确定其粗粒度的操作语义。

漏洞利用交易收集:首先搜索了网络以收集真实的以太坊Dapp攻击事件。特别是调查了三种类型的事件报告来源,包括技术博客,新闻发布和来自区块链安全公司的年度安全报告。从这些来源,进一步手动选择了与以太坊Dapp攻击有关的攻击。这些事件报告的详细信息在上表中。然后查看了这些事件报告,以识别与攻击相关的不可变信息(以下称为种子攻击集Ds),包括受害人Dapp地址,漏洞利用合约地址,攻击者EOA和漏洞利用交易哈希值。通过这种方式确定了2016年至2018年的42次Dapp攻击事件,其中包括25个受害者Dapp,20个漏洞利用合约地址,48个攻击者EOA和77个漏洞利用交易哈希值。下表总结了从报告中收集的攻击信息。

为了重建报告的事件,将调查由攻击者EOA发出的所有交易,或利用合约与受害Dapps进行交互。但是,此类EOA和开发合约可能未在报告中完整记录(参见上表)。在这里阐述一种寻找丢失的EOA和利用合约的方法。

首先,为了确定攻击事件中的其他EOA,在攻击集中包括了所有已创建、调用或转移资金到已知漏洞利用合约中的EOA,或已将资金转移到已知攻击者EOA。更具体地说,检查交易往来字段是否包含报告的攻击者EOA或利用合约。在这里将果没有代码与之关联的地址视为EOA,而不是合约。为此,在python中使用函数w3.eth.getCode()来获取关联的EVM代码的大小。存在的问题是自毁合约中代码大小也为0。在这种情况下,要确定某个地址是否属于自毁合约,将搜索其创建交易,即其contractAddress字段包含该地址的交易。

此外还扩展了种子攻击集DS,方法是添加与已被利用相似的合约,并且由攻击者EOA调用。更具体地说,在漏洞交易前后的一个时间窗口(研究中为1天)内提取由攻击者EOA调用的合约地址。然后分析了提取的合约和被利用合约的相似性。使用Octopus将字节码转换为操作码,然后计算它们的Jaccard相似度。当它们接近时(Jaccard相似度≥0.9),认为它们是相似的,并且提取的是被利用合约。请注意,攻击者可以使用自毁操作来隐瞒其被利用合约。在这种情况下,将从合约的创建交易中发现自毁合约的运行时代码。

通过这种方式构建了一个扩展的数据集De,其中包含45个漏洞利用合约地址和227个攻击者EOA。漏洞利用交易是(1)与漏洞利用合约相关的所有交易,以及(2)与攻击性EOA相关、并在已知漏洞利用交易的1天之内发布的交易。从2016/01/29到2019/01/07,总共收集了58555个漏洞利用交易,涉及56个受害Dapps(其中29个从未报告过)。这是有史以来针对链上受害者Dapp攻击事件的最大数据集。

交易执行建模:为了了解攻击操作,分析了漏洞利用交易的触发执行。使用执行轨迹图TG对交易的执行轨迹进行建模。交易的执行轨迹图TG是有向加权图,其中每个节点都是一个帐户(即EOA或合约地址),每个有向加权边描述了从一个帐户到另一个帐户的操作。G是节点属性空间Ω中的有向图T G =(V,E,W,t),其中:

1.V是一个节点集,每个节点是一个帐户(即,EOA或合约);

2.为每个节点分配Ω中的五个属性标签之一:Dapp,EOA,自毁合约,与Dapp相关的合约和其他合约。

3.有向和加权边集E⊆V×V×W是帐户之间的一组运算,其中W是一组调用函数和参数,例如execute()。

4.时间t是交易的时间戳(创建时)。

给定交易的执行轨迹集e = {(Ii,Oi,Bi,Ti)| i = 1 … n}可以构造TG:节点集V是Ii和Oi的集合,如果(Ii,Oi,Bi)存在并且具有与Bi相关的调用函数和参数的权重,则E是从Ii到Oi的边集。在研究中,使用Bloxy API]为58,555个交易收集了436,371条执行轨迹。

漏洞利用交易集群:为了了解攻击交易的语义,对于每个攻击事件,根据交易执行轨迹的相似性和时间(在给定的时间范围内)对交易进行聚类。这本质上是一个图间聚类问题,使用k-Means算法和TG距离解决了该问题。TG距离D(g1,g2)是两个图g1和g2之间的距离,它测量它们的结构相似性和时序接近度,如下所示:


在实现中,使用α= 0.9,β= 0.1,c()= 1,采用python库GMatch4py计算D,并将k-Means的迭代次数设置为3。通过这种方式收集了2016年至2019年与42起现实世界中的Dapp攻击事件相关的126个交易集群。

前面提到的方法只能用作测量工具,而不是使用完整的检测系统来导出漏洞利用交易并深入了解Dapp攻击轨迹。因此,为了构建扩展的数据集De,设置阈值(即时间窗口,操作码的Jaccard相似度)以实现高精度,但是可能会错过一些漏洞利用交易。

上表列出了操作码Jaccard相似度和时间窗口的不同参数设置下报告的合约数。对于相似性阈值,当它为0.9时,观察到报告的所有45个合约确实都是漏洞利用合约。当它变为0.5时,方法报告了81个新合约。手动调查了所有这些新报告的合约,仅发现9个漏洞利用合约,而其余72个都是误报,与1,174个错误报告的交易相关。

同样,随着时间窗口的阈值从1增加到5,方法报告了与127个交易相关的更多32个合约。手动分析所有新报告的合约后,发现只有三个漏洞利用合约,其中攻击者花费很长的时间间隔(5天)才使用相同的漏洞利用合约再次对同一Dapp发起攻击,可能是因为攻击者想测试修补的Dapp上的原始漏洞。

B.分析漏洞利用交易

数据收集和推导方法重构了42个真实世界中的Dapp攻击事件,其中包括126个语义相似的交易簇和58,555个交易。基于这些交易集群,手动对其进行了注释,并进一步进行了度量研究,以了解Dapp攻击的犯罪轨迹和行动意图。

攻击轨迹:首先在这里总结研究中发现的典型Dapp攻击的轨迹,包括四个阶段:攻击准备,漏洞利用,攻击传播和任务完成,如上图所示。在攻击准备阶段,Dapp攻击始于几笔交易,这些攻击是在对目标(➋)发起全面攻击之前,exploit developer调用受害Dapp来测试其漏洞利用代码(➊)。同时观察到数笔交易,money manager通过这些交易将攻击成本(gas或ticket)转移到利用合约中(➌),通过钱骡(money mule)来隐藏money manager的EOA。然后,在利用阶段,来自不同EOA的多个attack operator调用合约(a)攻击受害者Dapp(b)并获取利润(c)。攻击后,在攻击传播阶段,发现attack operator可以重复使用或进一步调整漏洞利用合约(通过更新)(i)以利用其他类似的Dapps(ii)获得更多利润(iii)。在任务完成阶段,攻击者破坏了利用合约(I)并提取了攻击收益(II)。然后,通过几个钱骡(III)将收益从attack operator或漏洞利用合约转移到交易所服务。下面详细介绍对真实世界Dapp攻击的测量研究和取证分析。

攻击准备:首先分析了攻击者引导如何引导攻击。对于每个攻击事件,查看了攻击者连续获取收益之前执行的所有交易集群。更具体地说,对于每次交易,通过计算攻击者的攻击成本(即,从攻击者的EOA或漏洞利用合约转移到Dapp的资金)与攻击收益(即,从Dappto转移到攻击者EOA或漏洞利用合约的资金)之间的差值来评估攻击者是否获利。如果攻击者不断从集群中的所有交易中获得收益,就认为他已成功发起了攻击。同时,攻击之前执行的交易簇被标记为与攻击准备相关联。发现在85%的攻击事件中存在这种准备阶段,平均交易数量为23。此外,在发布目标Dapp之后的81天内发现了相关的准备交易。令人惊讶的是,弱随机性攻击是在目标Dapp出现后短短9天之内准备的。这可能是因为这些Dapp通常共享相似的易受攻击的PRNG,因此一旦在一个Dapp中利用了PRNG,就可以轻松地对其进行攻击。一旦目标Dapp启动后达到某余额(研究中平均观察到3461.5 以太币),恶意攻击者就可以进行此类攻击。下图说明了受害Dapps的余额。

在准备阶段手动调查交易的行动意图时,发现攻击者的交易主要有两个目的:(1)测试其利用合约,以及(2)转移资金来引导他们的攻击(例如,支付gas)。例如,在通过漏洞利用合约(0x7d *)攻击两个Fomo3D函数isHuman()和airdrop()中的漏洞之前,攻击者0x85 *创建了两个测试合约0x56 *和0x80 *以重复评估这些函数。显然,攻击者执行了自己的软件集成测试,以确保所有攻击组件在执行攻击之前都能顺利运行。总体而言,发现在攻击准备阶段有78%的交易用于这种集成测试,在发生攻击事件时,为此目的部署了8个测试合约和执行了96个交易。此外,从这些交易的执行轨迹中,确定了36个Dapp功能正在被测试,其中79%后来在开发或攻击传播阶段受到攻击。这表明通过确定准备阶段,可以预测将要利用的漏洞并在攻击发生之前将其停止。

对Dapps的攻击需要付出一定的代价。例如,攻击者可能需要购买ticket才能玩Dapp,然后才能利用其漏洞,或支付gas来启动漏洞利用交易。在研究中,发现324个交易从EOA或以太坊交换服务转移以太币,以利用合约地址或攻击者EOA。例如,在对Fomo3D的攻击中,一些具有攻击性的EOA通过一组中间EOA(例如0x2c *,0xa7 *和0x4c *)依次连接在一起,形成资金流链。请注意,这些中间EOA仅与两种类型的交易相关联,要么是从某个来源接收资金,要么是将其转移到另一个地址。尽管充当钱骡,但中间EOA在匿名性方面显示出较差的特征,这与 Bitcoin laundry中的发现一致。

漏洞利用:如前所述,当攻击者不断从一个Dapp获利时,可以确定在漏洞利用阶段执行的交易。每个事件平均观察到来自6个攻击者EOA的1,394个漏洞利用交易。这些交易用于直接调用易受攻击的Dapp函数,或者部署或触发利用合约以自动进行攻击。从数据集中总共发现了232个用于调用易受攻击函数的交易,以及22,269个用于触发漏洞利用合约的交易。特别是对弱随机性和不适当身份认证的攻击以及DoS漏洞利用合约,在这些攻击中每次漏洞利用交易调用只会带来少量利润(例如,每次猜测的奖励),因此攻击者需要运行漏洞利用合约以连续调用目标Dapp。另一方面,在重新进入或整数溢出/下溢攻击中,攻击者EOA通常直接利用目标中的易受攻击的函数。

为了更好地了解攻击者在开发阶段的行动意图,分析了他们交易的执行轨迹。特观察到攻击者手倾向于在攻击过程中迅速发展其策略,以提高其效力(例如,增加收入或减少成本)。具体来说,发现攻击者通过delegatecall()或创建新合约来更新其利用。例如,在对Fomo3D的弱随机性攻击,如下图所示观察到存在三种漏洞利用合约版本:由于Fomo3D中的airdrop函数严重依赖于调用合约的块信息(例如时间戳),为了确定获胜者,第一个漏洞利用版本只是简单地创建了许多新合约,以在调用函数之前使用区块信息和airdrop的公共逻辑来预测函数的输出;在第一个版本上进行了改进,第二个版本通过nonce()评估了现有合约的区块,并利用获胜区块上的合约来生成临时合约(仍使用其创建者合约的区块)来触发airdrop,从而节省合约创建成本;最后一个版本从现有合约中收集所有信息,并在最有希望获胜的合约调用airdrop之前进行预测性离链。随着演变,研究表明这些攻击版本的执行轨迹非常相似(平均TG距离= 0.4)。这使工具DEFIER可以发现以前从未报告过的新漏洞利用版本(下图d)。

攻击传播:鉴于存在许多具有相同漏洞的模仿Dapps,研究表明攻击者倾向于在一个目标上重复利用其漏洞利用程序来感染其他相似的Dapps。特别是,对于在利用阶段之后运行的交易集群,发现了与攻击相关的交易,但是涉及Dapp的交易与在利用阶段的交易不同。

通过查看这些交易,发现敌手通过创建一个新合约来重用他的漏洞利用合约,该合约的大部分内容是从旧合约中复制的,或者是通过delegatecall()来调用外部代码以在原始合约的上下文中运行。借助于delegatecall(),攻击者可以简单地调整外部代码,以使攻击者针对不同的目标。例如,在Fomo3Dattack的传播阶段,攻击者EOA 0x82 *部署了一个新合约(外部代码),以通过delegatecall()将新的易受攻击的Dapp地址提供给现有的利用合约。这样,攻击者可以同时针对8个以上的Dapp重新利用该漏洞,包括Fomo Lightning,Fomo Short等。

发现此攻击传播阶段恰好在漏洞利用阶段之后,平均间隔仅3.5天。弱随机性攻击和整数上溢/下溢攻击倾向于具有侵略性的传播阶段,每个攻击事件至少要伤害四个Dapp。例如,对Rocket Coin的整数溢出攻击已传播到另外17个Dapp。

还发现,攻击者可以扫描Dapps的函数名称或运行时代码,查找与受害者Dapp一样具有相同漏洞的新目标。这是基于以下观察结果:在传播阶段被开发的Dapp中有51%与在漏洞利用阶段被攻击的Dapp共享完全相同的易受攻击的函数名称或函数字节码。上表和下表列出了在收集的攻击事件中最常出现的函数和变量(在给定函数下)。尤其是观察到用于在帐户之间转移令牌的函数transferFrom()被16个不同Dapp中的相同整数溢出攻击所利用。

任务完成:成功攻击后,研究表明攻击者经常撤回他所获得的所有收益,并试图通过破坏其所有利用合约来消除攻击轨迹。具体来说,数据集包括通过调用selfdestruct()或自定义破坏函数来破坏利用合约的交易。实际上,在研究的所有攻击事件中,攻击合约中有35.6%被销毁。请注意,合约的销毁会自动将其获胜转移到合约的创建者EOA。

有趣的是,一旦EOA从合约中收到资金,它就会将奖金进一步转移到另一地址中。在研究中,任务完成阶段确定了198个转移交易,并以与分析攻击准备时相同的方式在其上构建了资金流链。上图a显示了资金流链中各节点的累积分布。发现在19%的资金流链中,非法利润是通过至少1个钱骡转移的。同样令人感兴趣的是,在将资金转移到长资金流链之前,敌手总是将以太坊代币(例如,BeautyCoin,Smart Coin,SmartMesh代币)转换为以太币,上图b说明了从数据集中发现的七个以太币交易所。以太坊有两种类型的交易所服务:集中式交易所(例如ShapeShift,Binance,Poloniex,Gate.io和BitUN.io)和分布式交易所(例如EtherDelta和IDEX)。从收集的数据来看,显然攻击者更喜欢分布式。特别是,EtherDelta在53%的攻击事件中占主导地位,而ShapeShift是集中式交易所中最受欢迎的一种,仅在21%的事件中被发现。

C.分析攻击者的EOA

研究了发现的227个攻击者EOA的角色和关系,表明在攻击事件期间,攻击者的EOA通过层次结构进行组织,每个攻击者都扮演一个或多个角色。研究进一步揭示了利用相同的Dapp攻击不同的攻击者EOA之间,在不同的攻击事件之间存在竞争关系,如下所述。

在事件中的角色:首先分析了227个攻击者EOA的作用,然后根据它们出现的攻击阶段对其进行了分类,然后手动对其交易进行了研究以了解其行为,更具体地说,观察到19个EOA充当了exploit developer,在第一阶段创建和测试漏洞利用合约; 168个EOA调用了漏洞利用合约或运行了其他漏洞利用代码,从而有可能发挥attack operator的作用;显然,另外有21个EOA通过行为中介人EOA通过将攻击成本转移到漏洞利用合约中来管理攻击成本,就像money manager一样,还发现23个EOA传递了攻击利润。

研究表明,对Dapps的攻击是通过层次结构进行组织的,其中每个参与者都有明确定义的角色。不同角色之间只有很小的重叠:上图a表明很少看到EOA扮演多个角色,只是21%的exploit developer还充当attack operator。

竞争:如前所述,在不止一次攻击事件中,有39%的受害者Dapps被利用。有趣的是,研究揭示了同一Dapp上不同攻击活动之间存在竞争。在这里被认为包括出现在针对目标Dapp的攻击事件中的所有攻击者EOA。

上图b比较了从2018/06/15到2018/08/31在Fomo3D上的三个竞争的累积攻击利润。他们每个人都涉及一套完全不同的EOA,因此,大概是由不同方组织的。竞争者1首先在2018/06/15上对Dapp发起了严重的随机性攻击,随后是竞争者2在2018/07/08和竞争者3在2018/07/21。在这里,使用漏洞利用成功率(定义为所有漏洞利用交易中成功的漏洞利用交易的数量(即接收状态为1))来衡量攻击有效性。尽管起步较晚,但竞争者2于2018/7/20发展了其利用合约,以提高其效力。因此,它比其他两个竞争者获得了更多的利润。对于竞争者3,尽管它显然很有效,但攻击仅持续了很短的时间,仅获得了少量的利润,这可能是由于Fomo3D已经损失了大部分以太币。

D.Dapp应对分析

通过分析攻击发生后Dapp的交易,进一步研究了Dapp所有者如何应对攻击事件。观察到一些Dapp所有者放弃了他们的Dapp(56个受害Dapp中的33个),而其他Dapp所有者则试图通过打补丁,隐藏源代码或控制对关键函数的访问来进行反击。但是,在研究中,没有一个是完美的解决方案。

Dapp修补:修补易受攻击的Dapp十分复杂,原因是存储在区块链上的代码不可更改。一种典型的解决方案是使用补丁创建新合约。为了了解此过程,从Dapp的网站存档中提取了原始地址。发现在研究中分析的5个Dapps在受到攻击后更新了其合约地址,其中1个使用了delegatecall()进行修补。有趣的是,三个Dapps在修补后再次遭到攻击。例如,Lucky Blocks两次更改了地址以修复漏洞,但最终仍被利用。

隐藏源代码:另一种方式是通过隐蔽性实现安全性,一个著名的例子是游戏Lucky Blocks,它的源代码在一次弱随机攻击后就被删除了。确实,此后再也没有看到对Dapp的攻击。但是,这种方法可能会使someDapp的信任度降低。同样,对于Lucky Blocks,通过分析补丁版本中的PRNG,发现Dapp所有者偷偷调整了代码以限制随机产生幸运数字的范围,将获胜机会降低了8%(上图)。 Dapp后来确实显示出更高的所有者端收入。

管理员列表:最后,发现56个受害Dapps中有33个利用管理员列表来限制对其关键函数的访问。但是,管理员列表无法停止利用身份验证机制中的漏洞绕过访问控制的攻击,一个例子是Morph攻击。而且,此策略需要事先确定关键函数。

 

0x03 Finding New Attacks

在本节中将展示发现的新CTI如何帮助发现新的攻击,包括针对0day受害者Dapps的攻击。即使针对不同Dapps的不同类型的攻击,特定的行为可能有所不同,但高级行为模式(例如,测试利用合约)在每个攻击阶段(例如,攻击准备阶段)相对稳定,因此可以从中发现一组交易及其执行轨迹。在这里详细介绍一种称为DEFIER的方法,该方法利用交易的顺序及其触发的操作来恢复攻击轨迹并确定利用的阶段。

A.DEFIER:构思与设计

DEFIER包含两个组件,预处理和基于序列的分类。预处理将与Dapp直接交互的一组交易作为其输入,自动扩展该组以包括与Dapp间接相关的那些交易。这些交易根据其执行轨迹的相似性和调用时间的接近程度(在短窗口内)分成几组。然后,基于来自多个EOA的交易序列,基于序列的分类将这些交易组用于重建潜在的攻击轨迹。更具体地说,对于每个交易序列(通过图形嵌入建模为向量),提出了一种新颖的嵌入技术可将序列转换为特征向量,以捕获序列的潜在意图(通过注意力模型来关注每个交易与Dapp以及交易之间关系的分析)。如果这些媒介确实具有攻击企图,则将它们通过多类分类器以输出它们所属的攻击阶段。

为了解释DEFIER的工作原理,在这里通过对Suoha的攻击事件来遍历其工作流程,该事件是在对Fomo3D进行弱随机攻击的传播阶段发现的受害者Dapp。为了调查此攻击事件,DEFIER通过(1)将来自EOA的类似交易跨不同Dapp进行聚类(例如,在多个Dapp上启动相同漏洞利用的交易)和(2)然后分析这些交易来确定潜在意图(即,在传播阶段进行的利用调用)。

更具体地说,DEFIER首先运行“预处理”以收集交易,交易的 to字段或执行轨迹包含Suoha的地址。从这些交易中,提取了286个EOA(包括那些调用7个合约与Dapp进行交互的EOA)。此外收集了与其他Dapp的EOA交易,这些TG与Suoha进行的交易距离TG距离较小。通过这种方式,可以识别11088个交易,然后进一步将其分为142个组,平均TG编辑距离为0.2,时间窗口为1.5小时。对于这些组中的每一个,基于序列的分类首先运行图嵌入,以将每个交易转换为向量,将每个组转换为向量序列,然后利用LSTM模型分析序列中向量之间的关系,将每个序列转换为序列。特征向量。对来自报告的攻击的交易进行训练的多层感知(MLP)分类器将3个标签标记为攻击传播,其余139标记为合法。

B.预处理

预处理步骤旨在收集和聚集相关交易,以分析所有EOA的操作及其在Dapp上的意图。有时仅通过与Dapp直接交互的交易无法描述此类意图。例如,人们只能通过查看其他目标上的交易来识别重用其他Dapp上的利用代码的意图(传播阶段),这些交易看起来与Dapp上的利用类似。因此在研究中,将所有类似的交易包括在内,即使它们与Dapp没有直接关系。总之,在预处理过程中考虑以下两种类型的交易:

•Dapp交易:收集与Dapp以及内部与Dapp通信的交易(交易在其To字段中没有目标Dapp地址,而是调用从其轨迹中发现的函数)。为此,实现依赖于Etherscan的API get_normal_txs_by_address和get_internal_txs_by_address来识别那些交易。

•语义相似的交易:有了这些Dapp事务,为了更好地理解EOA的操作意图,还从相同的EOA中收集了具有类似执行轨迹或同时发生的交易。

具体来说,首先确定所有直接与Dapp交互的EOA,包括直接调用Dapp的地址以及创建合约以调用该调用的地址。为此,获取其to字段或执行轨迹中包含Dapp地址的交易,以标识一组EOA和合约。然后,给定合同S通过交易txs与Dapp进行交互,收集所有已经创建、调用或转账到合同S中的EOA。通过这种方式发现了所有相关的EOA,可以使用交易描述每个EOA的行为。

通过在语义相似的交易上运行算法1以完成这种性能分析。特别地,给定一个EOA u通过交易txs与Dapp进行交互,将获取其与txs的TG距离在th(阈值)以内的所有交易。在实现中将th设置为3。

交易集群:行动意图(例如,漏洞利用测试,多步游戏操作)有时包含来自多个EOA的多个交易。为了在相同的操作环境下找到交易集群,使用前文描述的算法将具有类似执行轨迹或在短时间内发生的交易分组。

帐户去噪: Dapp所有者EOA和library合约(例如,用于管理玩家信息的游戏玩家手册合约或支持访问外部网络数据的合约)的存在使分析工作变得更加复杂,这些信息不应包含在攻击调查中。为了消除噪音,首先通过Dapp的调用执行轨迹来识别library合约:由Dapp主动调用的合约被视为library合约。为此,找到由调用执行轨迹记录的所有合约,这些合约的“ from”字段是Dapp地址,输入字段不是“ 0x”。为了处理尚未被主动调用的library合约,对Dapp的字节码进行静态分析。]对字节码进行反编译,然后使用正则表达式“ 0x [a-fA-F0-9] {40}”提取library合约地址。同样,检索Dapp创建交易收据(即包含Dapp地址的contractAddress字段的收据,该收据已在library合约提取过程中收集到)以从from字段中提取Dapp创建者地址。

C.基于序列的分类

从每个交易集群中形成一个交易序列,交易按其时间戳排序。对于交易序列,基于对具有相似语义的其他序列的了解,通过预测Dapp的潜在意图(例如,利用测试,攻击传播等)来确定其是否描述了攻击。与Dapp攻击阶段有关的语义相似的交易序列s’表示为2元组({txi | i = 1 … k},y),其中{txi | i = 1 … k}是s‘和y是攻击阶段的标签。基于序列的分类的目标是在分类器的模型参数θ下找到输入序列s’的类标签,即y’= argmax Pr(y | s‘, θ),其中参数是从训练数据集中学习的。为此首先将交易序列s‘转换为向量序列,每个元素也是一个向量,该向量通过图嵌入表示其对应的交易图。然后将此序列输入LSTM模型以生成向量h,该向量h描述交易之间的关系,并突出显示与恶意行为有关的信息。在这里,选择LSTM(一种改进的RNN),因为它旨在学习序列上元素之间的长期依赖关系,这对于识别在不同攻击阶段将交易链接在一起的模式至关重要。之后由多层感知器(MLP)分类,以确定它是否确实与攻击阶段有关。

序列表示:如上图所示,s’中的每个事务txi,如其相关的执行轨迹tgi所描述的表示对应的Dapp和EOA之间的相互作用。但是,由于执行轨迹可能包含Dapp内部发生的许多操作,例如,调用Dapp的内部库以生成伪随机操作,因此交易的执行可能过于Dapp特定且嘈杂而无法捕获操作意图。为了解决此问题,采用了EOA-Dapp执行注意力模型来突出显示与EOA意图Dapp有关的有用信息。在这里,注意力ai用于调整交易图tgi的向量表示。它是由EOA eoai,Dapp di(由顶点嵌入生成)和tgi(由图嵌入生成)的矢量表示的加权组合确定的。它的权重是通过端到端深度神经网络中的LSTM模型来学习的,该模型最终输出表征整个输入的特征向量(代表交易序列的向量序列)。

其中⊕是连接操作,NE()是输入的顶点嵌入(例如,node2vec),它为每个节点生成矢量表示,GE()是图嵌入(例如,structure2vec),为每个交易图生成矢量表示,因此ftmax(x)i = exp(xi)/∑j exp(xj)。在实现中,节点嵌入的长度设置为64。将EOA和Dapp顶点嵌入的连接构造为长度为128的向量。在深度神经网络中,进一步利用标准组合门来确定将通过调整权重来使用来自EOA,Dapp和交易执行的多少信息。这样,获得事务txi的表示xi:

其中W是权重矩阵,b是偏差,σ是S型函数,而◦是逐元素乘法。给定交易编码xi,使用双向LSTM(已在标签数据集中使用分类器进行了训练)捕获交易之间的内部关系。以这种方式,可以通过训练模型将交易序列转换为向量h。

序列分类:注意力模型的输出h用作多层感知(MLP)分类器的输入。 DEFIER使用MLP生成与序列关联的给定攻击阶段的概率y’。整个基于序列的分类模块,包括LSTM和MLP,都可以通过随机梯度下降训练在一起,这是在标记数据上训练这种复杂模型的一种典型方法。在研究中构建了一个三倍的Bi-LSTM,其卷积大小为128,隐藏大小为256,批处理大小为128,时期设置为20,学习率设置为0.0001,MLP的隐藏大小设置为256。

D.评估

在这里对DEFIER进行评估,并详细阐述多阶段漏洞利用交易识别中的挑战。

对上表所示的真实数据集进行了DEFIER评估:对于恶意样本集,收集了与Dapp攻击相关的57,855个交易序列。特别是,对于处于相同攻击阶段的漏洞利用交易,首先按时间戳对其进行排序,然后定义一个大小为w(在实现中,w = 8)的滑动上下文窗口,以将按时间顺序排列的交易分块为交易处理序列。最后,通过它们的攻击阶段来标记这些交易序列。恶意集包含57,855个交易(在攻击准备阶段为469,在漏洞利用阶段为22,333,在攻击传播阶段为34,763,在任务完成阶段为290)。从56个与恶意集有关的受害Dapp收集了正常样本集的交易,并从这些Dapp上的318个手动检查的正常EOA中收集了正常集。具体来说运行了预处理模块,以生成具有相同大小的上下文窗口的交易序列。这样,用39,124个正常交易序列构造了一个正常集合。在10倍交叉验证下对这些集合进行运行,DEFIER显示出98.2%的 micro准确率,92.4%的 macro准确率,98.1%的micro召回率和98.4%的macro召回率。

参数和模型选择:滑动上下文窗口的大小w控制用于检查操作上下文的交易的长度。这里小窗口可能包含有关操作上下文的信息不足,而大窗口可能会在不同阶段引入信息,从而导致噪声。在研究中分析了各种w(5、8、10)的影响,如上图所示,数据集上选择了性能最佳的w(w = 8)。LSTM模型的周期数和学习率等参数用于控制模型的性能。在研究中,通过将周期数从10改变为100并将学习率从0.00001改变为0.1来调整模型。从下表所示的结果中,可以看到分类在20个周期和0.0001的学习率下表现最佳。

在研究中比较了RNN和LSTM模型在序列分类任务上的有效性。具体来说在数据集上实现了四个模型:RNN,具有注意力的RNN,LSTM,LSTM,并使用10倍交叉验证评估了它们的有效性。类似于使用的LSTM模型,RNN的主体也是三层128 256 128,批处理大小为128。下表显示了结果。观察到注意力LSTM优于其他序列分类模型。

E.新发现

从Dapp排名列表中收集了104个流行的Dapps及其对应的合约地址。在这些Dapp上,运行了预处理以从以太坊收集2,350,779笔交易,并构建342,224笔交易集群。DEFIER检查了这些交易,并将其中的476342个(100081个集群)标记为攻击阶段之一。这些交易与对85个受害者Dapp的攻击有关。对于每个受害Dapp,对报告的交易集群的4%进行了随机抽样以进行手动验证。总共手动调查了4,003个交易集群和30,888个交易,发现确实有3,671个集群与攻击事件相关,并且有3,347个集群处于正确的攻击阶段。

上表总结了发现,研究表明以太坊Dapps攻击确实很普遍,通过不同的攻击媒介损害了各种Dapps。观察到57.3%的受害者Dapps属于游戏类别。为了支持游戏函数,这些Dapps需要生成随机数,有时由较弱的PRNG来实现,从而使Dapps遭受弱随机性攻击。请注意在研究中,被DEFIER扫描的Dapps中有82%被观察到受到攻击,这可能是因为分析的Dapps受欢迎程度很高,并且拥有大量的余额,这使得它们更可能被攻击。此外,在漏洞利用交易中发现的85个受害者Dapps中,从未报告过的有75个(例如SpaceWar和SuperCard)。

为了了解这些攻击行为的经济影响,估算了受害者Dapp的经济损失。特别是,对于每个受害者Dapp,计算其漏洞利用交易的收入和成本差异。上表显示了损失最大的前5名受害者Dapps。攻击这五个Dapp造成的总损失估计为28,485个以太币。

上表显示了在每个攻击阶段发现的Dapp数量。有趣的是,模型确定了与80个Dapp相关的214,408次攻击准备交易,发现507个函数已被攻击者测试。有趣的是,在开发阶段确实有311个函数被利用,这表明本文模型可以帮助在漏洞被利用之前识别出易受攻击的函数。

 

0x04 Conclusion

在本文中报告了对以太坊Dapp攻击事件的研究,包括复杂的攻击等级结构、多种犯罪角色以及各种攻击行为。为了调查此类攻击事件,利用以太坊区块链保存的交易记录,对现实世界中的Dapp攻击进行了首次测量研究和取证分析。提出了一种方法来补充Dapp事件报告中丢失的攻击信息。针对每个攻击事件,利用更全面的攻击交易及其执行轨迹以复现Dapp攻击者相应的杀伤链和攻击模式。相信利用此类威胁情报自动大规模调查Dapp的潜力很大,本文的Dapp调查工具DEFIER捕获了104个以太坊上Dapp的2,350,779笔交易,捕获了高级别的攻击意图,成功识别了85个受害Dapp上的476,342笔漏洞利用交易,它们从未被报告过。本文对以太坊Dapp网络犯罪的理解将有助于更有效地防御这种新兴威胁。

(完)