Back to Blog

BlockSec视角下的Jump“反向攻击”:漏洞真的存在吗?

Code Auditing
March 1, 2023
7 min read
照片由 Kevin Ku 在 Unsplash 上拍摄
照片由 Kevin Ku 在 Unsplash 上拍摄

最近,关于使用 Oasis 多签钱包从 MakerDAO 金库转移资金的“逆向利用”(counter exploit)引起了广泛关注。同时,由于我们曾参与逆向利用以帮助 Platypus 在 2 月 18 日挽回 240 万美元,我们收到了很多关于 BlockSec 是否是此次操作背后的“白帽”的询问。我们在此澄清,BlockSec 并未参与 Jump 案例中的任何行动。 在进行详细分析后(感谢 Dan Smith 在 BlockWorks 上发表的优秀分析),我们认为 Jump “逆向利用”所涉及的方式与 Platypus 案例有着本质上的区别。

此外,根据 Oasis 的声明,此次逆向利用之所以可能,是因为管理多签权限存在漏洞

Oasis 声明截图
Oasis 声明截图

然而,根据我们的分析,此次逆向利用的关键步骤如下:

  • 禁用延迟执行。这旨在由 Service Registry 合约的所有者(即 Oasis 多签钱包)完成。
  • 更改关键角色的已注册合约地址,包括 AutomationBot 合约的 AUTOMATION_EXECUTOR,以及 CloseCommand 合约的 MCD_VIEW 和 MULTIPLY_PROXY_ACTIONS。这允许 Oasis 多签钱包直接调用 AutomationBot 来执行关闭命令,而实际执行的操作被替换为一个旨在转移黑客金库的新操作。

我们的分析表明,这些关键步骤并非由于所称的管理多签访问权限漏洞导致。

免责声明:本博客是基于链上交易和公开信息撰写的。如果您有任何问题或评论,请随时通过 [email protected] 与我们联系。

整体流程

在这次操作中涉及多个地址。我们在以下谷歌文档中列出了其中一些。

https://docs.google.com/spreadsheets/d/1k0PEci8wQ16X7JT7KRq9SvhaCA2yerJcqLn6EfAoPZs/edit?usp=sharing

具体而言,Jump 逆向利用的高层思路如下:

  1. 由于黑客启用了 Oasis 提供的自动化买卖服务,黑客持有的 Maker 金库可以由 Oasis AutomationBot 智能合约管理。

  2. AutomationBot 只能由具有 AUTOMATION_EXECUTOR 角色的地址操作。该地址是 Oasis Service Registry 合约中的一项配置,可以通过 Oasis 多签钱包进行更新。然而,Oasis Service Registry 合约的配置更新具有延迟执行机制,该机制可由 Oasis 多签钱包禁用。

  3. AutomationBot 实际执行的合约和函数也可以在 Oasis Service Registry 中配置。

因此,Oasis 多签钱包首先禁用 Oasis Service Registry 合约的延迟执行,并更改 Oasis Service Registry 合约中的配置,将 AUTOMATION_EXECUTOR 角色设置为自身(多签钱包)。该更改立即生效。然后,多签钱包调用 AutomationBot 执行一个可以接管黑客 Maker 金库的命令(转移并给予)。由于 AutomationBot 可以管理黑客的金库,整个操作得以成功。

我们认为,这一过程与 Platypus 案例有着本质的不同。在 Platypus 案例中,我们发现了攻击者合约中的一个漏洞并将其分享给了 Platypus,随后 Platypus 利用该攻击者合约转移了属于他们自己的资金。而在 Jump 案例中,Oasis 多签禁用了延迟执行机制,更新了能够彻底改变合约行为的关键配置,并利用 AutomationBot 的管理角色代表黑客对 Maker 金库进行操作。

接下来,我们将详细阐述此次 Jump “逆向利用”的全过程。

详细步骤

此次操作涉及多个协议和参与方,包括 Jump、Oasis、Wormhole 黑客和 Maker。请注意,Maker 在操作过程中未采取任何行动。

具体而言,黑客创建了 Maker 金库(30100 和 30179)并使用 ETH 作为抵押品,从金库中借出 DAI。黑客还利用了 Oasis 提供的自动化买卖服务来管理 Maker 金库的抵押率。

为了使用 Oasis 自动化服务,奥赛斯提供的名为 AutomationBot 的智能合约需要被添加到金库的管理列表中。这意味着 AutomationBot 控制了黑客创建的 Maker 金库。此后,AutomationBot 可以操纵该金库,将其抵押品和债务转移到另一个由 Jump 控制的金库中。这就是“逆向利用”的基本过程。请注意,要调用 AutomationBot,交易需要由作为 ServiceRegistry 合约中 AUTOMATION_EXECUTOR 注册的地址发起。

第一步:将地址 04e1 添加到 Oasis 多签钱包中

该交易 将地址 04e1 添加到 Oasis 多签钱包 中。该钱包目前有 12 个地址,需要 4 个签名者的确认。

第二步:禁用 Oasis Service Registry 的延迟执行

该交易 通过调用 changeRequiredDelay(0) 禁用了 Oasis Service Registry 的延迟执行。请注意,Oasis Service Registry 是一个存储关键配置信息的智能合约,这些信息将由 AutomationBot 使用。通常,配置更改对于关键操作(例如将在“逆向利用”中使用的 updateNamedService)具有延迟执行机制。通常,延迟执行是一种透明的安全机制,以便关键信息的更新不会立即生效,其他人还可以进行二次审查。

请注意,调用 changeRequiredDelay 的执行受到延迟执行的限制(因为对 reqDelay 的更改尚未生效)。

ServiceRegistry.sol
ServiceRegistry.sol

第三步:执行逆向利用

该交易 执行了逆向利用。让我们深入分析一下由 BlockSec 开发的交易分析工具 Phalcon 输出的执行跟踪。

请注意,该交易由 04e1 地址初始化,并通过 Oasis 多签钱包执行,这意味着该操作至少由 4 名签名者签名。

3.1 禁用延迟执行

从跟踪中可以看出,延迟再次被设置为零。这是为了应用步骤 2 中禁用延迟执行的动作。

3.2:创建两个合约并更新服务注册表

创建了两个新合约,它们将用作 MCD_VIEW 和 MULTIPLY_PROXY_ACTIONS 合约。

  • MCD_VIEW: 0xceca8d8410797bc6c575fd8ba957708d1e85ed36
  • MULTIPLY_PROXY_ACTIONS: 0xcaef24016d0fba2c1a9427371e0d79c5781b6ea8

然后,这两个合约被更新到 Oasis 服务注册表合约中。

3.3:更改自动化执行器

Oasis 多签钱包被注册为 ServiceRegistry 合约中的 AUTOMATION_EXECUTOR。这是必要的,因为只有具有此角色的注册合约才能调用 AutomationBot 合约。

AutomationBot.sol
AutomationBot.sol
AutomationBot.sol
AutomationBot.sol

3.4:要求 AutomationBot 关闭黑客的金库

关键过程始于 AutomationBot 的 execute 函数。详细的执行函数通过参数传递。

为了理解整个过程,我们首先看一下这个函数。

AutomationBot.sol
AutomationBot.sol

其高级逻辑是,机器人首先从金库(第 268 行)中提取 DAI,然后调用具体的命令合约以在金库上执行操作(由 cdpId 指定)(第 274 行至第 278 行)。在此过程中,命令地址是 CloseCommand 合约。之后,需要对 isExecutionCorrect 进行检查。

下文显示了 CloseCommand 合约的 execute 函数。它使用 KEY MULTIPLY_PROXY_ACTIONS 从服务注册表合约中获取实际的执行器合约地址。请注意,对应于 MULTIPLY_PROXY_ACTIONS 的合约地址已被更新为一个新的地址。因此,CloseCommand 的实际执行是可控的,可以在新合约中执行任意操作。

CloseCommand.sol
CloseCommand.sol
CloseCommand.sol
CloseCommand.sol

请记住,isExecutionCorrect 是在 CloseCommand 上调用的,用于检查执行是否成功(AutomationBot.sol 第 278 行)。由于视图地址已更新,viewerContract.getVaultInfo(cdpId) 的返回值可以是任何能够通过第 24 行(CloseCommand.sol)检查的值。

看完代码后,我们来看看执行跟踪。从跟踪中可以看出,automationBot 调用了 CloseCommand 合约。CloseCommand 合约可以调用被替换的 MULTIPLY_PROXY_ACTIONS 合约来开设一个新的金库 (30231),将金库 30100(黑客的)移至 30231(新创建的金库),并将新金库 30231 提供给 Oasis 多签钱包。对黑客的另一个金库 (30179) 也执行了类似的操作。

3.5 恢复状态

恢复服务注册表中更改的条目并再次启用延迟执行。

3.6 将金库给予地址 1536

现在,新的金库(30231 和 30232)已由 Oasis 多签钱包控制。然后,这些金库在这些交易 [TX1 TX2] 中被交给了 0x15364305a06ba3ac6ba13dfe97ca0bad639adf41。该地址随后可以偿还金库中的债务并提取抵押品(以太坊)。由于抵押率很高(金库 30100 约为 293%),偿还债务并提取抵押品可以收回约 12 万以太坊,而从金库 30100 偿还债务的成本约为 7600 万美元。读者可以参考 Maker 协议文档以获取有关这些操作的更多信息

关于 BlockSec

BlockSec 是一家开创性的区块链安全公司,于 2021 年由一群全球杰出的安全专家创立。公司致力于为新兴的 Web3 世界提升安全性和可用性,以促进其大规模采用。为此,BlockSec 提供智能合约和 EVM 链安全审计服务、赋能开发者进行安全开发并主动拦截威胁的 Phalcon 平台、用于资金追踪和调查的 MetaSleuth 平台,以及帮助 Web3 构建者在加密世界中高效畅游的 MetaSuites 扩展插件。

迄今为止,公司已为 MetaMask、Uniswap Foundation、Compound、Forta 和 PancakeSwap 等 300 多家知名客户提供服务,并获得了包括 Matrix Partners、Vitalbridge Capital 和 Fenbushi Capital 在内顶级投资者的两轮数千万美元融资。

官方网站:https://blocksec.com/

官方 Twitter 账户:https://twitter.com/BlockSecTeam

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit