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.



