Back to Blog

Como o Protocolo Mirror foi Explorado

Code Auditing
31 de maio de 2022
4 min read

O Protocolo Mirror foi reportado por @FatMan como tendo sido explorado. O blog possui um bom relatório sobre isso. Neste breve artigo, utilizaremos a transação do ataque para explicar como isso aconteceu.

Aviso Legal: Este artigo é baseado na transação pública e em nosso entendimento do protocolo Mirror e do ecossistema Terra. Por favor, nos informe caso haja qualquer imprecisão. Comentários sobre este blog são bem-vindos.

1 Ataque

1.1 Preparação

A transação foi utilizada para preparar os ataques.

PASSO 1: Nesta transação, o atacante primeiro enviou 100.000 USTC ao contrato de bloqueio. Isso não é necessário para abrir uma posição, mas é fundamental para o ataque.

PASSO 2: Após isso, o atacante abriu uma posição depositando 10 USTC como garantia e especificando o collateral_ratio como 2,5.

O short_params é especificado para que o contrato de mint venda os mAssets cunhados (ou seja, mETH) e adicione o USTC obtido ao valor bloqueado da posição.

PASSO 2.1: Vamos percorrer a transação passo a passo. Primeiro, a função open_position será invocada para abrir uma posição vendida cujo ID é 43186.

PASSO 2.2: Como o short_params opcional foi adicionado, o contrato primeiro cunhará 0,001208 mETH (com base no preço atual do ETH) e então o venderá por meio de uma troca no mETH-UST Pair.

PASSO 2.3: O 0,001208 mETH será trocado por 4,06582 USTC; o USTC obtido será enviado ao contrato de bloqueio após a remoção das taxas relacionadas (por exemplo, impostos). Isso ocorre porque a posição aberta só pode ser desbloqueada após um determinado período de tempo.

PASSO 2.4: Em seguida, lock_position_funds_hook será invocado. Nessa função, position_locked_amount será calculado consultando o current_balance e comparando o current_balance com os locked_funds.

No entanto, como vimos no Passo 1, 100.000 USTC foram transferidos diretamente para o contrato de bloqueio; portanto, o locked_amount será de aproximadamente 100.004 USTC em vez de 4 USTC.

PASSO 2.5: Por fim, increase_short_token será invocado para registrar os tokens sLP.

Até este ponto, o atacante abriu uma posição enviando 100.000 USTC diretamente ao contrato de bloqueio e 10 USTC como garantia. O valor bloqueado da posição é de aproximadamente 100.004 USTC e pode ser desbloqueado após um período de tempo. O atacante abriu muitas posições desse tipo enviando entre 1.000 e 100.000 USTC.

1.2. Ataque

O Protocolo Mirror não verifica a duplicação do ID de posição. Nesse caso, o atacante pode fornecer muitos IDs de posição duplicados para desbloquear o valor bloqueado de uma posição repetidamente.

A transação é a transação do ataque. Por exemplo, para o ID de posição 43186, o atacante o duplicou 437 vezes.

Como o código original do contrato não verifica a duplicação, aproximadamente 43,7M (437 * 0,1M) USTC foram desbloqueados (nesta única chamada de função).

Observe que as demais posições foram desbloqueadas com o mesmo mecanismo.

2. Correção do Bug

A vulnerabilidade foi corrigida neste commit.

Especificamente, unlockable_positions é um vetor contendo os IDs de posição a serem desbloqueados. No código original, não há verificação sobre a existência de IDs duplicados em unlockable_positions. O código corrigido adiciona uma verificação para a duplicação dos IDs de posição.

3. Conclusão

Conforme apontado por @FatMan e outros membros da comunidade, esse bug existiu por alguns meses e foi explorado em produção. Acreditamos que corrigir silenciosamente uma vulnerabilidade que já foi explorada em produção não é uma boa prática de segurança. Além disso, também consideramos que projetos DeFi de alto perfil deveriam implementar mecanismos de vigilância para monitorar ativamente o status de seus aplicativos e receber alertas quando algo incomum ocorrer.

Sign up for the latest updates
Perdas de ~5,57 milhões USD: exploração de falhas no X100 Freezer e no NEM | Boletim semanal da BlockSec
Security Insights

Perdas de ~5,57 milhões USD: exploração de falhas no X100 Freezer e no NEM | Boletim semanal da BlockSec

Este relatório semanal aborda dois incidentes de segurança na Ethereum e na BNB Chain no período de 19/10/2026–25/10/2026. Ele examina uma tomada de controle da governança do X100 Freezer financiada por um empréstimo-relâmpago e uma falha na liquidação de impostos que afetou um pool de liquidez de um token NEM na BNB Chain. As perdas estimadas no escopo do relatório totalizam aproximadamente 5,57 milhões USD: cerca de 4,75 milhões USD da transação representativa do X100 e cerca de 820 mil USD do incidente no pool do NEM. O total exclui as extrações subsequentes do X100 relatadas separadamente.

Perdas de ~3,87 milhões USD: ataques à Autheo Network e à UNCX | Resumo semanal da BlockSec
Security Insights

Perdas de ~3,87 milhões USD: ataques à Autheo Network e à UNCX | Resumo semanal da BlockSec

Este relatório semanal aborda 3 incidentes de segurança no período de 12/10/2026–18/10/2026, com perdas totais estimadas em aproximadamente 3,87 milhões USD. A Autheo Network sofreu um comprometimento de chave privada com perdas de cerca de 1,76 milhões USD, a Qubic Wallet perdeu cerca de 1,30 milhões USD devido à geração de seeds fracas, e os contratos Smart Token Vesting V2 da UNCX Network sofreram um erro contábil de cerca de 807 mil USD nas redes Ethereum, BNB Chain, Base e Robinhood Chain. A análise em destaque da UNCX explica como um cálculo incorreto do total de cotas misturou parcelas de vesting criadas com diferentes proporções entre tokens e cotas, permitindo saques acima do devido de pools compartilhados.

~US$ 542 mil perdidos: ataque ao MakerDaoBot | Boletim semanal da BlockSec
Security Insights

~US$ 542 mil perdidos: ataque ao MakerDaoBot | Boletim semanal da BlockSec

O relatório cobre 1 incidente no Ethereum (05–11/10/2026), com perda estimada de US$ 542 mil. Um adaptador malicioso obteve acesso aos saldos MakerDAO via função desprotegida do MakerDaoBot, liquidou 4 leilões ETH-A e converteu 200 ETH-A em WETH, depois enviados como ETH ao atacante.

Best Security Auditor for Web3

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

BlockSec Audit