
最近、MakerDao VaultからOasisマルチシグを利用して資金を移動させる「カウンターエクスプロイト」について多くの注目が集まっています。また、2月18日にPlatypusを支援して240万ドルを救済するためのカウンターエクスプロイトに関与したため、BlockSecがこの操作の「ホワイトハット」ではないかという問い合わせもいくつか受けています。***Jumpのケースにおけるいかなる行動にもBlockSecは関与していないことを明確にしたいと考えています。***詳細な分析(Dan SmithによるBlockWorksでの素晴らしい分析に感謝します)の後、Jumpの「カウンターエクスプロイト」への関与方法は、Platypusのケースとは根本的に異なると考えています。
さらに、Oasisの声明によると、カウンターエクスプロイトは管理マルチシグアクセスにおける脆弱性により可能になったとのことです。

しかし、我々の分析によれば、カウンターエクスプロイトの主要なステップは以下の通りです。
- 遅延実行を無効にする。これはService Registryコントラクトのオーナー、すなわちOasisマルチシグウォレットによって行われるように設計されています。
- AutomationBotコントラクトのAUTOMATION_EXECUTOR、およびCloseCommandコントラクトのMCD_VIEW、MULTIPLY_PROXY_ACTIONSを含む重要なロールの登録済みコントラクトアドレスを変更する。これにより、OasisマルチシグウォレットはAutomationBotを直接呼び出してcloseコマンドを実行できるようになり、その実際の実行操作は、ExploiterのVaultをシフトする新しいものに置き換えられます。
我々の分析は、これらの主要なステップが、主張されている管理マルチシグアクセスにおける脆弱性に起因するものではないことを示唆しています。
免責事項:このブログは、オンチェーントランザクションと公開情報に基づいて執筆されています。ご質問やご意見がありましたら、contact@blocksec.comまでお気軽にお問い合わせください。
全体プロセス
この操作には複数のアドレスが関与しました。それらの一部を以下のGoogleドキュメントにリストアップします。
https://docs.google.com/spreadsheets/d/1k0PEci8wQ16X7JT7KRq9SvhaCA2yerJcqLn6EfAoPZs/edit?usp=sharing
具体的には、Jumpのカウンターエクスプロイトの概要は以下の通りです。
- ExploiterのMaker Vaultは、ExploiterがOasisが提供する自動売買サービスを有効にしたため、Oasis AutomationBotスマートコントラクトによって管理される可能性があります。
- AutomationBotは、Oasis Service Registryコントラクトの設定で、AUTOMATION_EXECUTORというロールを持つアドレスによってのみ操作できます。このアドレスはOasisマルチシグウォレットによって更新可能です。しかし、Oasis Service Registryコントラクトの設定更新には遅延実行メカニズムがあり、Oasisマルチシグウォレットによって無効化することができます。
- AutomationBotによって実行される実際のコントラクトと関数も、Oasis Service Registryで設定可能です。
したがって、OasisマルチシグウォレットはまずOasis Service Registryコントラクトの遅延実行を無効にし、Oasis Service Registryコントラクトの設定を変更してAUTOMATION_EXECUTORロールを自身(マルチシグウォレット)に設定します。この変更は即座に有効になります。その後、マルチシグウォレットはAutomationBotを呼び出し、ExploiterのMaker Vaultを乗っ取る(シフトして譲渡する)コマンドを実行します。AutomationBotはExploiterのVaultを管理できるため、操作全体は成功します。
このプロセスは、我々が攻撃者のコントラクトに脆弱性を見つけ、Platypusと共有したPlatypusのケースとは根本的に異なると考えています。その後、Platypusは攻撃者のコントラクトを悪用して、自身の資金を移動させました。しかし、Jumpのケースでは、Oasisマルチシグは遅延実行メカニズムを無効にし、コントラクトの動作を完全に変更できる重要な設定を更新し、AutomationBotの管理ロールを活用してExploiterに代わってMakerのVaultを操作しています。
以下で、Jumpの「カウンターエクスプロイト」の全体像を詳しく説明します。
詳細なステップ
この操作には、Jump、Oasis、Wormhole Exploiter、Makerなど、複数のプロトコルと当事者が関与しています。Makerはこの操作中にいかなる行動も取っていないことに注意してください。
具体的には、ExploiterはMaker Vault(30100および30179)を作成し、ETHを担保として使用し、VaultからDAIを借入しています。Exploiterはまた、Oasisが提供する自動売買サービスを利用してMaker Vaultのコラテラリゼーション比率を管理しています。
Oasisの自動化サービスを使用するには、Oasisが提供するAutomationBotというスマートコントラクトを、Vaultの管理リストに追加する必要があります。これは、AutomationBotがExploiterによって作成された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マルチシグウォレットを通じて実行されていることに注意してください。これは、操作が少なくとも4つの署名者によって署名されていることを意味します。
ステップ3.1:遅延実行を無効にする
トレースに示すように、遅延が再びゼロに設定されます。これは、ステップ2の遅延実行無効化のアクションを適用するためです。

ステップ3.2:2つのコントラクトを作成し、サービスレジストリを更新する
2つの新しいコントラクトが作成され、MCD_VIEWおよびMULTIPLY_PROXY_ACTIONSコントラクトとして使用されます。
- MCD_VIEW: 0xceca8d8410797bc6c575fd8ba957708d1e85ed36
- MULTIPLY_PROXY_ACTIONS: 0xcaef24016d0fba2c1a9427371e0d79c5781b6ea8
その後、これらの2つのコントラクトはOasisサービスレジストリコントラクトに更新されます。

ステップ3.3:Automation Executorを変更する

Oasisマルチシグは、ServiceRegistryコントラクトでAUTOMATION_EXECUTORとして登録されています。これは、このロールを持つ登録済みコントラクトのみがAutomationBotコントラクトを呼び出すことができるため、必要です。


ステップ3.4:AutomationBotにExploiterのVaultをクローズするように依頼する
重要なプロセスは、AutomationBotのexecute関数から開始されます。詳細な実行関数は引数として渡されます。
プロセス全体を理解するために、まずこの関数を見てみましょう。

高レベルなロジックは、ボットがまずVaultからDAIを引き出し(268行目)、その後、cdpIdで指定されたVaultに対して実行される具体的なコマンドコントラクトを呼び出す(274行目から278行目)というものです。このプロセス中、コマンドアドレスはCloseCommandコントラクトです。その後、isExecutionCorrectのチェックが必要です。
以下は、CloseCommandコントラクトのexecute関数の表示です。これは、Service RegistryコントラクトからKEY MULTIPLY_PROXY_ACTIONSを使用して実際のexecutorコントラクトアドレスを取得します。MULTIPLY_PROXY_ACTIONSに対応するコントラクトアドレスは新しいものに更新されていることに注意してください。そのため、CloseCommandの実際の実行は、新しいコントラクトで任意の操作を実行できるように制御可能です。


isExecutionCorrectがCloseCommandで呼び出され、実行が成功したかどうかを確認することに注意してください(AutomationBot.solの278行目)。ビューアドレスが更新されているため、check viewerContract.getVaultInfo(cdpId)の戻り値は、24行目(CloseCommand.sol)のチェックを通過できる任意の値を返します。
コードを調べた後、実行トレースを見てみましょう。トレースから、AutomationBotがCloseCommandコントラクトを呼び出していることがわかります。CloseCommandコントラクトは、置換されたMULTIPLY_PROXY_ACTIONSコントラクトを呼び出して新しいVault(30231)を開き、Vault 30100(Exploiterのもの)を30231(新しく作成されたもの)にシフトし、新しいVault 30231をOasisマルチシグウォレットに譲渡することができます。Exploiterのもう一方のVault(30179)に対しても同様の操作が行われます。

ステップ3.5:状態を復元する

Service Registryの変更されたエントリを復元し、遅延実行を再度有効にします。
ステップ3.6:Vaultをアドレス1536に譲渡する
これで、新しいVault(30231および30232)はOasisマルチシグウォレットによって制御されます。その後、これらのVaultはこれらのトランザクション[TX1 TX2]で0x15364305a06ba3ac6ba13dfe97ca0bad639adf41に譲渡されます。その後、このアドレスはVaultの債務を返済し、担保(Ethereum)を引き出すことができます。コラテララリゼーション比率が高い(Vault 30100で約293%)ため、担保の返済と引き出しにより、Vault 30100の約7600万の債務を返済するコストで、約12万Ethereumを取り戻すことができます。これらの操作に関する詳細については、Makerプロトコルのドキュメントを参照してください。

BlockSecについて
BlockSecは、世界的に著名なセキュリティ専門家グループによって2021年に設立された、先駆的なブロックチェーンセキュリティ企業です。同社は、新興のWeb3の世界のセキュリティとユーザビリティを向上させ、その大規模な採用を促進することにコミットしています。この目的のために、BlockSecはスマートコントラクトおよびEVMチェーンのセキュリティ監査サービス、セキュリティ開発と脅威のプロアクティブなブロックのためのPhalconプラットフォーム、資金追跡と調査のためのMetaSleuthプラットフォーム、そしてWeb3ビルダーが仮想通貨の世界を効率的にサーフィンするためのMetaSuites拡張機能を提供しています。
今日まで、同社はMetaMask、Uniswap Foundation、Compound、Forta、PancakeSwapなど300社以上の著名なクライアントにサービスを提供し、Matrix Partners、Vitalbridge Capital、Fenbushi Capitalなどの著名な投資家から2回の資金調達ラウンドで数千万米ドルを受け取っています。
公式ウェブサイト:https://blocksec.com/ 公式Twitterアカウント:https://twitter.com/BlockSecTeam



