最近,关于“利用 Oasis 多重签名从 MakerDao Vault 转移资金的反向利用”(counter exploit)的讨论甚嚣尘上。与此同时,我们收到了一些关于 BlockSec 是否是此次行动的“白帽黑客”的询问,因为我们在 2 月 18 日协助 Platypus 挽回了 240 万美元的损失。(https://twitter.com/BlockSecTeam/status/1626626794966368258)。我们在此澄清,BlockSec 与 Jump 案件中的任何行动都无关。 在进行了详细分析后(感谢 Dan Smith 在 BlockWorks 上发表的精彩分析:https://www.blockworksresearch.com/research/we-do-a-little-counter-exploit),我们认为 Jump 案件中的“反向利用”方式与 Platypus 案件存在根本性差异。
此外,根据 Oasis 的声明,此次反向利用是由于管理员多重签名访问存在漏洞所致。

然而,根据我们的分析,反向利用的关键步骤如下:
- 禁用延迟执行。该功能的设计是由 Service Registry 合约的所有者(即 Oasis 多重签名钱包)执行的。
- 更改关键角色的注册合约地址,包括 AutomationBot 合约的 AUTOMATION_EXECUTOR 以及 CloseCommand 合约的 MCD_VIEW 和 MULTIPLY_PROXY_ACTIONS。这使得 Oasis 多重签名钱包可以直接调用 AutomationBot 来执行关闭命令,而实际执行的操作被替换为将利用者的 Vault 转移的新操作。
我们的分析表明,这些关键步骤并非源于所谓的多重签名访问漏洞。
免责声明:本博客基于链上交易和公开信息撰写。如果您有任何疑问或评论,请随时通过 contact@blocksec.com 与我们联系。
整体流程
在此次行动中涉及了多个地址,我们在以下 Google 文档中列出了一些:
https://docs.google.com/spreadsheets/d/1k0PEci8wQ16X7JT7KRq9SvhaCA2yerJcqLn6EfAoPZs/edit?usp=sharing
具体来说,Jump 反向利用的高层思路如下:
- 由于利用者启用了 Oasis 提供的自动化买卖服务,其 Maker Vaults 可以由 Oasis AutomationBot 智能合约进行管理。
- AutomationBot 只能由具有 AUTOMATION_EXECUTOR 角色的地址进行操作。该地址是 Oasis Service Registry 合约中的一个配置项,可以由 Oasis 多重签名钱包进行更新。然而,对 Oasis Service Registry 合约配置的更新具有延迟执行机制,可以被 Oasis 多重签名钱包禁用。
- AutomationBot 实际执行的合约和函数也是在 Oasis Service Registry 中可配置的。
因此,Oasis 多重签名钱包首先禁用了 Oasis Service Registry 合约的延迟执行,然后更改了 Oasis Service Registry 合约中的配置,将 AUTOMATION_EXECUTOR 角色设置为自己(多重签名钱包)。此更改立即生效。然后,多重签名钱包调用 AutomationBot 来执行一个可以接管利用者 Maker Vaults(转移和赠送)的命令。由于 AutomationBot 可以管理利用者的 Vaults,整个操作得以成功。
我们认为这个过程与 Platypus 案件存在根本性差异。在 Platypus 案件中,我们发现了一个攻击者合约的漏洞并将其分享给了 Platypus。然后,Platypus 利用了攻击者合约来转移属于他们自己的资金。(https://app.blocksec.com/explorer/tx/avalanche/0x5e3eb070c772631d599367521b886793e13cf0bc150bd588357c589395d2d5c3)。而在 Jump 案件中,Oasis 多重签名钱包禁用了延迟执行机制,更新了可以完全改变合约行为的关键配置,并利用 AutomationBot 的管理角色,代表利用者操作 Maker Vaults。
接下来,我们将详细阐述 Jump “反向利用”的整个过程。
详细步骤
此次行动涉及多个协议和参与方,包括 Jump、Oasis、Wormhole Exploiter 和 Maker。请注意,Maker 在此次行动中并未采取任何行动。
具体而言,利用者创建了 Maker Vaults(30100 和 30179),并使用 ETH 作为抵押物,从 Vault 中借出 DAI。利用者还利用了 Oasis 提供的自动化买卖服务来管理 Maker Vault 的抵押率。
为了使用 Oasis 自动化服务,Oasis 提供的一个名为 AutomationBot 的智能合约需要被添加到 Vault 的管理列表中。这意味着 AutomationBot 可以控制利用者创建的 Maker Vault。之后,AutomationBot 可以操纵 Vault,并将 Vault 的抵押物和债务转移到另一个由 Jump 控制的 Vault。这就是“反向利用”的基本过程。请注意,要调用 AutomationBot,交易需要从注册为 ServiceRegistry 合约中 AUTOMATION_EXECUTOR 角色的地址发起。
步骤 1:将地址 04e1 添加到 Oasis 多重签名钱包
该交易将地址 04e1 添加到 Oasis 多重签名钱包。该钱包目前有 12 个地址,需要四名签名者确认。

步骤 2:禁用 Oasis Service Registry 的延迟执行
此次交易通过调用 changeRequiredDela(0) 禁用了 Oasis Service Registry 的延迟执行。请注意,Oasis Service Registry 是一个智能合约,存储着 AutomationBot 将使用的关键配置信息。通常,对于关键操作(例如“反向利用”中将使用的 updateNamedService),配置更改会有一个延迟执行机制。通常,延迟执行是一种透明性安全机制,以便关键信息的更新不会立即生效,其他人可以进行二次审查。
请注意,调用 changeRequiredDelay 的执行受到延迟执行的限制(因为对 reqDelay 的更改尚未生效)。


步骤 3:执行反向利用
此次交易执行了反向利用。让我们深入了解 BlockSec 开发的交易分析工具 Phalcon 提供的执行跟踪。
请注意,此交易由 04e1 地址发起,并通过 Oasis 多重签名钱包执行,这意味着该操作至少由四名签名者签署。
步骤 3.1 禁用延迟执行
如跟踪所示,延迟再次设置为零。这是为了应用步骤 2 中禁延迟执行的操作。

步骤 3.2:创建两个合约并更新服务注册表
创建了两个新合约,它们将用作 MCD_VIEW 和 MULTIPLY_PROXY_ACTIONS 合约。
- MCD_VIEW:0xceca8d8410797bc6c575fd8ba957708d1e85ed36
- MULTIPLY_PROXY_ACTIONS:0xcaef24016d0fba2c1a9427371e0d79c5781b6ea8
然后,这两个合约将被更新到 Oasis 服务注册表中。

步骤 3.3:更改 Automation Executor

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


步骤 3.4:要求 AutomationBot 关闭利用者的 Vault
关键过程从 AutomationBot 的 execute 函数开始。详细的执行函数通过参数传递。
为了理解整个过程,我们首先看一下这个函数。

高层逻辑是,机器人首先从 Vault 中提取 DAI(第 268 行),然后调用具体的命令合约来针对 Vault(由 cdpId 指定)执行(第 274 至 278 行)。在此过程中,命令地址是 CloseCommand 合约。之后,需要进行 isExecutionCorrect 检查。
以下是 CloseCommand 合约的 execute 函数。它使用 KEY MULTIPLY_PROXY_ACTIONS 从服务注册表合约中获取实际执行合约的地址。请注意,与 MULTIPLY_PROXY_ACTIONS 对应的合约地址已被更新为新的地址。因此,CloseCommand 的实际执行可以被控制,以在新合约中执行任意操作。


请记住,调用 isExecutionCorrect 是为了在 CloseCommand 上检查执行是否成功(AutomationBot.sol 的第 278 行)。由于 view 地址已更新,check viewerContract.getVaultInfo(cdpId) 的返回值可以是任意值,以通过第 24 行(CloseCommand.sol)的检查。
在研究完代码后,我们来看执行跟踪。从跟踪中可以看出,automationBot 调用了 CloseCommand 合约。CloseCommand 合约可以调用被替换的 MULTIPLY_PROXY_ACTIONS 合约来创建一个新的 Vault(30231),将 Vault 30100(利用者的)转移到 30231(新创建的),并将新 Vault 30231 赠送给 Oasis 多重签名钱包。对利用者的另一个 Vault(30179)也执行了类似的操作。

步骤 3.5 恢复状态

恢复服务注册表中已更改的条目,并重新启用延迟执行。
步骤 3.6 将 Vaults 赠送给地址 1536
现在,新的 Vaults(30231 和 30232)由 Oasis 多重签名钱包控制。然后,在这些交易 [TX1 TX2] 中,Vaults 被赠送给 0x15364305a06ba3ac6ba13dfe97ca0bad639adf41。然后,该地址可以支付 Vault 中的债务并提取抵押物(以太坊)。由于抵押率很高(Vault 30100 约为 293%),支付债务并提取抵押物可以收回约 12 万枚以太坊,而成本是支付 Vault 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



