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

しかし、我々の分析によると、カウンターエクスプロイトの主要なステップは以下の通りです:
- 遅延実行を無効化する。これはService Registryコントラクトのオーナー、つまりOasisマルチシグウォレットによって実行されるように設計されています。
- AutomationBotコントラクトのAUTOMATION_EXECUTORやCloseCommandコントラクトのMCD_VIEW、MULTIPLY_PROXY_ACTIONSなど、重要なロールの登録済みコントラクトアドレスを変更する。これにより、OasisマルチシグウォレットはAutomationBotを直接呼び出し、ExploiterのVaultをシフトするために実行される実際の操作を新しいものに置き換えることができます。
我々の分析では、これらの主要なステップは、管理マルチシグアクセスにおける主張された脆弱性によるものではないことを示唆しています。
免責事項:このブログは、オンチェーントランザクションと公開情報に基づいて作成されています。ご質問やご意見がありましたら、[email protected]までお気軽にお問い合わせください。
全体プロセス
この操作には複数のアドレスが関与しました。それらのいくつかを以下の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を呼び出す実行は、change to reqDelayがまだ有効になっていないため、遅延実行によって制限されています。


ステップ3:カウンターエクスプロイトを実行
このトランザクションは、カウンターエクスプロイトを実行します。BlockSecが開発したトランザクション分析ツールであるPhalconによって出力された実行トレースを見てみましょう。
このトランザクションはアドレス04e1から初期化され、Oasisマルチシグウォレットを介して実行されることに注意してください。これは、操作が少なくとも4つの署名者によって署名されていることを意味します。
ステップ3.1:遅延実行を無効化
トレースに示すように、遅延は再びゼロに設定されます。これは、ステップ2の遅延実行無効化のアクションを適用するためです。

ステップ3.2:2つのコントラクトを作成し、サービスレジストリを更新
MCD_VIEWおよびMULTIPLY_PROXY_ACTIONSコントラクトとして使用される2つの新しいコントラクトが作成されます。
- 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行目)、次にVault(cdpIdで指定)に対して実行される具体的なコマンドコントラクトを呼び出す(274行目から278行目)というものです。このプロセス中、コマンドアドレスはCloseCommandコントラクトです。その後、isExecutionCorrectのチェックが必要です。
以下は、CloseCommandコントラクトのexecute関数を示しています。これは、Service RegistryコントラクトからKEY MULTIPLY_PROXY_ACTIONSを使用して実際のexecutorコントラクトアドレスを取得します。MULTIPLY_PROXY_ACTIONSに対応するコントラクトアドレスは新しいものに更新されていることに注意してください。そのため、CloseCommandの実際の実行は、新しいコントラクトで任意の操作を実行できるように制御可能です。


isExecutionCorrectがCloseCommandで呼び出され、実行が成功したかどうかを確認すること(AutomationBot.solの278行目)を覚えておいてください。ビューアドレスが更新されているため、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マルチシグウォレットによって制御されます。その後、これらのトランザクション [TX1 TX2] でVaultは0x15364305a06ba3ac6ba13dfe97ca0bad639adf41に譲渡されます。その後、このアドレスはVaultの借入金を支払い、担保(Ethereum)を引き出すことができます。担保化率は高い(Vault 30100で約293%)ため、担保の返済と引き出しにより、約7600万の借入金の支払いをコストとして、約12万ETHを取り戻すことができます。これらの操作に関する詳細については、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



