最近、Oasisマルチシグを介したMakerDao Vaultからの資金移動に対する「カウンターエクスプロイト」 に大きな注目が集まっています。その中で、2月18日にPlatypusを支援して240万ドルを救済するためのカウンターエクスプロイトに関与した ため、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がOasisが提供する自動売買サービスを有効にしたため、ExploiterのMaker Vaultは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を呼び出して、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:ExploiterのVaultをクローズするようにAutomationBotに依頼する
重要なプロセスは、AutomationBotのexecute関数から始まります。詳細な実行関数は引数で渡されます。
プロセス全体を理解するために、まずこの関数を見てみましょう。

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


isExecutionCorrectがCloseCommandで呼び出され、実行が成功したかどうかを確認することに注意してください(AutomationBot.solの278行目)。viewアドレスが更新されているため、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



