Back to Blog

A Análise do Incidente de Segurança da Ponte Neural

Code Auditing
November 18, 2021
5 min read

0x.1 Prefácio

Em 15 de novembro de 2021, nosso sistema interno de monitoramento detectou transações suspeitas de flashloan na BSC. Após investigação, descobrimos que se tratava de um ataque direcionado ao Nerve Bridge, incluindo os MetaPools de fUSDT e UST.

Figura 1: um exemplo de transação de ataque
Figura 1: um exemplo de transação de ataque

No momento da redação deste artigo, o atacante havia esgotado a liquidez de fUSDT e UST dos pools de staking da Nerve, obtendo um lucro de 900 BNB.

Surpreendentemente, descobrimos que o código vulnerável foi bifurcado (forked) do Saddle.Finance, que já havia causado uma perda de $800M no Synapse Bridge em 6 de novembro de 2021. Especificamente, a causa raiz da vulnerabilidade vem da implementação inconsistente do cálculo do valor de troca de tokens em diferentes bibliotecas.

No entanto, NÃO existe nenhum relatório público disponível para analisar este incidente de segurança. Portanto, neste blog, nosso objetivo é fornecer uma análise abrangente, incluindo o mecanismo do projeto, a vulnerabilidade e o ataque.

0x2. Contexto

0x2.1 O que é MetaPool?

Basicamente, a Curve oferece dois tipos de pools de troca de stablecoins, ou seja, o Pool StableSwap Padrão e o MetaPool. O primeiro é um AMM completo para criar mercados cruzados entre diferentes stablecoins [1]. É o tipo de pool mais amplamente utilizado, como o Curve.3pool, que consiste em DAI, USDC e USDT. No entanto, esse pool não consegue isolar o risco entre as stablecoins, o que pode levar a grandes perdas para os provedores de liquidez (LP).

Assim, o MetaPool foi proposto para resolver esse problema. Conforme declarado pela Curve [2], "ele permite que uma única moeda seja agrupada com todas as moedas de outro pool (base) sem diluir sua liquidez". É essencialmente um pool de troca entre uma stablecoin e um token LP de um Pool StableSwap Padrão (que consiste em várias outras stablecoins). Em nosso contexto, chamamos esses dois tipos de stablecoins de pool stablecoin e underlying stablecoin, respectivamente.

Por exemplo, uma das vítimas deste incidente é justamente o MetaPool de fUSDT e o token LP do Nerve.3pool (incluindo BUSD, USD e USDC), e a estrutura desse pool é essencialmente [fUSDT, token LP de (BUSD, USD, USDC)]. Assim, fUSDT é a pool stablecoin, enquanto BUSD, USD e USDC são as underlying stablecoins.

Figura 2: Nerve.3pool
Figura 2: Nerve.3pool

0x2.2 Origem do Código Vulnerável

O MetaPool da Curve é implementado em Vyper. Para suportar o desenvolvimento em Solidity, a equipe de desenvolvimento da Saddle.Finance reescreveu o código em Solidity. Sendo a origem desta vulnerabilidade, ele foi bifurcado e adotado pela Synapse e pela Nerve, respectivamente. Em 6 de novembro, a Synapse foi atacada.

Figura 3: transações de ataque direcionadas à Synapse
Figura 3: transações de ataque direcionadas à Synapse

Aproximadamente $8,2M em fundos foram drenados do MetaPool, mas nenhum fundo foi efetivamente perdido devido a um erro "bobo" cometido pelo atacante [3].

Após isso, a Saddle.Finance tomou uma ação emergencial para garantir a segurança de seus fundos, pausando todos os contratos MetaPool. No entanto, a Nerve Bridge não tomou nenhuma medida, o que inevitavelmente levou a este incidente de segurança.

Os endereços de contrato relevantes estão listados a seguir:

  • MetaSwap: 0xd0fBF0A224563D5fFc8A57e4fdA6Ae080EbCf3D3
  • SwapUtils: 0x02338Ee742ddCDe44488640F4edf1Aa947E670E7

0x3. Análise da Vulnerabilidade

No MetaPool, existem duas funções importantes, ou seja, swap e swapUnderlying. Especificamente, a primeira é usada para trocar o token LP pela pool stablecoin, enquanto a segunda é usada para trocar a pool stablecoin pelas underlying stablecoins.

swap: função _calculateSwap
swap: função _calculateSwap
swapUnderlying: função _calculateSwapUnderlying
swapUnderlying: função _calculateSwapUnderlying

No entanto, as duas funções são implementadas de forma inconsistente. Como mostrado nas duas figuras acima. O trecho de código no retângulo vermelho é usado para ajustar o valor do token LP medindo o "preço virtual" de um token LP (que aumenta a partir de um valor base de 1 à medida que mais taxas são acumuladas). Ao mesmo tempo, a função swap ignora o impacto do preço virtual, o que significa que o valor do token LP será subestimado. Em outras palavras, mais tokens LP poderiam ser trocados.

Como resultado, é possível obter mais pool stablecoins primeiro resgatando a liquidez das underlying stablecoins com o token LP correspondente, e depois trocando pool stablecoins invocando a função swapUnderlying.

0x4. Análise do Ataque

Utilizaremos a transação de exemplo para ilustrar o ataque.

Figura 6: as cinco etapas do ataque
Figura 6: as cinco etapas do ataque

A Figura 6 mostra que o atacante executou as seguintes cinco etapas para lançar o ataque:

  • Etapa 1: empréstimo de 50.000 BUSD usando Flashloan do Fortube
  • Etapa 2: troca de 50.000 BUSD por 50.351 fUSDT na Ellipsis.
  • Etapa 3: invocação da função swap do MetaSwap para trocar 50.351 fUSDT por 36.959 Nerve 3-LP com um slippage relativamente alto.
  • Etapa 4: invocação da função removeLiquidityOneCoin do Nerve.3pool com os tokens LP (recebidos na etapa anterior) para remover a liquidez de BUSD, ou seja, 37.071 BUSD.
  • Etapa 5: invocação da função swapUnderlying do MetaSwap para trocar BUSD por fUSDT, recebendo 51.494 fUSDT.

O atacante executou repetidamente as cinco etapas acima (mais de 200 transações) para drenar a liquidez do MetaPool e, por fim, obteve 900 BNB.

Curiosamente, o atacante adotou a mesma abordagem utilizada no incidente da Synapse, que não é uma forma otimizada de atingir o objetivo. Alternativamente, seria possível lançar ataques de forma mais eficiente, por exemplo, aplicando parâmetros otimizados para drenar a liquidez em uma única transação. O resultado sugere que o atacante pode NÃO ter compreendido totalmente a causa raiz desta vulnerabilidade.

Referências

[1] https://curve.fi/files/stableswap-paper.pdf

[2] https://resources.curve.fi/lp/depositing/depositing-into-a-metapool/

[3] https://synapseprotocol.medium.com/11-06-2021-post-mortem-of-synapse-metapool-exploit-3003b4df4ef4

Créditos: Hailin Wang, Lei Wu, Yajin Zhou @BlockSec

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