Back to Blog

A Perspectiva da BlockSec sobre o "Counter Exploit" da Jump: A Vulnerabilidade Realmente Existe?

Code Auditing
March 1, 2023
8 min read
Foto por Kevin Ku no Unsplash
Foto por Kevin Ku no Unsplash

Recentemente, tem havido muita atenção sobre o "contra-exploit" para mover fundos do MakerDao Vault usando o multisig da Oasis. Enquanto isso, recebemos algumas perguntas sobre se a BlockSec é o "whitehat" por trás desta operação, já que estivemos envolvidos no contra-exploit para ajudar a Platypus a resgatar 2,4 milhões em 18 de fevereiro. Queremos esclarecer que a BlockSec não está envolvida em nenhuma das ações no caso Jump. Após uma análise detalhada (Parabéns pela excelente análise publicada no BlockWorks por Dan Smith), achamos que a forma envolvida no "contra-exploit" da Jump é fundamentalmente diferente do caso Platypus.

Além disso, de acordo com o comunicado da Oasis, o contra-exploit é possível devido a uma vulnerabilidade no acesso ao multisig de administrador

captura de tela do comunicado da Oasis
captura de tela do comunicado da Oasis

No entanto, de acordo com nossa análise, as etapas principais do contra-exploit são:

  • Desabilitar a execução com atraso. Isso é projetado para ser feito pelo proprietário do contrato Service Registry, que é a carteira Oasis Multisig.
  • Alterar o endereço do contrato registrado para funções críticas, incluindo AUTOMATION_EXECUTOR para o contrato AutomationBot e MCD_VIEW, MULTIPLY_PROXY_ACTIONS para o contrato CloseCommand. Isso permite que a carteira multisig da Oasis invoque diretamente o AutomationBot para executar o comando de fechamento, cuja operação realmente executada é substituída por uma nova para transferir os Vaults do Explorador.

Nossa análise sugere que essas etapas principais NÃO se devem às vulnerabilidades alegadas no acesso ao multisig de administrador.

Aviso: Este blog foi escrito com base em transações on-chain e informações públicas. Se você tiver alguma dúvida ou comentário, sinta-se à vontade para nos contatar em [email protected].

O Processo Geral

Alguns endereços estiveram envolvidos durante esta operação. Listamos alguns deles no seguinte documento do Google.

https://docs.google.com/spreadsheets/d/1k0PEci8wQ16X7JT7KRq9SvhaCA2yerJcqLn6EfAoPZs/edit?usp=sharing

Especificamente, a ideia de alto nível para o contra-exploit da Jump é a seguinte.

  1. Os Maker Vaults do Explorador podem ser gerenciados pelo contrato inteligente AutomationBot da Oasis, já que o Explorador habilita os serviços de venda e compra automática oferecidos pela Oasis.

  2. O AutomationBot só pode ser operado pelo endereço com a função AUTOMATION_EXECUTOR. Este endereço é uma configuração no contrato Oasis Service Registry, que pode ser atualizado pela carteira multisig da Oasis. No entanto, a atualização da configuração do contrato Oasis Service Registry tem um mecanismo de execução com atraso, que pode ser desabilitado pela carteira multisig da Oasis.

  3. O contrato real e a função executada pelo AutomationBot também são configuráveis no Oasis Service Registry.

Portanto, a carteira multisig da Oasis primeiro desabilita a execução com atraso do contrato Oasis Service Registry e altera a configuração no contrato Oasis Service Registry para definir a função AUTOMATION_EXECUTOR como ela mesma (carteira multisig). A alteração entra em vigor imediatamente. Em seguida, a carteira multisig invoca o AutomationBot para executar um comando que pode assumir o controle dos Maker Vaults do Explorador (shift e give). Como o AutomationBot pode gerenciar os Vaults do Explorador, toda a operação pode ser bem-sucedida.

Achamos que esse processo é fundamentalmente diferente do caso Platypus, onde encontramos uma vulnerabilidade no contrato do atacante e a compartilhamos com a Platypus. Em seguida, a Platypus explorou o contrato do atacante para mover os fundos que pertenciam a eles mesmos. No entanto, no caso Jump, o multisig da Oasis desabilita o mecanismo de execução com atraso, atualiza as configurações críticas que podem alterar completamente o comportamento do contrato e aproveita a função de gerenciamento do AutomationBot para operar nos Vaults do Maker em nome do Explorador.

A seguir, detalharemos todo o "contra-exploit" da Jump.

As Etapas Detalhadas

A operação envolve múltiplos protocolos e partes, incluindo Jump, Oasis, Wormhole Exploiter e Maker. Observe que o Maker não realiza nenhuma ação durante a operação.

Especificamente, o Explorador cria Maker Vaults (30100 e 30179) e usa ETH como garantia, e toma emprestado DAI do vault. O Explorador também utilizou os serviços de venda e compra automática oferecidos pela Oasis para gerenciar a taxa de colateralização do vault do Maker.

Para usar o serviço de automação da Oasis, um contrato inteligente chamado AutomationBot oferecido pela Oasis precisa ser adicionado à lista de gerenciamento do Vault. Isso significa que o AutomationBot tem controle sobre o Maker Vault criado pelo Explorador. Após isso, o AutomationBot pode manipular o Vault e transferir o colateral e a dívida do Vault para outro, que é controlado pela Jump. Este é o processo básico do "contra-exploit." Observe que, para invocar o AutomationBot, a transação precisa ser invocada a partir do endereço registrado como AUTOMATION_EXECUTOR no contrato ServiceRegistry.

Etapa 1: adicionar o endereço 04e1 na carteira multisig da Oasis

A transação adiciona o endereço 04e1 na carteira multisig da Oasis. Esta carteira atualmente possui 12 endereços, com confirmações de quatro signatários.

Etapa 2: Desabilitar a execução com atraso do Oasis Service Registry

Esta transação desabilita a execução com atraso do Oasis Service Registry invocando changeRequiredDela(0). Observe que o Oasis Service Registry é um contrato inteligente que armazena informações de configuração críticas que serão usadas pelo AutomationBot. Normalmente, a alteração de configuração possui um mecanismo de execução com atraso para operações críticas, por exemplo, updateNamedService, que será usado no "contra-exploit." Geralmente, a execução com atraso é um mecanismo de segurança para transparência, de modo que a atualização de informações críticas não entre em vigor imediatamente, permitindo que outros possam dar uma segunda olhada.

Observe que a execução para invocar changeRequiredDelay é restringida pela execução com atraso (já que a alteração para reqDelay) ainda não entrou em vigor.

ServiceRegistry.sol
ServiceRegistry.sol

Etapa 3: Executar o contra-exploit

Esta transação executa o contra-exploit. Vamos mergulhar no rastreamento de execução gerado pelo Phalcon, a ferramenta de análise de transações desenvolvida pela BlockSec.

Observe que esta transação é inicializada a partir do endereço 04e1 e executada através da carteira multisig da Oasis, o que significa que a operação é assinada por pelo menos quatro signatários.

Etapa 3.1 Desabilitar a execução com atraso

Como mostrado no rastreamento, o atraso é definido como zero novamente. Isso é para aplicar a ação de desabilitar a execução com atraso da etapa 2.

Etapa 3.2: Criar dois contratos e atualizar o registro de serviços

Dois novos contratos são criados, que serão usados como os contratos MCD_VIEW e MULTIPLY_PROXY_ACTIONS.

  • MCD_VIEW: 0xceca8d8410797bc6c575fd8ba957708d1e85ed36
  • MULTIPLY_PROXY_ACTIONS: 0xcaef24016d0fba2c1a9427371e0d79c5781b6ea8

Em seguida, esses dois contratos serão atualizados no contrato de registro de serviços da Oasis.

Etapa 3.3: Alterar o Executor de Automação

O multisig da Oasis é registrado como o AUTOMATION_EXECUTOR no contrato ServiceRegistry. Isso é necessário, pois somente o contrato registrado com esta função pode invocar o contrato AutomationBot.

AutomationBot.sol
AutomationBot.sol
AutomationBot.sol
AutomationBot.sol

Etapa 3.4: Solicitar ao AutomationBot que feche o Vault do Explorador

O processo crítico começa pela função execute do AutomationBot. As funções detalhadas executadas são passadas através dos argumentos.

Para entender todo o processo, primeiro damos uma olhada nesta função.

AutomationBot.sol
AutomationBot.sol

A lógica de alto nível é que o bot primeiro retira DAI do vault (linha 268) e depois invoca o contrato de comando concreto para executar no vault (especificado por cdpId) (linha 274 a linha 278). Durante o processo, o endereço do comando é o contrato CloseCommand. Após isso, uma verificação de isExecutionCorrect é necessária.

O seguinte mostra a função execute do contrato CloseCommand. Ele obtém o endereço real do contrato executor do contrato de registro de serviços usando a CHAVE MULTIPLY_PROXY_ACTIONS. Observe que o endereço do contrato correspondente ao MULTIPLY_PROXY_ACTIONS foi atualizado para um novo. Assim, a execução real do CloseCommand é controlável para realizar operações arbitrárias no novo contrato.

CloseCommand.sol
CloseCommand.sol
CloseCommand.sol
CloseCommand.sol

Lembre-se de que o isExecutionCorrect é invocado no CloseCommand para verificar se a execução foi bem-sucedida (linha 278 no AutomationBot.sol). Como o endereço de visualização foi atualizado, o valor de retorno da verificação viewerContract.getVaultInfo(cdpId) pode ser um valor arbitrário que pode passar na verificação da linha 24 (CloseCommand.sol).

Após percorrer o código, vamos observar o rastreamento de execução. A partir do rastreamento, podemos ver que o automationBot invoca o contrato CloseCommand. O contrato CloseCommand pode invocar o contrato MULTIPLY_PROXY_ACTIONS substituído para abrir um novo Vault (30231), transferir o Vault 30100 (o do Explorador) para o 30231 (o recém-criado) e entregar o novo Vault 30231 para a Carteira Multisig da Oasis. Uma operação semelhante é realizada no outro Vault do Explorador (30179).

Etapa 3.5 Restaurar o estado

Restaurar a entrada alterada no Service Registry e habilitar novamente a execução com atraso.

Etapa 3.6 Entregar os Vaults para o endereço 1536

Agora os novos Vaults (30231 e 30232) são controlados pela Carteira Multisig da Oasis. Em seguida, os Vaults são entregues para 0x15364305a06ba3ac6ba13dfe97ca0bad639adf41 nestas transações [TX1 TX2]. Em seguida, este endereço pode pagar a dívida no Vault e retirar o colateral (Ethereum). Como a taxa de colateralização é alta (em torno de 293% para o vault 30100), pagar de volta e retirar o colateral pode recuperar cerca de 120 mil Ethereum com o custo de pagar aproximadamente 76 milhões em dívida do vault 30100. Os leitores podem consultar a documentação do protocolo Maker para mais informações sobre estas operações.

Sobre a BlockSec

A BlockSec é uma empresa pioneira em segurança blockchain fundada em 2021 por um grupo de especialistas em segurança mundialmente reconhecidos. A empresa está comprometida em aprimorar a segurança e a usabilidade para o emergente mundo Web3, a fim de facilitar sua adoção em massa. Para isso, a BlockSec oferece serviços de auditoria de segurança de contratos inteligentes e chains EVM, a plataforma Phalcon para desenvolvimento de segurança e bloqueio proativo de ameaças, a plataforma MetaSleuth para rastreamento e investigação de fundos, e a extensão MetaSuites para construtores web3 navegarem com eficiência no mundo cripto.

Até o momento, a empresa atendeu mais de 300 clientes estimados, como MetaMask, Uniswap Foundation, Compound, Forta e PancakeSwap, e recebeu dezenas de milhões de dólares americanos em duas rodadas de financiamento de investidores proeminentes, incluindo Matrix Partners, Vitalbridge Capital e Fenbushi Capital.

Site oficial: https://blocksec.com/

Conta oficial no Twitter: https://twitter.com/BlockSecTeam

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit