Back to Blog

Deposite Menos, Receba Mais: Detalhes do Ataque ao yCREDIT

Code Auditing
January 3, 2021
3 min read

Em 2 de janeiro de 2021 (Horário de Pequim 07:25), nosso sistema de monitoramento ThunderForecast reportou uma série de transações suspeitas direcionadas ao contrato inteligente yCREDIT. Em seguida, utilizamos o sistema EthScope desenvolvido por nossa equipe de pesquisa para analisar essas transações e confirmar que todas as transações reportadas são maliciosas. Neste blog, ilustramos os detalhes do ataque.

Detalhes

O ataque ocorre devido ao fato de que a quantidade de tokens cunhados é inconsistente com a quantidade pretendida. Dessa forma, o atacante consegue obter muito mais tokens yCREDIT a um preço menor. Em seguida, esses tokens podem ser vendidos para obter lucros.

A função vulnerável está na função _deposit do contrato StableYieldCredit.

A seguir, utilizaremos uma transação de ataque para ilustrar todo o processo.

O atacante primeiro transferiu 1e-8 WBTC e 331,335 yCredit tokens para o Pool de Par WBTC-yCREDIT. Em seguida, o atacante depositou 0,5 WBTC no contrato StableYieldCredit para lançar o ataque.

Especificamente, o _value é calculado usando o amount (0,5) do token (0x2260fac5e5542a773aa44fbcfedf7c193bc2c599 - WBTC) com base no provedor de oráculo de preços ChainLink (linha 480, _value é 1466786010075). A intenção é calcular o valor do WBTC depositado em USD. Em seguida, o contrato transferirá a quantidade de tokens yCREDIT (_value - fee) para quem depositou o WBTC (o atacante). Isso ocorre porque o valor do yCREDIT equivale a um USD (conforme projetado pelo sistema). Tudo está correto, exceto que o atacante perde uma pequena quantidade de fee.

Além disso, o contrato adicionará o WBTC depositado ao Pool de Par WBTC-yCREDIT. Isso porque, se o WBTC depositado for bloqueado no contrato, perderá liquidez. Assim, primeiro é calculado o valor do par de tokens (WBTC para yCREDIT) que será inserido no pool. Esse valor é calculado usando a função _addLiquidity. Basicamente, é calculado com base nas reservas existentes dentro do pool. Como o pool possui apenas 1e-8 WBTC e 331,335 yCREDIT tokens, o amountA calculado é 44 (amountB é 1466786010075). Isso significa que o atacante gasta apenas 44e-8 WBTC (linha 485) e obtém 14667,86010075 - fee = 14594,52080025 tokens yCREDIT (linha 493). Ao mesmo tempo, uma pequena quantidade de WBTC (1e-8 + 44e-8) e (331,335 + 14667,86010075) tokens yCREDIT permanecem no pool.

Para obter lucros, o atacante pode simplesmente negociar os 14594,52080025 tokens yCREDIT obtidos em exchanges. Curiosamente, o processo para obter lucros nesta transação é muito mais complicado do que o necessário. Também observamos uma estratégia de ataque inteligente em outras transações.

Há uma série de transações envolvidas no ataque, incluindo (mas não se limitando a) as seguintes.

Atualização

2020/01/03: Há um novo contrato inteligente que corrige a vulnerabilidade.

Linha do Tempo

  • 2021/01/01 23:25 UTC, os ataques foram capturados pelo nosso sistema
  • 2021/01/02 16:20 UTC, este blog foi publicado

Best Security Auditor for Web3

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

BlockSec Audit