最近,关于“利用 Oasis 跨链桥漏洞转移 MakerDao Vault 资金的‘反向利用’”引起了广泛关注。与此同时,我们收到了几则关于 BlockSec 是否是此次操作背后“白帽黑客”的查询,因为我们在 2 月 18 日曾协助 Platypus 进行“反向利用”,成功追回了 240 万美元资金。我们在此澄清,BlockSec 并未参与 Jump 案中的任何操作。 经过详细分析(感谢 BlockWorks 和 Dan Smith 发表的精彩分析),我们认为 Jump 案中使用的“反向利用”方式与 Platypus 案有本质区别。
此外,根据 Oasis 的声明,此次“反向利用”之所以能够成功,是因为其多签管理员的访问存在漏洞。

然而,根据我们的分析,此次“反向利用”的关键步骤是:
- 禁用延迟执行。这本应由 Service Registry 合约的所有者(即 Oasis 多签钱包)执行。
- 更改关键角色的注册合约地址,包括 AutomationBot 合约的 AUTOMATION_EXECUTOR,以及 CloseCommand 合约的 MCD_VIEW、MULTIPLY_PROXY_ACTIONS。这使得 Oasis 多签钱包能够直接调用 AutomationBot 来执行关闭命令,而其实际执行的操作已被替换为转移利用者的 Vault。
我们的分析表明,这些关键步骤并非源于所谓的多签管理员访问漏洞。
免责声明:本博客基于链上交易和公开信息撰写。如果您有任何问题或评论,请随时通过 [email protected] 联系我们。
整体流程
在此次操作中涉及多个地址,我们将在以下 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 利用了攻击者合约,转移了属于他们自己的资金。 然而,在 Jump 案中,Oasis 多签钱包禁用了延迟执行机制,更新了可以完全改变合约行为的关键配置,并利用 AutomationBot 的管理角色,以利用者的名义操作 Maker Vaults。
接下来,我们将详细阐述 Jump“反向利用”的整个过程。
详细步骤
此次操作涉及 Jump、Oasis、Wormhole 利用者和 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 个地址,需要 4 个签名者确认。
步骤 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:更改自动化执行者

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 的第 24 行)。由于 view 地址已更新,viewerContract.getVaultInfo(cdpId) 的返回值可以是任何可以绕过检查(CloseCommand.sol 的第 24 行)的任意值。
在审阅完代码后,我们来看执行跟踪。从跟踪中可以看到,automationBot 调用了 CloseCommand 合约。CloseCommand 合约可以调用被替换的 MULTIPLY_PROXY_ACTIONS 合约来创建一个新的 Vault(30231),将 Vault 30100(利用者的)转移到 30231(新创建的),并将新的 Vault 30231 给予 Oasis 多签钱包。对利用者的另一个 Vault(30179)也执行了类似的操作。

步骤 3.5 恢复状态

恢复 Service Registry 中更改的条目,并重新启用延迟执行。
步骤 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



