Compreendendo Ataques de Reentrada & Como Preveni-los 🔐

robot
Geração do resumo em andamento

Os ataques de reentrância parecem complicados à primeira vista. Deixe-me explicá-los em termos simples e mostrar-lhe algumas formas de manter os seus contratos inteligentes seguros 🛡️

O que é um Ataque de Reentrada? 🧐

É quando o ContractB chama de volta o ContractA enquanto o ContractA ainda está a correr. Coisas desagradáveis. Os atacantes adoram esta vulnerabilidade para drenar fundos dos contratos 💸

Imagine isto:

  • ContractA detém 10 ETH
  • ContractB colocou 1 ETH
  • ContractB então rouba tudo

O Mecanismo de Ataque 🕵️‍♂️

Você precisa de duas coisas chave:

  1. attack() função para começar tudo
  2. fallback() função para a parte sorrateira

O fluxo vai assim:

  1. ContractB inicia o ataque() que chama o withdraw() do ContractA
  2. ContractA verifica o saldo de ContractB
  3. ContractA envia ETH para ContractB
  4. Isso aciona a fallback do ContractB()
  5. O ciclo continua. Dinheiro desaparecido 🚨

É meio surpreendente como isso pode ser simples, mas devastador.

Exemplo de Código Vulnerável 📝

Aqui está como um contrato vulnerável se parece: solidity function withdrawAll() public { uint bal = balances[msg.sender]; require(bal > 0);

(bool sent, ) = msg.sender.call{value: bal}("");
require(enviado, "Falha ao enviar Ether");

balances[msg.sender] = 0; // Atualizando DEPOIS de enviar? Grande erro!

}

O contrato de ataque faz isso: solidity fallback() externo pagável { se(etherStore.balance >= 1 ether) etherStore.withdrawAll(); }

função attack() externa pagável { require(msg.value >= 1 ether); etherStore.deposit{value: 1 ether}(); etherStore.withdrawAll(); }

Três Maneiras de Parar Estes Ataques 🛡️

1. nonReentrant Modifier 🔒

solidity bool privado bloqueado = falso;

modificador nonReentrant() { require(!locked, "No reentrancy"); locked = true; _; locked = falso; }

Adicione-o a funções vulneráveis. Simples, mas eficaz.

2. Padrão de Verificações-Efeitos-Interações 📊

Isto é crucial:

solidity function withdrawAll() public { uint bal = balances[msg.sender]; require(bal > 0);

balances[msg.sender] = 0; // Atualizar PRIMEIRO

(bool sent, ) = msg.sender.call{value: bal}(""); // ENTÃO interagir
require(sent, "Falha ao enviar Ether");

}

Atualize o seu estado primeiro. Interaja depois. Sempre.

3. Proteção Global 🌐

Para projetos maiores:

solidity contrato GlobalReentrancyGuard { bool privado bloqueado = falso;

modificador globalNonReentrant() {
    require(!locked, "No reentrancy");
    locked = true;
    _;
    locked = false;
}

}

Faça com que todos os seus contratos herdem isso. Ecossistema mais seguro.

Últimas Tendências 🔥

A partir de setembro de 2025, esses ataques ainda atormentam o DeFi. Não está completamente claro por que os desenvolvedores continuam a cometer os mesmos erros. Ferramentas como Slither podem detectar esses problemas. Echidna e Foundry ajudam a testá-los 🚀

A segurança não se trata apenas de adicionar um modificador. É uma mentalidade.

Fique vigilante por aí! 🛡️

ETH-3.07%
Ver original
Esta página pode conter conteúdo de terceiros, que é fornecido apenas para fins informativos (não para representações/garantias) e não deve ser considerada como um endosso de suas opiniões pela Gate nem como aconselhamento financeiro ou profissional. Consulte a Isenção de responsabilidade para obter detalhes.
  • Recompensa
  • Comentário
  • Repostar
  • Compartilhar
Comentário
0/400
Sem comentários
  • Marcar
Negocie criptomoedas a qualquer hora e em qualquer lugar
qrCode
Escaneie o código para baixar o app da Gate
Comunidade
Português (Brasil)
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)