Qin K, Chaliasos S, Zhou L, et al. The blockchain imitation game[J]. arXiv preprint arXiv:2303.17877, 2023.

链接:https://www.usenix.org/system/files/sec23fall-prepub-331-qin.pdf

思考🤔

回顾整篇论文,安全问题产生于 “抢先” 运行,这种抢先运行是基于某些私密 “情报” 的,这种事情非常常见,影响也非常广泛,就像罗斯柴尔德借助拿破仑滑铁卢掌控了整个英国的经济一样,掌握 “情报” 的用户可以几乎 “确定的” 盈利。这一情况在区块链中的影响会更加的严重,因为在区块链中,矿工本身就可以进行交易,相当于可以不直接经过 “交易所” 就可以完成金钱的流动,这无疑更有利于那些能更快拥有 “情报” 的矿工。

我认为,论文中提出的方法有几个关键点:

  1. 根据动态控制流图的构建快速分析程序的流程
  2. 通过污点分析程序自动化找到污点位置并生成对抗性智能合约
  3. 本地快速验证以确保攻击收益

从实验的结果来看,APE 在以太坊中成功攻击的交易占 0.0061%;在 BSC 中成功攻击的交易占 0.0022%,这个比例相比于 "Naive Transaction Imitation Attack" 来说虽然更小,但是产生的收益却翻了 3 倍左右。这意味着部分大额交易采用了的保密的智能合约来对抗 "Naive Transaction Imitation Attack",这是合理的,但同时也暴露了交易所其实缺乏对于安全问题的深刻认知,总是尝试通过尽可能小的改变来对已知安全威胁进行防护,这可能会导致更大的安全隐患;另外一个暴露出来的问题是即使在安全威胁已知的前提下,大量的用户并没有关心可能存在的安全风险,在区块链这样的一个有海量节点及用户的应用中,攻击者更容易通过已知威胁来获取利益,从这点上来说,如果金融类区块链算法本身可以及时提供对安全威胁的更新并强制进行版本验证,可以最大程度上避免金融损失。

从 APE 的实现角度来说,APE 中的程序流分析、污点分析、对抗性智能合约生成的底层实现都是基于对区块链程序的二进制分析,这种攻击手法需要对于二进制程序有极强的了解,同时,近年来由 Go 语言实现的区块链程序不断增多,Go 语言本身的代码设计又增加了逆向分析的难度,一定程度上提高了安全性。因此,虽然 APE 中的程序流分析无法对抗对程序流的混淆防护,但是却提供了一种更轻量化的安全攻击的思路,这种思路对于相对来说还未高度复杂化的区块链程序可能会更加好用。

整体来看,APE 虽然实现了一种通用的模拟攻击的方法,但是本身其实仍然相对简单,能成功运行模拟攻击的交易数量仍然占比很小,我认为存在一些可以改进的点。

  1. 在污点分析中,APE 仅仅是结合了部分确定的 EVN 操作码,这可能会导致部分事实上可处理的污点程序未被发现,这里可以结合 “fuzzing” 技术提前对所有的 EVN 操作码进行筛选,尽可能将所有可能造成污点的操作码找出,有利于扩大攻击面。
  2. 在智能合约生成中,论文并没有详细的描述这里生成智能合约的具体方法,但是从论文来看主要 patch 的点在于对 JUMPI 的替换,这其实是一种简单的针对程序流的控制手段,对应的防护方法也非常多,很容易的导致模仿攻击失效。可以通过增加更多的 patch 模版,针对更多操作码进行改变来扩大攻击面。

# Abstract

使用区块链进行自动交易和对抗性交易已经司空见惯。然而,由于区块链的透明性,对手能够观察到任何悬而未决、尚未挖掘的交易及其执行逻辑。这种透明性进一步助长了新型对手的出现,他们会实时复制并预先运行有利可图的待处理交易,从而获得可观的经济收益。

为了揭示这种 "复制粘贴" 的不良行为,本文介绍了区块链模仿游戏,并提出了一种名为 APE 的通用模仿攻击方法。APE 利用动态程序分析技术,支持对抗性智能合约的自动合成。在一年的时间内(2021 年 8 月 1 日至 2022 年 7 月 31 日),APE 可以在以太坊上产生 1.4896 亿美元的利润,在 BNB 智能链(BSC)上产生 4270 万美元的利润。

不仅是恶意攻击,我们还进一步展示了交易和合约模仿作为防御策略的潜力。我们发现,APE 在一年内分别成功模仿了以太坊和 BSC 上 13 次和 22 次已知的去中心化金融(DeFi)攻击。我们的发现表明,区块链验证器可以实时模仿攻击,以防止 DeFi 中的入侵。

# Introduction

建立在区块链基础上的去中心化金融(DeFi)已发展成为一个价值数十亿美元的产业。然而,区块链点对点(P2P)网络被描述为黑暗森林,交易者在其中进行竞争性交易,沉溺于对抗性的前置运行 (front-running)

Front-running:经纪人或投资者因为预先知道会影响资产价格的大型机密交易而加入交易,从而获得利益。

由于交易创建和在区块链上提交之间存在固有的时间延迟,因此这种前置运行是可能发生的。这种时间延迟通常只持续几秒钟,这给前置运行者带来了计算上的挑战。为了获得经济收益,DeFi 交易者需要监控错综复杂的市场动态,并及时进行有利可图的交易,这通常需要专业的领域知识。相反,对抗性交易者也可能寻求 "复制粘贴" 和模仿攻击。我们将这种策略称为模仿攻击。一种极其简单的字符串替换模仿方法被证明可以在过去的区块链状态下每月产生数千美元的收益。

KaihuaQin,LiyiZhou,andArthurGervais.Quantifyingblockchain extractable value: How dark is the forest? In 2022 IEEE Symposium on Security and Privacy (SP), pages 198–214. IEEE, 2022.

开源社区迅速提出了防御措施,以应对这种简单的模仿方法。在撰写本文时,交易者通常会部署个性化的闭源智能合约,从而增加了利用的难度。已知的模仿算法不再适用,因为这些合约通常通过验证等方式加以保护。

然而,人们还没有探索出一种通用的模仿攻击能使现有的保护机制失效。这项工作的目标是研究、识别、实施和评估一种通用的模仿方法。我们发现,要成功模仿交易,攻击者需要克服以下三个技术难题。

  1. 前端运行时间窗口较短,可能无法应用强大的程序分析技术,如符号执行,因为符号执行不是为实时任务设计的。
  2. 攻击者需要递归地识别阻碍模仿执行的受害合约,并用新合成的对抗合约替换它们。因此,有必要使用区块链虚拟机工具来确保这一识别过程的效率。
  3. 攻击者必须保证合成的合约被正确调用和执行,而产生的财务收入则在模仿执行后被发送到恶意账户。据我们所知,现有的工作或现成的工具都无法自动复制和合成注入自定义逻辑的智能合约。

在这项工作中,我们提出了一种自动且通用的模仿方法 APE(参见图 1)。抽象来说,APE 的目的是构建一个模仿交易,复制受害者交易的逻辑。必要时,APE 会合成并部署对抗性智能合约,以绕过验证机制等复制保护。为此,APE 利用动态污点分析、程序合成和高级工具来实现模仿生成。这种通用性源于这样一个事实,即对手不需要事先了解受害者,也不需要了解受害者的交易逻辑,更不需要事先了解交互的去中心化应用程序(DApp)。APE 适用于可替代、不可替代代币的交易活动以及利用交易等。

图1 高级 APE 攻击机制是一种通用的模仿方法,可在事先不了解受害者的交易和合同的情况下合成对抗性合同。APE 会侵占由此产生的任何收入

尽管基于区块链的 DeFi 领域蓬勃发展,但它也受到数百万美元黑客攻击的困扰。如本作品所述,模仿攻击可为恶意攻击者带来巨大的经济利益。不过,根据深度防御方法,区块链模仿攻击本身也可以通过模仿攻击、挪用易受攻击的资金并将其返还给受害者来充当入侵防御系统。开源社区将这种善意活动称为 "白帽黑客"。

我们将我们的贡献总结如下:

  • 我们引入了广义区块链模仿游戏,其中有一类新的对手试图在事先不了解受害者意图或应用逻辑的情况下,模仿受害者的交易和相关合约。我们为基于 EVM 的区块链设计了通用模仿工具 APE。我们首次展示了动态程序分析技术可以实现模仿攻击,从而对区块链用户构成实质性威胁。
  • 我们在以太坊和 BNB 智能链 (BSC) 上对 APE 进行了为期一年的评估。我们发现,APE 可以在以太坊上产生 1.4896 亿美元的利润,在 BSC 上产生 4270 万美元的利润。我们发现,7374 万美元源于 35 次已知的 DeFi 攻击,而 APE 可以将其消除。通过发现 5 个新漏洞,APE 的影响进一步显现,我们披露了这些新漏洞,因为如果被利用,它们可能会造成 3153 万美元的总损失。
  • 我们发现,APE 可在以太坊(13.3 秒的区块间时间)和 BSC(3 秒的区块间时间)上实时执行。模仿一次 APE 平均需要 0.07 ± 0.10 秒。由于 APE 的效率很高,在评估时间内,它在 35 次 DeFi 攻击中实现了实时的前置运行。执行 APE 的矿工最终可以选择实施攻击,也可以作为白帽黑客进行防御。

# Background

在本节中,我们将概述所需的背景,并举例说明。

# Blockchain and Smart Contract

区块链是分布在点对点网络上的区块链条。用户通过账户的公钥签名批准交易,矿工收集交易,并按照区块内的特定顺序进行挖掘。支持智能合约的区块链扩展了账户持有资产和代码的能力,可以执行任意计算。智能合约通过交易进行初始化和执行,一旦部署就不可更改。它们通常用高级语言(如 So-lidity)编写,编译成低级字节码,由区块链虚拟机(如以太坊虚拟机(EVM))执行。EVM 是基于堆栈的虚拟机,支持算术、控制流、加密和其他区块链特定指令(如访问当前区块编号)。每执行一条字节码指令都需要消耗 "gas",由本地加密货币支付。请注意,所有代码和账户余额通常都是透明可见的。智能合约的应用二进制接口(ABI)定义了智能合约函数的调用方式(包括函数类型、名称、输入参数等)。如果智能合约不是开源的,ABI 很可能不可用。

DeFi 是一个建立在智能合约区块链之上的新兴金融生态系统,在撰写本文时,其锁定的总价值已达到 3000 亿美元的峰值。DeFi 的核心是一个智能合约编码的金融生态系统,实现了 自动做市商 (automated market maker)、借贷平台和 稳定币 (Stablecoin) 等功能。用户可以通过向相应的合约发布交易来访问 DeFi 应用程序(DApp)。

market maker:指在证券市场上,由具备一定实力和信誉的独立证券经营法人作为特许交易商,不断向公众投资者报出某些特定证券的买卖价格,并在该价位上接受公众投资者的买卖要求,以其自有资金和证券与投资者进行证券交易。买卖双方不需等待交易对方出现,只要有做市商出面承担交易对手方即可达成交易,做市商从双方赚取买卖价差而从中获利。

Stablecoin:是加密货币 (Cryptocurrency) 的其中一种类型。稳定币的核心想法是要打造一种底层分散式账本,但维持货币稳定价值的机制。稳定币被有些人认为是中心化资产抵押发行的代币,稳定币价值是与被抵押资产价值直接连动。

# Blockchain Extractable Value

众所周知,华尔街的交易员通过前置运行其他投资者的订单(即高频交易)来获利。同样,DeFi 中的交易顺序也对收益提取活动产生了致命影响。默认情况下,矿工按交易费从高到低的顺序排列交易。因此,DeFi 交易商可以通过提供有竞争力的交易费,对待处理(即尚未开采)的交易进行前置和后置操作。然而,矿工对下单交易拥有一手遮天般的特权,这使他们垄断了区块链价值的提取。这种特权引出了 ** 矿工可提取价值 (MEV)** 的概念。

MEV:指 “在给定时间内,矿工可以从操纵交易中提取的 ETH 总量”。以以太坊为例,以太坊网络的运行是依靠矿工对交易进行打包,生成区块来运行的。矿工在打包交易的时候可以做到将某些交易进行排序干预等。通过这些操作,矿工可能获取除了交易费用和区块奖励之外的额外利润,这些多出来的价值就被称为 MEV。

Qin 等人将 MEV 概括为区块链可提取价值(Blockchain Extractable Value,BEV),并表明在 32 个月内,以太坊上提取的 BEV 达 5.4054 亿美元,主要有三个来源:三明治攻击 [1]清算 [2,3]套利 [4]

  1. LiyiZhou,KaihuaQin,ChristofFerreiraTorres,DucVLe,andArthur Gervais. High-frequency trading on decentralized on-chain exchanges. In 2021 IEEE Symposium on Security and Privacy (SP), pages 428–445. IEEE, 2021.
  2. KaihuaQin,JensErnstberger,LiyiZhou,PhilippJovanovic,andArthur Gervais. Mitigating decentralized finance liquidations with reversible call options. In International Conference on Financial Cryptography and Data Security. Springer, 2023.
  3. KaihuaQin,LiyiZhou,PabloGamito,PhilippJovanovic,andArthur Gervais. An empirical study of defi liquidations: Incentives, risks, and instabilities. In Proceedings of the 21st ACM Internet Measurement Conference, page 336–350. ACM, 2021.
  4. LiyiZhou,KaihuaQin,AntoineCully,BenjaminLivshits,andArthur Gervais. On the just-in-time discovery of profit-generating transactions in defi protocols. In 2021 IEEE Symposium on Security and Privacy (SP), pages 919–936, 2021.

需要注意的是,前台运行即服务(FaaS)(如 flashbots)通过在私有网络中与矿工勾结,降低了提取 BEV 的风险。与贿赂类似,BEV 被证明会威胁到区块链共识的安全性,因为矿工会被激励分叉区块链。关于 DeFi 攻击的 SoK 系统分析了四年来的攻击,确定了各种攻击的原因和影响。在本文中,我们对白帽攻击者和黑帽攻击者进行了区分,其中黑帽攻击者保留了攻击的经济收益,而白帽攻击者则将攻击收入退还给确定的受害者。

# Naive Transaction Imitation Attack

提取实体的 BEV 可采用两种策略:一种是对 DeFi 应用程序进行细致分析(即针对特定应用程序的提取),另一种是采用天真的通用事务模仿攻击(即与应用程序无关的提取)。

Qin 等人提出了一种天真但有效的事务模仿攻击。该算法将受害者交易作为输入,并在交易发送者和数据字段中简单地将交易的发送者地址替换为恶意地址。因此,这种模仿算法相当于字符串替换方法,并不试图合成对抗性智能合约。在对过去的区块链数据进行模拟时,结果表明这种天真的算法可以在 32 个月的时间内产生 3537 万美元。我们在附录 A 中提供了一个天真的模仿示例。但是,当交易者通过认证机制等方式保护自己的交易时,这种算法就会失效,我们将在下文概述。

# Motivating Examples

DeFi 中的交易者通常使用定制的智能合约来执行金融行为,例如套利和清算。这些交易者尝试保护其交易免受仿冒攻击,例如只允许预定义账户调用其智能合约(参见图 2)。这种保护措施与认证机制相对应,是开源社区采用的一种常见做法。我们以现实世界中的身份验证为例进行说明。

图 2:清算人通过向其定制合约发送交易触发清算。自定义合约包含一个验证(第 3 行)

身份验证保护示例。在图 2 中,我们展示了「清算合约」如何尝试防止交易模仿攻击。图 2 中「清算合约」的实体代码没有开源,因此我们使用最先进的 EVM 合约去编译器对合约字节码进行反编译。要触发清算,清算人需要向增强合约发送交易以及「参数」(如闪贷规模和清算金额)。如果没有保护机制,对手可能通过调用带有相同参数的相同合约来运行清算器。然而,所提交的合约要求交易发送方匹配特定地址(第 3 行)。具体来说,清算函数 printMoney() 只能由硬编码地址调用。如果不满足这一条件,第 2.3 节中的天真模仿攻击就会失败。要规避身份验证保护,一种方法是合成一份恶意合约,复制清算者的定制合约。通过重构字节码,合成的合约既保留了清算逻辑,又绕过了身份验证。要执行攻击,攻击者无需了解清算交易的业务逻辑。对手不调用清算人的定制合约,而是调用合成合约,然后触发清算。

在这项工作中,我们提出了一种自动化和通用化的模仿方法 APE,可以挫败此类保护。APE 不仅仅局限于身份验证,它还提供了一种全面的方法来克服天真模仿策略无法处理的各种形式的保护机制。再举个例子,我们考虑这样一个场景:交易者发布了一笔盈利交易,并将赚取的收入存入交易者控制的智能合约中。虽然对手可能会通过天真的策略成功执行模仿交易这个过程,但收入仍会留在 "受害者" 交易者的合约中,攻击者不会因此获得任何经济收益。与此相反,APE 通过合成一个作为收益接收者的对抗性合约来解决这一困境。我们将在第 5.3 节中进一步介绍这种情况的细节,并展示真实世界中的一笔交易。

# APE Overview

论文中涉及的符号及含义

接下来,我们将概述系统和威胁模型。然后,我们将概述 APE 的关键组成部分。

# Preliminary Models

  • 系统模型

    我们考虑采用智能合约的分布式账本和现有的 DeFi 生态系统。交易者通过其区块链账户执行金融操作,签署矿工挖掘的交易。同样,智能合约也由其各自的账户引用。区块链交易 tx\mathrm{tx} 代表状态转换函数,将账本状态从 SS 转换为 SS',即 S=tx(S)S' = \mathrm{tx}(S)

    我们假设,在 DeFi 系统中,除了原生区块链加密货币 EE 之外,还存在各种资产表示形式(如可替代代币)。在区块链状态 SS 下,账户 aa 持有的资产 mm 余额用 Balam(S)Bal^{m}_{a} (S) Z 表示,而 Δam(S,tx)\Delta^{m}_{a}(S,\mathrm{tx}) 表示在 SS 上执行交易 tx\mathrm{tx} 后的余额变化(参见公式 1)。

    Δam(S,tx)=Balam(tx(S))Balam(S)(1)\Delta^{m}_{a} (S, \mathrm{tx}) = Bal^{m}_{a} (\mathrm{tx}(S)) - Bal^{m}_{a}(S) \tag{1}

    我们进一步假设存在链上交易所,这些交易所允许从任何资产 mm 到原生加密货币 EE 的交易。

  • 威胁模型

    我们的考虑的最强的对抗模型为:一个矿工,它可以单枪匹马地在其开采的区块中进行交易。作为矿工, A\mathcal{A} 可以访问每个待处理的交易和当前的区块链状态。 A\mathcal{A} 通过多个分布式节点和点对点连接,在 P2P 网络上主动列出数据。此外, A\mathcal{A} 还可以充当或与 FaaS 提供商合作,私下接收待处理交易。由于 A\mathcal{A} 是矿工,因此 A\mathcal{A} 可以在任何待处理交易之前进行交易。我们假设 A\mathcal{A} 在财务上是理性的,并试图最大化其资产价值。此外,我们假设 A\mathcal{A} 可以获得足够的 EE 来执行 APE。

    APE 与应用无关,这意味着 A\mathcal{A} 无需预先知道受害者交易 txv\mathrm{tx}_{v} 的逻辑,也无需知道其目标智能合约。不过,我们假设即 A\mathcal{A} 了解如何与资产代币互动,并且 A\mathcal{A} 可以通过上链交换将代币 mm 交换给 EE

    我们将旨在复制和替换 txv\mathrm{tx}_{v} 行为的交易称为模仿交易 txc\mathrm{tx}_{c}txv\mathrm{tx}_{v} 与一组合约 {scvi}\{\mathrm{sc}_{vi}\} 交互,A\mathcal{A} 可能需要替换这些合约的子集才能成功执行 txc\mathrm{tx}_{c} 。我们认为 A\mathcal{A} 可以处理任何受害合约 scvi\mathrm{sc}_{vi},以合成各自的对抗合约 scai\mathrm{sc}_{ai}

    澄清 APE 无法形成新的攻击,因为 APE 事先不知道以前的区块链攻击,也不知道应用层逻辑。因此,APE 依赖于模板交易和编码攻击逻辑的相关合约。

# Attack Overview

给定一个有利可图的受害者交易 txv\mathrm{tx}_{v},对手 A\mathcal{A} 可以尝试用简单的模仿交易来模仿其逻辑(参见第 3.3 节)。然而,由于现有的各种防御机制(如身份验证),这种天真的方法可能会失败(参见第 3.4 节)。由于缺乏关于 txv\mathrm{tx}_{v} 的先验知识,理解一个失败对 A\mathcal{A} 来说具有挑战性。此外,txv\mathrm{tx}_{v} 的执行可能与多个被调用的合约 {scvi}\{\mathrm{sc}_{vi}\} 交织在一起,从而使分析变得更加复杂。最后,A\mathcal{A} 必须实时攻击,因为 txv\mathrm{tx}_{v} 被挖掘出来前的攻击窗口通常只持续几秒钟。

APE 的目标是生成一个模仿交易 txc\mathrm{tx}_{c},以及一组模仿 txv\mathrm{tx}_{v} 逻辑的合成合约 {scai}\{\mathrm{sc}_{ai}\}(和相关的受害者合约 {scvi}\{\mathrm{sc}_{vi}\}),并具有以下属性:

  • 事先不了解受害者情况:任何盈利交易都应被视为潜在受害者,与发行者无关。A\mathcal{A} 不需要事先了解受害者的交易、意图或过去的区块链历史。
  • 不推理受害者逻辑A\mathcal{A} 不知道 txc\mathrm{tx}_{c} 的应用逻辑,也不涉及 scvi\mathrm{sc}_{vi}
  • 额外复杂性带来更高回报:APE 引入了比天真的模仿方法更多的复杂性,因此应该能获得超过原模拟方法的收益。为了进行客观比较,我们在相同的区块链交易历史上对两种模仿方法进行了评估。
  • 实时性:我们假设 A\mathcal{A} 只攻击待处理的临时交易。因此,APE 必须快于区块间时间(例如,以太坊上约为 13.3 秒,BSC 上为 3 秒)。因此,必须优先考虑执行速度而不是攻击最优性。请注意,作为矿工的 A\mathcal{A} 可以选择在 txc\mathrm{tx}_{c} 上分叉区块链,从而获得更长的攻击时间窗口,这超出了本工作的范围。

APE 的高层逻辑运算如下。给定一个潜在的受害者交易 txv\mathrm{tx}_{v}A\mathcal{A} 首先尝试通过创建并执行 txc\mathrm{tx}_{c} 来作为一个天真模仿事务以模仿 txv\mathrm{tx}_{v} 。如果 txc\mathrm{tx}_{c} 的执行出现回退,A\mathcal{A} 就会找出引发失败的执行轨迹。然后,A\mathcal{A} 合成 scai\mathrm{sc}_{ai},替换导致 txc\mathrm{tx}_{c} 回退的scvi\mathrm{sc}_{vi}。为此,A\mathcal{A} 复制受害者的合约字节码,并修改阻止成功模仿执行的指令。最后,A\mathcal{A} 在本地验证 scai\mathrm{sc}_{ai} 部署和 txc\mathrm{tx}_{c} 的可盈利性。根据 A\mathcal{A} 可以领先任何竞争对手的假设(参见第 4.1 节),APE 是无风险的。请注意,利用事务的可组合性,A\mathcal{A} 可以在单个事务中原子式地操作 scai\mathrm{sc}_{ai} 部署和模仿执行(即 txc\mathrm{tx}{c})。

APE (参见图 3)由六个关键部分组成:

图 3:基于 EVM 的区块链交易实时模仿攻击 APE 概述

  1. 动态控制流图A\mathcal{A} 在当前区块链状态下循环执行 txv\mathrm{tx}_{v},并构建动态控制流图(DCFG)。DCFG 捕获(i)(i)txv\mathrm{tx}_{v} 执行时 scvi\mathrm{sc}_{vi} 的合约间调用,以及 (ii)(ii) 调用 scvi\mathrm{sc}_{vi} 的合约字节码执行流。

  2. 盈利分析器A\mathcal{A} 提取 txv\mathrm{tx}_{v} 触发的资产转移,观察受益账户。然后,A\mathcal{A} 尝试替换这些账户成为受益人。如果 A\mathcal{A} 没有成功成为受益人,则中止攻击。

  3. 动态污点分析A\mathcal{A} 执行动态污点分析,并将分析结果与步骤 1 中构建的 DCFG 进行比较。如果比较结果显示没有差异,A\mathcal{A} 就继续进行天真交易仿真(参见第 2.3 节)。否则,根据动态污点分析和与 DCFG 的比较,A\mathcal{A} 识别出妨碍成功执行天真模仿的污点基本块。

  4. 补丁识别器:基于检测到的受益人账户和污点智能合约,A\mathcal{A} 开始识别所有需要替换的智能合约。

  5. 智能合约合成A\mathcal{A} 通过复制 scai\mathrm{sc}_{ai} 的字节码合成 scvi\mathrm{sc}_{vi}A\mathcal{A} 可能需要修改 scai\mathrm{sc}_{ai} 的字节码,以确保 txc\mathrm{tx}_{c} 可以执行 txv\mathrm{tx}_{v} 的逻辑并收取产生的财务收入。

  6. 验证A\mathcal{A} 在本地部署 scai\mathrm{sc}_{ai} 并执行 txc\mathrm{tx}_{c},以验证攻击是否有利可图。如果有利可图,A\mathcal{A} 就在链上部署 scai\mathrm{sc}_{ai} 并发布 txc\mathrm{tx}_{c},前置运行 txv\mathrm{tx}_{v}

# APE Details

在本节中,我们将介绍 APE 的设计细节,并讨论其技术局限性。

# Step 1 : Dynamic Control-Flow Graph

智能合约控制流图(CFG)是合约字节码的图形表示法。在 CFG 中,每个节点表示一个基本块,即指令的线性序列。节点由有向边连接,代表控制流中的代码跳转。对于 EVM 字节码, JUMPJUMPI 这两个操作码控制着代码块的执行路径。 JUMP 是无条件跳转到堆栈中的目标,而 JUMPI 则是有条件跳转。CFG 只包含有关合约的静态信息,而 DCFG 是一种专门的 CFG,包含从给定执行中提取的动态信息。

APE 中的动态控制流图构建A\mathcal{A} 在本地执行 txv\mathrm{tx}_{v},构建 DCFG,表示 txv\mathrm{tx}_{v} 的执行细节。为了推理 txv\mathrm{tx}_{v} 的控制流,A\mathcal{A} 记录了每个 JUMPI 的条件值,这是动态分析所必需的(第 3 步,参见第 5.3 节)。通过捕捉合约调用的操作码(即 CALLDELEGATECALLSTATICCALLCALLCODE ),A\mathcal{A} 可以识别跨合约的调用。因此,构建的 DCFG 可以跟踪调用的所有智能合约。构建的 DCFG 反映了 txv\mathrm{tx}_{v} 的具体执行,而不是 scvi\mathrm{sc}_{vi} 的完整表示。这对本工作很有帮助,因为未执行的基本区块与模仿受害者交易无关。因此,得到的 scai\mathrm{sc}_{ai}(参见步骤 5,第 5.5 节)可能比 scvi\mathrm{sc}_{vi} 包含更少的操作码,从而降低攻击成本。

# Step 2 : Profitability Analyzer

盈利能力分析器旨在过滤掉不可能盈利的受害者交易。直观地说,如果对抗收入(以 EE 度量)大于所需的交易费用,则 APE 尝试是有利可图的(参见定义 5.1)。

定义 5.1(盈利条件)。给定一个区块链状态 SS,对 A\mathcal{A} 来说,如果 BalAE(S)BalAE(S)>0Bal^{E}_{\mathcal{A}}(S') - Bal^{E}_{\mathcal{A}}(S) > 0(其中 SS' 是攻击交易后的区块链状态),则 APE 攻击对 A\mathcal{A} 来说是有利可图的。

在最简单的情况下,A\mathcal{A} 可以通过检查交易发送方的余额变化来推断模仿 txv\mathrm{tx}_{v} 的盈利能力。然而,受害者可能会将 txv\mathrm{tx}_{v} 的收入转移到其控制的另一个智能合约,而不是转移到发送者账户。因此,只有当 A\mathcal{A} 确定受益收款人时,模仿 txv\mathrm{tx}_{v} 才有利可图。因此,为了确定盈利能力,A\mathcal{A} 有必要确定参与执行 txv\mathrm{tx}_{v} 的每个账户的利润。为此,A\mathcal{A} 可以从步骤 1 中构建的 DCFG 中提取资产转移。通过分析资产执行标准(如 ERC20)中定义的 EVM 日志,可以直接提取资产转移。我们继续定义 txv\mathrm{tx}_{v} 执行中的受益人账户(参见定义 5.2)。

定义 5.2(受益账户)。如果在执行 txv\mathrm{tx}_{v} 的过程中,aa 收到的金额大于 aa 支付的金额,则账户 aa 被视为受益人。

我们仅以本地货币 EE 来衡量盈利能力,以使金融价值比较正常化。这意味着 A\mathcal{A} 必须在模仿 txv\mathrm{tx}_{v} 之后将所有收到的资产原封不动地交换到 EE

如果在执行 txv\mathrm{tx}_{v} 的过程中存在受益人账户,那么模仿 txv\mathrm{tx}_{v} 可能会产生利润。具体来说,有两种情况 A\mathcal{A} 不会放弃攻击:

  1. 如果发件人是受益账户,则其他账户与盈利能力分析器无关。
  2. 否则,如果发送人不是受益人账户,其他受益人账户的总利润减去发送人账户的潜在损失后必须保持正数。

然后,A\mathcal{A} 将受益人账户导出到补丁识别器(步骤 4),以便进一步分析(参见第 5.4 节)。请注意,这种方法可能会带来误报,因为盈利能力分析器不考虑交易是否具有可操作性。例如,从钱包合约中向交易发送方提取资产的交易被归类为可盈利交易,因为发送方是受益人账户。但是,提取交易是无法模仿的。这种误报将在验证阶段(第 6 步)被清除。

# Step 3 : Dynamic Taint Analysis

动态污点分析是一种程序分析方法,可在程序执行过程中跟踪来自污点源(如不受信任的输入)的信息流。动态污点分析通过污点策略明确确定:

  1. 哪些指令会引入新的污点;
  2. 如何对污点进行预处理;
  3. 如何检查污点值。

APE 中的动态污点分析A\mathcal{A} 开始执行从 txv\mathrm{tx}_{v} 复制的模仿事务 txc\mathrm{tx}_{c}。与 txv\mathrm{tx}_{v} 的执行相比,如果 txc\mathrm{tx}_{c} 包含不一致(例如不同的事务发送者),则 txc\mathrm{tx}_{c} 的执行可能会失败(参见第 3.4 节)。因此,在执行 txc\mathrm{tx}_{c} 时,A\mathcal{A} 会应用动态污点分析来跟踪 txc\mathrm{tx}_{c} 执行失败的位置和方式。A\mathcal{A} 将可能触发不一致执行值的操作码视为污点源,并跟踪其污点传播。下面我们将概述 APE 的污点分析策略:

表 2:污点引入规则。在执行 txc 时,ORIGIN 肯定会引入一个不一致的值,而其余操作码(灰色部分)可能会、也可能不会影响 txc 的执行

  • 污点介绍:我们检查了所有 EVM 操作码,并找出了那些可能带来不一致的操作码(参见表 2)。例如,`ORIGIN・(交易发送方操作码)肯定会产生不一致值,因为 txc\mathrm{tx}_{c} 是由恶意地址而不是受害者地址发出的。其余操作码在执行过程中可能会、也可能不会产生不一致值。
  • 污点传播:当至少有一个输入是污点时,污点会传播到算术 / 逻辑运算的输出。值得注意的是,如果一个存储变量是从一个污点槽中读取的,那么它就是污点。
  • 污点检查:回顾一下,我们在建立 txv\mathrm{tx}_{v} 的 DCFG 时,在步骤 1 中(参见第 5.1 节)记录了每个 JUMPI 条件的具体值。给定 txc\mathrm{tx}_{c} 的污点执行轨迹后,我们比较每个污点 JUMPI 是否与 txv\mathrm{tx}_{v} 的记录值相同。通过这种具体的比较,我们可以确定 txv\mathrm{tx}_{v}txc\mathrm{tx}_{c} 之间的不一致是如何中断 txc\mathrm{tx}_{c} 的执行的。

接下来,我们将定义污点基本区块(参见定义 5.3)和污点合约(参见定义 5.4)。

定义 5.3(污点基本区块)。如果 (i)(i) 基本程序块包含一个条件值为污点的 JUMPI 操作码,且 (ii)(ii) 在执行 txc\mathrm{tx}_{c}txv\mathrm{tx}_{v} 时条件值不同,则该基本程序块为污点程序块。

定义 5.4(污点合约)。如果智能合约 scvi^\widehat{\mathrm{sc}_{vi}} 包含至少一个污点基本区块,则该合约为污点合约。

如果没有污点基本区块,则 txv\mathrm{tx}_{v}txc\mathrm{tx}_{c} 的执行过程完全相同。因此,APE 等同于天真模仿攻击(即 A 只需发出 txc\mathrm{tx}_{c} 并省略步骤 4 , 5 即可模仿 txv\mathrm{tx}_{v})。但是,如果存在一个有污点的基本区块,则 txc\mathrm{tx}_{c} 的执行与 txv\mathrm{tx}_{v} 不同。为了复制 txv\mathrm{tx}_{v} 的执行,A\mathcal{A} 将污点合约替换为对抗合约,保留与 A\mathcal{A} 相同的执行逻辑。

图 4:示例中模仿事务的污点传播(参见图 2,第 3.4 节)。CALLER 引入一个污点值,并传播到 JUMPI 条件

污点传播示例:在图 4 中,我们展示了动态污点分析如何在给定恶意地址 0xab...cd 的情况下,跟踪激励示例(参见图 2,第 3.4 节)中 txc\mathrm{tx}_{c} 的执行情况。执行后,污点从 CALLER 传播到 JUMPI 的条件值(参见 PC 0xb27,图 4)。此外,条件值为 False ,与执行 txv\mathrm{tx}_{v} 时不同。因此,A\mathcal{A} 知道定制的清算合约已被玷污,需要替换。

# Step 4 : Patch Identifier

回想一下,污点基本区块可以避免 txc\mathrm{tx}_{c} 成功退出。因此,A\mathcal{A} 试图用 scai^\widehat{\mathrm{sc}_{ai}} 替换有污点的合约 scvi^\widehat{\mathrm{sc}_{vi}} 。此外,A\mathcal{A} 还需要替换步骤 2 中识别出的受益人账户,以便收取 txc\mathrm{tx}_{c} 中产生的财务收入。修补标识符的目的是检测 {scvi}\{\mathrm{sc}_{vi}\} 中所有需要修补和替换的合同,以便成功模仿 txv\mathrm{tx}_{v}。根据对 scvi^\widehat{\mathrm{sc}_{vi}} 的调用是来自交易还是来自合约,A\mathcal{A} 需要区分以下两种情况。我们用 scvi\overline{\mathrm{sc}_{vi}} 表示必须修补和替换的合同。

从事务中调用:当 txv\mathrm{tx}_{v} 调用 scvi^\widehat{\mathrm{sc}_{vi}} 时,A\mathcal{A} 应将 txc\mathrm{tx}_{c}to 地址从 scvi^\widehat{\mathrm{sc}_{vi}} 修改为 scai\mathrm{sc}_{ai}

从合约调用:如果对受污染合约 scvi^\widehat{\mathrm{sc}_{vi}} 的调用是硬编码(字节码或存储)在调用者合约 scvj^\widehat{\mathrm{sc}_{vj}} 中的(参见图 5),则 A\mathcal{A} 应同时替换 scvi^\widehat{\mathrm{sc}_{vi}}scvj\mathrm{sc}_{vj} ,以修补硬编码语句。即使 scvj\mathrm{sc}_{vj} 没有被污染,这也是必要的。上述修补程序可反复应用于随后的硬编码合约调用。

图 5:对污点合约 scvi 的调用被硬编码到合约 scv j 中。要执行 APE,A 需要同时替换 scvi 和 scvj

# Step 5 : Smart Contract Synthesis

A\mathcal{A} 开始合成对抗性合约,以替换补丁标识符检测到的每个 scvi\overline{\mathrm{sc}_{vi}}(参见第 5.4 节)。从顶层设计来说,为了合成 scai\mathrm{sc}_{ai}A\mathcal{A} 复制了 scvi\overline{\mathrm{sc}_{vi}} 的字节码,并做了如下修改。

对于有污点的合约 scvi^\widehat{\mathrm{sc}_{vi}}A\mathcal{A} 会修改每个有污点的基本代码块,以确保 scai\mathrm{sc}_{ai} 遵循与 scvi^\widehat{\mathrm{sc}_{vi}} 相同的代码路径,尽管 JUMPI 条件可能不一致。具体来说,A(i)\mathcal{A}(i)JUMPI 替换为 JUMP ,导致无条件跳转,或 (ii)(ii) 删除 JUMPI ,导致不跳转。如果 scvi^\widehat{\mathrm{sc}_{vi}} 的调用被硬编码在 scvj\mathrm{sc}_{vj} 中(参见图 5),则 A\mathcal{A} 需要修改 scaj\mathrm{sc}_{a j},将合约调用从 scaj\mathrm{sc}_{aj} 重定向到 scai\mathrm{sc}_{ai}。此外,由于每个新部署的对抗性合约都有一个空存储空间,因此在执行 txc\mathrm{tx}_{c} 时,scai\mathrm{sc}_{ai} 可能会从其存储空间中加载一个不一致的值。因此,A\mathcal{A} 会进一步修改 scai\mathrm{sc}_{ai} 以恢复加载。

上述修改可确保 txc\mathrm{tx}_{c}txv\mathrm{tx}_{v} 具有相同的执行路径(代码块和合约),但不能保证 A\mathcal{A} 获得所产生的收益。例如,在 txv\mathrm{tx}_{v} 中产生的收入可能会被发送到 scvi\mathrm{sc}_{vi} 中硬编码的账户ava_v。合成的 scai\mathrm{sc}_{ai} 复制了 scvi\mathrm{sc}_{vi} 中的字节码,并可能按照相同的方式传输(即发送到 ava_v,而不是 A\mathcal{A} 控制的账户)。因此,为了获取所产生的收入,A\mathcal{A} 需要通过临时修改 EVM 内存和向 scai\mathrm{sc}_{ai} 注入收入收集逻辑来重定向相关的资产转移。最终,A\mathcal{A} 会根据打补丁后的字节码大小变化更新跳转目的地。

# Step 6 : Validation

最后,APE 会在交易挖矿前本地验证 txc\mathrm{tx}_{c}。APE 失败的原因有两个:

  1. 执行可能失败
  2. 财务收入无法弥补部署对抗性合约和执行 txc\mathrm{tx}_{c} 的成本。

为了对攻击进行具体验证,恶意矿工会部署每个 scai\mathrm{sc}_{ai},并在本地的最新区块链状态上执行 txc\mathrm{tx}_{c}A\mathcal{A} 将收到的所有代币转换为 EE,以检查 txc\mathrm{tx}_{c} 是否产生利润。只有当 EE 中的收入涵盖所有交易费用(包括智能合约部署费用)时,txc\mathrm{tx}_{c} 才能产生利润。回想一下,对抗性合约的部署、模仿执行和资产交换可以在一次攻击交易中完成。如果验证成功,A\mathcal{A} 就会在下一个区块中包含攻击交易(前置运行 txv\mathrm{tx}_{v})。否则,攻击中止,A\mathcal{A} 无需承担任何费用,即 APE 无风险。

# Limitations

APE 的设计和实施有许多限制条件。例如,我们假设对手拥有成功执行 APE 所需的足够数量的前期资产。鉴于闪存贷款的广泛使用,前期资本要求已迎刃而解。

清单 1:任何提供由其私人密钥签名的 ECDSA 签名的账户都可以从 Vault 提取资产

当需要进行复杂的语义重组时,APE 就不适用了。我们在清单 1 中举例说明,合约 Vault 允许任何提供由其私钥签署的有效 ECDSA 签名 (v,r,s)(v, r, s) 的账户提取资产。由于这种 "任何人都可以提取" 的逻辑,Vault 的设计使得提取交易容易受到模仿攻击。然而,要让对手自动执行攻击,就需要自动进行语义理解和签名生成,而 APE 并不支持这一点。

此外,APE 无法模仿非原子策略,即跨越多个独立区块链交易的策略。例如,给定一个资产交换受害者交易,三明治攻击者可能会创建两个对抗性交易,从受害者身上榨取利润。APE 的目标不是产生这种攻击。但是,如果三明治攻击的攻击者创建了一个包裹受害者交易所的原子夹心交易,APE 就能成功挑战该交易。

在我们的工作中,我们假设受害者不知道 APE 对手,特别是 APE 攻击策略。如果受害者意识到了 APE,那么受害者可以重新设计其智能合约,使其交易更坚固,以抵御 APE 对手的攻击。正如我们在第 6 节中所展示的,本文介绍的攻击方法在实践中非常有效。我们将在第 8 节概述可能的反击策略。

# APE Historical Evaluation

实现:我们用 6582 行 Golang 代码实现了 APE。更多详情可参见附录 B。

我们开始评估 APE 仿真攻击在以太坊和 BSC 上一年时间内(从 2021 年 8 月 1 日到 2022 年 7 月 31 日) 的表现,以太坊和 BSC 是本文撰写时市值最高的两个支持智能合约的区块链。我们分别对以太坊和 BSC 上的 431,416,565 笔和 2,366,970,381 笔过往交易进行了评估。

# Methodology and Setup

我们将过去的每笔交易都视为潜在的受害交易,并对其应用 APE 管道。如果攻击成功,我们会保存相关的合成智能合约,以及产生的收益和执行成本(如合约部署和模仿交易的 'gas' 成本)。如果不需要替换合约,APE 会退回到天真的模仿攻击,我们将其作为基线单独列出。

虽然完整存档节点可以提供任何过去区块的区块链状态,但它并不直接允许在任意过去区块链状态上执行任意交易。因此,我们通过对 go-ethereumbsc EVM 进行相应的定制,为以太坊和 BSC 实现了一个仿真器。模拟器从存档节点获取历史状态,并返回任何给定交易的执行结果。我们在 Ubuntu 20.04.3 LTS 上进行实验,该系统配备 AMD 3990X(64 核)、256GB 内存和 8TB NVMe SSD。

# Evaluation Results

在以太坊上,从总计 431,416,565 个潜在的链上挖掘的受害交易中,我们发现了 43,979 个(0.0102%)容易受到天真模仿攻击的交易(参见表 3)。APE 成功攻击了 26,127 个(0.0061%)受害者交易,其中涉及替换 665 个独特的智能合约。

从 2,366,970,381 个 BSC 交易中,我们发现天真模仿适用于 516,128 个(0.0218%)受害者交易,而 APE 则捕获了 52,799 个(0.0022%)额外的交易,涉及 1,193 个独特的合约。

表 3:代表成功攻击交易和唯一受害者合同的总体攻击统计数据

攻击收益:为了合理衡量攻击利润,我们需要考虑导线部署和模仿交易所需的交易费成本。因为区块空间是有限的(例如,受以太坊区块‘gas’限制),因此在执行 APE 攻击时,我们需要捕捉矿工在不包含受害者交易时放弃交易费的机会成本。因此,我们用 APE 受害交易的交易费来量化这种机会成本。利润以每笔受害者交易时的 ETH (BNB) 价格换算成美元。请注意,ETH (BNB) 是以太坊 (BSC) 上的原生加密货币。

我们在图 6 中展示了 APE 的累积利润。在以太坊上,与天真模仿相比,APE 可以将模仿攻击的利润提高 973.6%。具体来说,我们发现 APE(包括天真模仿攻击)总共产生了 1.4896 亿美元的利润,而天真模仿攻击在相同时间段内的累计利润仅为 1387 万美元。通过量化模仿攻击所需的前期资金,我们发现 99.31% 的成功攻击所需的资金少于 5 ETH(包括交易费)。

图 6:从 2021 年 8 月 1 日到 2022 年 7 月 31 日,以太坊上的模仿攻击总利润(包括 APE 和天真模仿)达到 1.4896 亿美元,而 APE 的累计利润为 1.3508 亿美元。在 BSC 上,APE 和天真模仿分别产生 2945 万美元和 1325 万美元

在 BSC 上,天真模仿攻击的利润累计为 1325 万美元,而 APE 则带来了 2 945 万美元的额外利润(+222.3%)。99.48% 的 BSC 模仿攻击所需的预付资金低于 5 BNB。

我们注意到,与天真模仿相比,APE 获取的平均利润高出一个数量级(参见表 3)。为进一步了解易受 APE 影响的交易,我们将在第 6.3 节中进行分析。

Gas 消耗:APE 带来了额外的 'gas' 成本,因为对手可能需要部署对抗性合约。我们确定了两个与 'gas' 相关的约束条件,攻击受此约束。攻击的收入必须能够支付 'gas' 支出,而且用于部署和执行攻击交易的 'gas' 应保持在区块 'gas' 限额以下。

在以太坊上,我们发现 APE 平均耗费 0.98M±0.74M 'gas',而天真模仿耗费 0.45M±0.50M 'gas'(参见图 7)。作为参考,在撰写本文时,以太坊采用了动态区块耗气量限制,平均耗气量为 29.77M。在已识别的历史交易中,APE 的最大气体消耗量为 23.11M,低于以太坊的平均块 'gas' 限制。平均而言,对抗性合约部署占攻击气体消耗的 48.42%。

图 7:以太坊上的 APE 每次攻击平均消耗 0.98M±0.74M 瓦斯,而天真模仿攻击消耗 0.45M±0.50M 瓦斯。然而,对 BSC 的天真模仿攻击的平均耗气量(1.74M±4.44B)高于 APE 攻击(1.64M±0.64B)

平均而言,BSC 的区块 'gas' 限额高于(8 266 万)以太坊,这就为模拟提供了更大的空间。我们发现,APE(1.64M±0.64B)和天真模仿(1.74M±4.44B)在 BSC 上的平均耗气量都较高。对抗性合约部署在 BSC 上的平均耗气量是 APE 耗气量的 53.04%。与以太坊相反,BSC 上的天真模仿平均耗气量高于 APE。因此,我们分析了耗气量超过 3M 的 82192 笔天真的模仿交易。去除 80291 个异常值后,BSC 上天真的模仿交易的平均耗气量为 0.48M±0.55M 。

对抗性合约:平均而言,一次 APE 攻击需要在以太坊上替换 1.02 ± 0.15 个合约,在 BSC 上替换 1.05 ± 0.23 个合约。我们发现,与被替换的受害者合约相比,每个合成的对手合约平均小 60.95 ± 19.19%(以字节为单位)(参见表 4)。由于 APE 可能会用合成代码扩展受害方合约,我们还观察到了 - 295.56% 的负缩减,即最坏情况下增加了 295.56%。在 BSC 上,合约大小的平均缩减率为 57.59 ± 18.69%,最大缩减率为 613.33%。

表 4:对抗性合约统计。APE 在以太坊和 BSC 上最多创建 3 个对抗性合约,平均值分别为 1.02 和 1.05

# Historical Analysis

为了从 APE 的成功中获得启示,我们对以太坊和 BSC 上收益最高的前 100 名 APE 受害者进行了人工投资,分别获得了 1.1343 亿美元(83.97%)和 2727 万美元(92.60%)的利润。表 5 列示了整体的跨行动和利润分配情况。接下来,我们将概述研究结果的细节

表 5:以太坊和 BSC 上收益最高的前 100 名 APE 受害者的交易和利润分布。我们未能对 31 个 BSC 受害者交易进行分类

已知的 DeFi 攻击和漏洞:在以太坊上,APE 发现了与 13 个已知 DeFi 攻击相对应的 17 个黑帽交易和 12 个宣称的白帽交易,总共获利 7374 万美元。最易被 APE 攻击的交易 0xcd7d...70fc 是对 Popsicle Finance 智能合约的 DeFi 攻击,产生了 2,025 万美元的 APE 利润。请注意,该 APE 利润低于报告的攻击利润,因为我们将 APE 的收益转换为 ETH。交易所可能会产生过多的滑点,尤其是对于较高的金额。

我们检测到两笔交易可能与已披露的两个合约漏洞有关。交易 0x2e7d..efea0xe12a..755c 分别涉及 Auctus ACOWriter 漏洞和 BMIZapper 漏洞中报告的受害者合约。但是,我们无法找到披露这些交易公开信息的合同执行者。

在 BSC 上,APE 共捕获了 22 次 DeFi 攻击,涉及 40 笔交易,共产生了 2239 万美元的仿冒利润。

表 8 和表 9(附录 C)概述了已识别的 DeFi 攻击和漏洞的详情。请注意,对于每笔攻击交易,我们都会检查 etherscan.io 是否观察到 P2P 网络上的攻击。如果 etherscan 无法监测到 P2P 网络上的攻击,那么攻击很可能是私下传播给矿工(如 FaaS)的。我们发现,在 12 次白帽攻击交易中,有 10 次(对应 6 次攻击)是私下传播给矿工的。白帽黑客可能出于两个目的而选择私人通信渠道:

  1. 加快链上白帽交易的包含速度;
  2. 减少模仿攻击的可能性。

新发现的漏洞:APE 发现了五个未关闭的漏洞。在这些漏洞中,最有利可图的漏洞名为 massDeposit ,在以太坊和 BSC 上分别产生了 2858 万美元和 759.54 万美元的总利润。下文将介绍 massDeposit 漏洞的案例研究,其他新发现漏洞的详情见附录 C。

责任披露:在撰写本报告时,所有已发现的漏洞都已没有可用资金。然而,尽管存在危险,新用户可能会在不知情的情况下与这些合同进行交互。因此,我们选择通过专门的区块链消息服务(Blockscan Chat by Etherscan)来联系有漏洞的智能合约。不幸的是,我们发现的所有易受攻击的合约都是匿名部署的,没有明显的方法可以识别这些合约背后的实体或个人。

清单 2:APE 易受攻击的存款人合约,任何人都可以调用 massDeposit() 函数并提出一份金库合约。我们的评估结果表明,APE 可能会给该合约造成 2,858 万美元的潜在损失

massDeposit 案例研究massDeposit 漏洞的前身是以太坊上的一个 Depositer 合约(0xe2c071e1E1957A62fDDf0199018e061ebFD3ac2C)(参见清单 2)。我们发现,由于以下漏洞细节,存入的资金可能是通过 APE 攻击盗取的。存款人合约的 massDeposit() 函数以金库为参数,金库是接收存款人合约全部资金的合约(参见图 8a)。任何人都可以调用 massDeposit() 函数,并且提供一个任意的金库合约地址。然后,允许保险库从存款人账户中收取资产。最后,存款人调用金库的 setOwner() 函数,试图配置金库的所有权。当观察到这样的大量存款交易时,APE 的处理员 A\mathcal{A} 会将 vault 识别为受益人账户。然后,APE 会自动合成一份对抗合约,重新放置 vault 合约(参见图 8b)。回顾一下,在合成受益人合约时,APE 注入了在模仿交易结束前将所有收集的资产转移到对抗账户的逻辑。值得注意的是,即使没有 APE,攻击者也可以手动制作一份敌对金库合约,恶意提取存款人的资产。因此,我们将这一通道设计归类为漏洞。

图 8:MassDeposit 漏洞

# APE Real-time Evaluation

理想情况下,支持 APE 的矿工会尝试实时确定其开采区块的最佳交易顺序。因此,在给定一个未确认交易列表的情况下,矿工可以应用每一种交易组合来确定 APE 的最佳收益。然而,探索这些组合很快就会导致组合爆炸。

因此,我们将为矿工的交易排序提出一个更现实、但也更尽力的解决方案。我们可以借鉴被广泛采用的假设,即在一个区块链区块中,交易通常按其费用金额排序。因此,在按费用排序的列表中,我们知道对于受害者交易 viv_i,APE 交易也应该被放在 ii 的位置。虽然 EVM 目前只支持交易的顺序执行,但投机并行执行的前景可观,可以加快区块验证以及 APE 中的受害者交易识别。不过,这种并行执行框架超出了本文的研究范围。

# Methodology and Setup

为了评估实时性能,我们将 APE 逻辑注入一个以太坊(BSC)完整节点,称为 APE 节点。APE 节点监听以太坊(BSC)P2P 网络,并对每笔潜在的受害者交易进行 APE 操作,同时不公布生成的攻击交易。重复评估过程将当前区块链高度 hh 和内存池 P\mathcal{P} 作为输入(参见算法 1)。我们首先排除 P\mathcal{P} 中的非法交易(例如,nonce 编号错误的交易),并按 'gas' 价格降序对产生的交易进行排序。然后,我们在当前区块链状态上依次应用排序后的交易。给定每一对中间状态 SiS_i(应用 txi\mathrm{tx}_{i} 后)和后续交易 txi+1\mathrm{tx}_{i+1},APE 节点异步执行攻击函数 Ape (Si,txi+1S_i,\mathrm{tx}_{i+1}),并以非阻塞方式继续执行下一对 (Si+1,txi+2S_{i+1},\mathrm{tx}_{i+2})。如果事务 txv\mathrm{tx}_{v} 是可攻击的,我们就用生成的攻击事务替换(即 "前置运行")txv\mathrm{tx}_{v}。该流水线对应于对抗式矿工:

  1. 从内存池中选择并排序交易;
  2. 按顺序应用每个交易以构建下一个区块
  3. 在适用时执行 APE 攻击。APE 节点重复这一过程,并记录以下指标的性能。

算法 1

指标 1(单次交易性能)。在给定一个受害者交易和相应区块链状态的情况下,APE 生成攻击所需的时间(参见算法 1)。

指标 2(内存池性能)。考虑到实时交易的动态内存池,从 APE 攻击生成到下一个区块(即应包含 txc\mathrm{tx}_{c} 的目标区块)到达的时间(参见算法 1)。

我们使用与第 6 节相同的硬件设置和 10 Gbps 的互联网连接进行实时评估。为了迅速捕获待处理交易,我们将 APE 节点的最大网络对等节点从默认的 50 个增加到 500 个,用于以太坊和 BSC。APE 节点会生成 150 个线程,异步执行 Ape 函数(参见算法 1)。

较弱的威胁模型:请注意,与第 4.1 节中的威胁模型相反,在本节中,我们不是矿工。此外,我们与 FaaS 没有私人对等协议,因此可能无法观察到只有启用了 FaaS 的矿工才会收到的受害者交易。与之前的威胁模型相比,我们的 APE 节点观察受害者交易的对抗能力较弱。因此,在实时评估中,我们选择关注 APE 在实际应用中的计算实时性能,而忽略 APE 节点在较弱的威胁模型下可能产生的潜在经济利润。我们预计较弱的威胁模型会获得较低的利润,因此将此类分析留待今后的工作中进行。

# Computational Real-time Performance

我们的以太坊实时实验捕获了 26 天的数据。在实验期间,以太坊 APE 节点平均每秒重新接收 17.86 次独特交易。我们总共检测到 4,045 次模仿机会,其中包括 3,699 次容易受到 APE 攻击的交易。BSC 实时评估的时间跨度为 14 天。我们的 BSC APE 节点平均每秒接收 57.31 次独特交易。我们在 BSC 上识别出 489 个模仿机会和 784 个 APE 机会。

表 6 列出了单笔交易性能(参见指标 1)和执行时间明细。平均而言,生成一次天真模仿攻击需要 0.01 ± 0.01 秒,而生成一次 APE 攻击需要 0.07 ± 0.10 秒。

表 6:原始攻击和 APE 模仿攻击的单笔交易性能(以太坊)。步骤 1、3 和 6 平均占 APE 执行时间的 96.35%。APE 在 BSC 上的单次交易性能相当

APE 最耗时的步骤是 DCFG(第 1 步)、动态污点分析(第 3 步)和验证(第 6 步),占整个执行时间的 96.35%。

我们在图 9 中展示了 mempool 性能(参见指标 2)。在以太坊(BSC)上,99.68%(99.49%)的 APE 攻击是在我们的 APE 节点收到目标块之前生成的。从攻击产生到接收到目标块的时间平均为 12.56 ± 12.55 (2.24 ± 0.81) 秒。我们的评估结果表明,以太坊上的 APE(区块间隔为 13.3 秒)和 BSC(区块间隔为 3 秒)具有实时性。

# APE Countermeasures

模仿攻击对 DeFi 生态系统及其用户构成了迫在眉睫的威胁。与 EVM 兼容的区块链依赖矿工来执行和验证每笔交易。因此,很难完全防止矿工检查和模仿受害者交易。我们认为以下对策有可能减轻 APE。

将模仿作为一种防御工具:一种可能直观但有效的替代方法是将模仿作为一种防御机制。例如,矿工可以通过简单地模仿攻击并将收益退还给受害者的方式,对 DeFi 攻击进行自动白帽黑客攻击。虽然矿工目前被信任来确保区块链共识的安全,但他们可以扩展这种能力到应用层。漏洞悬赏可以激励矿工的利他主义。不过,我们将精确的激励结构留待今后的工作中去探索。

打破原子性:打破有利可图的事务的原子性会阻碍 APE,也就是说,用户可以将其事务的逻辑分割成多个独立的事务。这样,APE 就无法捕捉到任何独立交易的全部逻辑,也就无法对其进行模仿。此外,这种防御可以通过一种工具来实现,它可以将单个事务作为输入,并自动将其拆分成具有相同程序逻辑的多个事务。这种方法的主要缺点是不适用于所有情况(如闪存贷款)。打破原子性还可能给用户带来额外风险(例如,部分套利执行导致财务损失)。

前置运行缓解:APE 要求攻击者必须能够前置运行受害者交易,因此缓解前置运行可以防止 APE 攻击。文献探讨了各种基于时间的交易排序公平性的前置运行缓解方案。虽然这些公平排序解决方案原则上可以将 APE 的威胁最小化,但它们需要对共识层或应用层进行根本性修改。特别是,[1] 需要对底层区块链进行修改,而 [2, 3] 则引入了一个负责交易排序的额外许可委员会,并需要重新设计 DeFi 应用程序。

[1] Mahimna Kelkar, Fan Zhang, Steven Goldfeder, and Ari Juels. Order- fairness for byzantine consensus. In Annual International Cryptology Conference, pages 451–480. Springer, 2020.

[2] MahimnaKelkar,SoubhikDeb,SishanLong,AriJuels,andSreeram Kannan. Themis: Fast, strong order-fairness in byzantine consensus. Cryptology ePrint Archive, 2021.

[3] Yunhao Zhang, Srinath Setty, Qi Chen, Lidong Zhou, and Lorenzo Alvisi. Byzantine ordered consensus without byzantine oligarchy. In 14th USENIX Symposium on Operating Systems Design and Implemen- tation (OSDI 20), pages 633–649, 2020.

代码混淆:成熟的区块链和 DeFi 应用程序并不容易打补丁和重新设计。在以更系统的方式减少前置运行之前,需要轻量级的变通方法。因此,解决这一问题的一个可行办法是开发字节码级混淆技术。虽然代码混淆作为一种防御机制已经使用了几十年,但还没有人把它作为智能合约攻击和漏洞的对策来研究。可以采用控制流混淆方法,其目的是模糊程序流程,使动态分析难以推理代码。回想一下,为了复制执行路径,APE 会修改受污染的基本模块,并对代码跳转进行硬编码(参见第 5.5 节)。如果在一个受害者事务中同时访问了污点基本块的真分支和假分支,合成对抗性合约就会变得很困难,因为硬编码跳转只能访问一个分支。因此,可以设计一种针对 APE 的混淆方案,使硬编码的代码跳转导致无限循环。尽管混淆技术易于采用,并能提供针对 APE 的可靠保护,但它们仍有局限性。主要问题是,可以开发出复杂的去混淆技术来绕过这些防御。混淆防御也会导致合同更加复杂,增加执行和部署 'gas' 的成本。我们将完整的设计和评估工作留待今后进行。

# Related Work

漏洞利用工具系统化:我们在表 7 中对最接近的相关工作进行了系统化,重点关注自动漏洞利用生成工具。我们将它们区分为:

  1. 旨在获取金融价值并捕捉该过程中漏洞的工具;
  2. 检测智能合约中预定义漏洞模式的工具。

表 7:自动智能合约开发相关工作的系统化

对于基于奖励的漏洞利用工具,我们发现,由于字符串替换方法简单,天真模仿法在实时性能方面优于 APE。不过,在相同的评估时间范围内(参见第 6 节),APE 比天真的方法捕获了更高的经济收益和更多的 DeFi 攻击。 DEFIPOSER 利用 SMT 解算器来识别有利可图的策略,这些策略有可能揭示新的漏洞模式。然而, DEFIPOSER 的有效性依赖于区块链应用的精确建模,这需要大量的人工努力。值得注意的是, DEFIPOSER 的实时性能取决于底层 SMT 解算器以及数学模型的复杂性。

在智能合约中检测预定义漏洞模式的工具将这些模式作为进行安全分析的输入。因此,这类工具可能不会发现不同的或新的漏洞模式。然而, MAIANSOLAR 的设计具有实时性。在 APE 之前, SOLAR 是我们所知的唯一能合成合约的工具。不过, SOLAR 需要访问智能合约的 ABI。回顾一下,闭源智能合约可能无法访问 ABI。据我们了解,SOLAR 专注于单个合约中的漏洞,因此不太可能捕捉到可组合(即跨合约)的 DeFi 攻击。

智能合约攻击与安全:Atzei 等人对智能合约攻击进行了调查。许多人都专注于通过检测漏洞和生成恶意输入来自动寻找针对脆弱智能合约的漏洞利用。Qin 等人探索了通过闪贷进行 DeFi 攻击。Wu 等人提出了一种独立于平台的方法来恢复高级 DeFi 语义,以检测价格操纵攻击。

静态分析:工具如 SecurifySlitherEthainter ,可检测智能合约中的特定漏洞。这类工具通常能实现完整性,但也会报告误报。另一种检测智能合约漏洞的常见方法是采用符号执行。Mythril 和 Oyente 使用基于 SMT 的符号执行来检查 EVM 字节代码,并模拟虚拟机来探索执行路径。其他工具采用模糊技术检测各种漏洞。APE 不采用模糊技术,而是利用 EVM 来一次性动态分析智能合约。最近, SMARTSHIELDsGuard 对用于修补智能合约的字节码重写进行了探索。 EVMPATCH 可以集成多种静态分析工具来检测漏洞,并自动完成部署和管理可升级合约的整个生命周期。

# Conclusion

广义区块链模仿游戏是对智能合约区块链的一类新攻击。采用这种模仿既可能是为了自私的结果,例如,采用 APE 的矿工可以从 DeFi 攻击中获得价值数百万美元的收益;也可能是为了更好的结果,矿工可以作为白帽黑客帮助捍卫 DeFi 生态系统,方法是预先运行攻击,并可能将由此获得的收益退还给受害者。在这项工作中,我们证明了这种模仿游戏是切实可行的,并能在以太坊和 BSC 上产生巨大价值。

附录部分请参考原论文🙏