简介:区块链通常使用交易池来缓存接收到而尚未被包含在区块中的交易。我们知道交易是收取交易费的,而交易费并不固定,由此矿工就可以采用不同的策略来对交易进行排序,以使自己的利益最大化。本文研究了如何利用这些策略的漏洞对以太坊交易池进行拒绝服务攻击。

文章目录


  1. 背景及简介
  2. 本文设计目标
    1. 攻击的可能性
  3. 威胁模型
    1. 基础攻击方式
  4. DETER 攻击
    1. 为什么能进行攻击
    2. 设计缺陷
      1. 未来潜在交易(Future Transaction)
      2. 潜在无效交易(Latent Invalid Transaction)
    3. 攻击设计
      1. 客户端的交易驱逐策略
      2. 利用未来潜在交易进行DETER-X攻击
        1. 攻击策略(针对矿工)
      3. 利用潜在无效交易进行DETER-Z攻击
        1. 攻击策略(针对矿工)
    4. 攻击实验
      1. 本地测量
    5. 现网攻击测量评估
  5. 缓解方案
  6. 引用

简介:区块链通常使用交易池来缓存接收到而尚未被包含在区块中的交易。我们知道交易是收取交易费的,而交易费并不固定,由此矿工就可以采用不同的策略来对交易进行排序,以使自己的利益最大化。本文研究了如何利用这些策略的漏洞对以太坊交易池txpool进行拒绝服务攻击。

背景及简介

如今,区块链的影响力越来越大,使用区块链的系统不断增多,一大批分布式应用(Distributed Application, DApp)也在不断涌现。与此同时,针对区块链攻击的研究也不断涌现。现有的研究涵盖了区块链及其应用的各个层面,包括但不限于:

  • 底层的P2P网络(如针对中继网络)
  • 共识算法(如51%攻击、自私挖矿)
  • 链上交易处理(如抢先交易攻击)
  • 应用层(智能合约)攻击(如合约漏洞利用)
  • 针对DApp的攻击(如状态不同步攻击)

近来,围绕矿工可支配收益(Miner Extractable Value, MEV)进行攻击设计、研究的文章不断出现。这里矿工可支配收益指的是矿工通过某些手段可获取的收益。最常见的MEV就是交易费,再有,矿工可以通过抢先交易、贿赂其它矿工等攻击形式来获取其它类型的MEV。

虽然针对区块链的攻击层出不穷,但是,是否存在一种成本极低却可以是区块链网络瘫痪的攻击当前仍然是一个开放问题。

本文设计目标

本文的目标是:设计一种针对少量以太坊区块链节点的、成本极低的DoS(拒绝服务攻击)攻击,以对以太坊的DApp生态链产生大范围的影响。

攻击的可能性

我们知道区块链设计之初是完全分布式的(P2P)。但是这种完全的分布式结构带来了严重的性能问题,于是一些为了妥协于性能或其它因素的中心化的方案不断被提出来。典型的中心化场景如矿池、交易中继、混币服务等。这些中心化的服务节点虽然缓解了区块链的一些问题,但是却让使用这些服务的应用变得更加脆弱。

特别的,在以太坊的生态中,数百万的DApp用户与以太坊区块链的连接是通过单个中继网络进行的(infura.io)。2020年该中继点被攻击,导致了几个主要交易所的提币服务被中断,这在以太币持有者里引发了恐慌。

威胁模型

DETER 攻击模型
图 1:DETER 攻击模型

攻击模型中包含四个对象:

  1. 攻击者:攻击者拥有自己的账户并且部署了自己可控的运行Geth的全节点
  2. 受害者:受害者结点运行了Geth客户端,并且为下游服务提供交易池数据的读取
  3. 下游服务:下游服务依赖于受害者结点提供的交易池来获取最新的交易信息
  4. 以太坊区块链网络:剩余的以太坊P2P网络

以太坊有好几种流行的客户端(比如我们攻击模型中使用的Geth),它们负责遵从以太坊区块链的协议来与以太坊网络进行数据传输、信息交换。

这里我们假设攻击结点已经建立了与受害者结点之间的连接,这个连接会用于之后向受害者节点发送精心设计的攻击交易。这种连接可以通过对以太坊网络的测量来获取,可以主动进行连接,也可以被动等待连接。

攻击者的目标是通过对受害者节点进行攻击,而让下游服务以及其它结点无法正常获取交易缓冲池中的信息。此外,攻击者进行攻击的同时还希望最大程度上降低攻击成本。

基础攻击方式

对于以太坊节点,一个非常容易想到的攻击就是向该节点发送大量的恶意的交易,同时让这些交易填满受害者的交易缓冲池。这样下游服务所能获取的交易仅仅局限于攻击者的交易,而无法获取网络上其它的正常交易。

这种攻击方式的一个很明显的缺点就是成本太高。为了让攻击者的攻击交易可以充斥受害者结点的交易池,攻击者所构造的交易的交易费必须高于正常的交易,只有这样受害者节点才会为了交易费而将其它正常的交易踢出缓冲区。

DETER 攻击

为什么能进行攻击

我们知道,区块链中每秒能够包含的交易是极其有限的,以太坊区块链也是一样。但是区块链网络中每秒钟发出的交易却有很多。这就导致了全结点的客户端必须对接收到的新的交易进行缓存,这就出现了交易池txpool。而交易池显然无法包含无限多的交易,因此,交易池会对容量进行限制。而当交易池被占满之后,结点再次接收到新的交易时,就需要判断是否需要包含新的交易,如果接受新的交易,那么就必须将交易池中的一个交易踢出去。比如新接收到的交易的交易费比交易池中的交易所包含的交易费高很多,那么结点就会选择将新来的交易加入交易池。

以太坊客户端为了吸引矿工结点的使用,在交易池的设计中,交易的添加、去除都是建立在最大化矿工收益的基础之上的。为此,很多的以太坊客户端中就出现了一些为了收益最大化而进行的一些高风险的设计。本文就是利用了这些客户端中存在的这些风险策略进行攻击的。

设计缺陷

以太坊客户端为了确保矿工们的利益最大化,其txpool的设计允许一些(暂时)无效的交易存在。我们下面介绍两种无效交易:1. 未来潜在交易;2. 潜在无效交易。

此种无效的交易类型在比特币中是不存在的。在比特币区块链模型中,交易是基于UTXO(Unspent Transaction Outputs)的,而以太坊的区块链设计依赖于基于账号的模型

以太坊这种基于账号的模型允许所谓的仓促交易。仓促交易指的是:发送方可以发送一个交易tx,而此tx所依赖的另一个交易tx'尚未被区块链确认。显然,这在比特币中是不可能发生的,比特币区块链仅允许花费已确认的、未被转出的交易输出(Unspent Transaction Outputs)作为其它交易的输入。

为了保证仓促交易间的有序性,每一个发送者的每一笔交易都会关联一个nonce值,这个nonce值对于每个发送者账号来说是单调递增的,它指示了交易的顺序。

未来潜在交易(Future Transaction)

我们假设缓冲池txpool接收到一个交易$tx$,它的发送者是用户1,nonce值是$m$。假设用户1在缓冲池txpool中所有交易nonce的最大值是$n$,如果$m = n + 1$,那么$tx$为挂起(pending)状态(可以被区块正确收入);如果$m \gt n + 1$,那么$tx$为未来(future)状态,处于此状态的交易我们称之为未来潜在交易。显然未来潜在交易是无法被包含在区块中的。

潜在无效交易(Latent Invalid Transaction)

潜在无效交易指的是,此交易在到达的时候是有效的,但是当矿工读取/执行此交易的时候它却无效了。举个例子:用户1发送了10个交易$tx_1, tx_2, ..., tx_{10}$,这里的每个交易都花费了用户1账号中的所有钱。那么,这些交易在未被执行到的时候都是有效的。此类型交易可能有两种结果:

  1. 首个交易是有效的,被包含在区块中,后续所有的交易都是无效的
  2. 后续用户1的账号又收到了很多的余额,足以支付$tx_2, \ldots$中的所需金额,这样后续的交易也会变为有效的

根据测试,以太坊主网中运行的所有客户端都会接受此类交易。

攻击设计

客户端的交易驱逐策略

符号含义
ntxpool最大容量(默认:5120)
L/M/H低/中/高交易费
V/F/I有效/未来/透支交易

研究者对不同客户端(Geth/Parity/Nethermind/Besu)的txpool进行以下两种测试:

  1. 假定初始状态下txpool中包含$x_1$笔低交易费的有效交易(VL)和$n-x_1$笔中等(M)交易费的未来潜在交易(FM),那么此时我们向txpool发送一个高交易费的未来潜在交易(FH),观察交易池的行为
  2. 假定初始状态下txpool中包含了$n$笔低交易费的有效交易(VL),那么我们先向txpool发送1笔高交易费的有效交易(VH),接着从同一账户发送$x_2 - 1$笔高交易费的透支交易,观察交易池的行为

测试 1 在所有的以太坊客户端中都可以成功,新发送的FH交易会驱逐txpool中的现有pending状态的交易并且会被放到txpool中。这里有两个特殊情况:

  • $x_1 \gt 1024$的情况下,Geth客户端虽然会使用新来的VH交易替换现有的txpool中的某个pending状态的交易,但是新来的交易不会被放到txpool中去。这是因为 Geth 对txpool中未来潜在交易的数量进行了限制($\le 1024$
  • Parity 客户端在$x_1 \le 2000$的时候,未来潜在交易不会驱逐任何txpool中的pending交易

测试2同样在所有客户端中都能成功,新发送的有效交易及透支交易可以驱逐现有的低交易费的有效交易,并且这些交易会被加入到txpool中。同样,测试2也有不成功的情况:

  • Parity和Nethermind客户端会对同一账号发送的交易数量进行限制(Parity限制为81,Nethermind限制为17),所以在$x_2 \gt limit$的时候测试失败
  • Geth客户端在$x_2 \gt 4096$的时候,测试 2 有时候会失败。当发送$x_2 \gt 4096$个交易时,Geth虽然会驱逐$x_2$pending交易,但是txpool仅会承认接收$4096$个pending交易,其余的$x_2 - 4096$个交易不会被放到交易池中

利用未来潜在交易进行DETER-X攻击

DETER-X 攻击流程
图 2:DETER-X 攻击流程

DETER-X攻击流程如上图所示,在此击中,攻击者向受害者的txpool发送$n^\prime$个高交易费的未来潜在交易(FH),$n^\prime \gt n$,比如我们可以取$n^\prime = 10 * 5120$个交易(5120为Geth的txpool默认大小)。

在针对Geth的攻击中,由于Geth的txpool中FH交易数量有上限,虽然每次发送$n^\prime$个交易可以将原来合法的 pending 交易清空,但是后续如果txpool接收到其它结点的交易$tx_{other}$后,$tx_{other}$会被放到txpool中,因此需要不断的往受害者交易池发送交易。我们假设每隔周期$T$服务会读取交易池,那么理想情况下,攻击者在服务读取txpool之前再次发送$n^\prime$个交易即可。

攻击策略(针对矿工)

为了达到攻击效果,攻击者必须在正确的时间点发动攻击,也就是在矿工读取txpool之前的那一刻发动攻击,这样矿工读取txpool后会得到一个空集合。

攻击策略:攻击者在本地设置一个时钟,一旦过了周期$T$的时间,它就发送攻击请求并且重置时钟。此外,攻击者在收到一个新的区块后,也会重置时钟。

利用潜在无效交易进行DETER-Z攻击

DETER-Z 攻击流程
图 3:DETER-Z 攻击流程

DETER-Z攻击流程如上图所示,它包含两个步骤:

  1. 向受害者结点发送$n^\prime$个透支交易
  2. 向受害者发送$n^\prime$个未来潜在交易,此步骤仅需要在攻击Geth客户端的时候进行

在第一步中,我们假设攻击者的账号余额为$B$,那么攻击者发送的每个交易都消耗了$B - pc$个以太币,其中$p c$表示交易费,显然攻击者需要设置$pc$比原本交易池中的交易的交易费都高才行。我们记这些交易中的首笔交易为$tx_0$,它将会被包含在下一个区块中。

步骤二是为了Geth添加的。步骤一虽然可以清空txpool交易池中原本的交易,但是攻击者的交易不会完全占据txpool(参考上面的测试结果)。所以我们需要步骤二来填充txpool的那些剩余空位。步骤二会发送$n^\prime$个FH交易。这里我们需要用到多个账号,每个账号发送$n_s$笔交易(这样我们共需$\frac{n^\prime}{n_s}$个账号)。在步骤二中攻击者放出的交易的交易费比步骤一中的稍微低一点,比如$pc-1$,这样既可以占满txpool,又不会将步骤一中的攻击交易驱逐出txpool

不难看出在DETER-Z攻击中,在包含$tx_o$的下一个区块来到之前,所有其它结点发送给txpool的正常交易都会被拒绝(因为交易费低)。这样在步骤二的下一个区块到来之前,攻击是一直生效的。

攻击策略(针对矿工)

DETER-Z的攻击策略非常简单。我们假设包含交易$tx_0$的区块会在时刻$t_v$被发现,前一个区块是在时刻$t_p$被发现的。那么攻击者只需要将DETER-Z攻击在$t_p$$t_v$间执行完毕即可。

攻击实验

本地测量

研究人员在本地搭建了一个包含三个结点的网络:正常结点、攻击者结点、受害者结点。受害者结点和正常结点和攻击者结点都有连接。

在DETER-X的攻击中,攻击者每隔一段时间间隔发送一条攻击消息给受害者结点。每条攻击消息中包含了我们前面描述的$n^\prime$条FH交易。在本地测试网络中,我们以一个固定速率$2 tx/s$生成正常的交易。此外,我们将攻击速率从$0.25次/s$调整到$2次/s$,并对比最终结果(包含在区块中的正常交易量)。DETER-X攻击的实验结果如下图所示:

DETER-X 攻击中区块包含的交易数量
图 4:DETER-X 攻击中区块包含的交易数量

显然,我们从图中可以看出,攻击频率越高,最终被包含的交易数量越少。最终的测量结果为:在2次/秒的攻击频率下大概有84.9%的交易未被区块收入;在0.25次/秒的攻击频率下,大概有65.2%的交易未被正常收入区块。

在DETER-Z的攻击中,我们同样设置了$n^\prime = 5120$,并且攻击消息发送频率大概为0.25次/秒。DETER-Z最终的成功率相比于DETER-X攻击的小于90%,达到了接近100%,效果极佳。

由于在DETER-Z攻击中,每次攻击仅有一个交易是有效的,也就是$tx_0$,攻击者需要为此付交易费$0.021$以太币,相对于暴力发送交易攻击需要的12.5以太币,这个成本极大的降低了!

现网攻击测量评估

研究者们还对此类攻击使用了以太坊的测试网和主网进行了测试评估。基本结论为:

  • 对于测试网络,DETER攻击者可以陈工发现测试网络中的关键节点并对其进行攻击
  • 对于主网,DETER攻击者可以成功发现主网中的关键服务结点,并有能力对其进行有效攻击

结点发现及测试细节不复杂,感兴趣的可以参考论文。

缓解方案

  1. 如果一个未来潜在交易(FH类型)会驱逐一个有效的、pending状态的交易,那么拒绝此类交易加入txpool
  2. 如果一个潜在的无效交易(透支交易)会驱逐一个有效的、pending状态的交易,那么拒绝此类交易加入txpool
  3. 如果一个交易驱逐了另外一个pending状态的交易,并且在txpool中留下了一个未来潜在交易,那么拒绝此类交易加入txpool。这个规则是说:假设txpool中存在了两个有依赖关系的交易$tx_1, tx_2$,其中2依赖于1,那么如果pending状态的$tx_1$被驱逐了,那么$tx_2$就成了未来潜在交易类型。此种驱逐是不被允许的

引用

[1] Li, Kai, Yibo Wang, and Yuzhe Tang. "DETER: Denial of Ethereum Txpool sERvices."Proceedings of the 2021 ACM SIGSAC Conference on Computer and Communications Security. 2021.


[本]通信工程@河海大学 & [硕]CS@清华大学
这个人很懒,他什么也没有写!

1
1883
0

More Recommendations