Perda de Precisão e Exploits de Arredondamento

Contratos inteligentes não precisam de um bug em controle de acesso para perder dinheiro.

Às vezes, o exploit está escondido em uma simples divisão.

Contratos inteligentes financeiros utilizam aritmética de inteiros. Frações são descartadas. Essa direção de arredondamento altera quem recebe o valor. Um erro de uma unidade pode se repetir em milhares de transações.

Em um protocolo financeiro, o arredondamento é uma política de transferência de valor.

Toda divisão deve responder a três perguntas:

  • Em qual direção o cálculo arredonda?
  • Qual parte se beneficia dessa direção?
  • Um atacante pode repetir ou amplificar essa vantagem?

Erros matemáticos comuns incluem:

  1. Dividir cedo demais Se você dividir antes de multiplicar, perderá precisão. Exemplo: (amount / 1e18) * rate. A divisão intermediária descarta dados antes que a multiplicação ocorra. Regra: Sempre multiplique antes de dividir.

  2. Overflows intermediários Multiplicar primeiro pode causar um overflow mesmo que o resultado final caiba em um uint256. Use uma biblioteca como OpenZeppelin Math para realizar multiplicação e divisão de precisão total em uma única etapa.

  3. Arredondamento na direção errada Arredondamento não é uma sugestão. É uma regra de segurança. Um protocolo conservador segue estes princípios:

  • Arredonde a dívida para cima.
  • Arredonde os pagamentos exigidos para cima.
  • Arredonde o valor do colateral para baixo.
  • Arredonde os ativos pagos aos usuários para baixo.
  • Arredonde as cotas cobradas dos usuários para cima.

Quando um resultado exato for impossível, arredonde contra a parte que tenta extrair valor.

  1. Ataques de inflação Em cofres com baixa liquidez, atacantes podem usar doações para manipular taxas de câmbio. Eles doam ativos para aumentar a contagem total de ativos sem aumentar a contagem de cotas. Isso faz com que novos depósitos arredondem para baixo, resultando em zero cotas. Mitigação: Use ativos ou cotas virtuais para estabelecer uma taxa inicial estável.

  2. Ataques de frequência Se os juros acumularem a cada bloco e arredondarem para baixo, um atacante pode disparar o acúmulo constantemente para manter os juros em zero. Mitigação: Use um índice de alta precisão ou carregue o resto para frente.

A engenharia financeira segura requer:

  • Unidades e escalas decimais explícitas.
  • Multiplicação e divisão de precisão total.
  • Arredondamento específico para a operação.
  • Rastreamento de restos.
  • Testes de invariantes e fuzz testing.

Não pergunte apenas se um cálculo é próximo o suficiente. Pergunte para onde vai o valor descartado e quem o recebe.

Fonte: https://dev.to/stablenaira/precision-loss-and-rounding-exploits-in-financial-smart-contracts-4c93