🇧🇷
Ethereum Developer Pack - PT
  • Ethereum Developer Pack - PT
  • Módulo 1
    • Introdução a Smart Contracts
      • Fundamentos de Blockchain
        • Histórico
        • Bitcoin
        • O que é Blockchain
        • Conceitos-chave em Blockchain
        • Como funciona a Blockchain
        • Tipos de Blockchain
        • Modelos de Consenso
      • A nova Internet
        • Web 3
        • Elementos Fundamentais
        • Impacto do Ethereum em Diversos Setores
      • Wallets
        • Componentes de uma wallet
        • Tipos de Wallet
        • Códigos Mnemônicos
      • Ethereum 101
        • Smart Contracts
        • Contas
          • Tipos de contas
          • Conteúdo das contas
        • Transações
          • Componentes
          • Ciclo de vida
        • Gás
        • Solidity
        • EVM
          • A máquina de estados
          • Opcodes
          • Como funciona a EVM
          • Clientes de execução
          • DApps
      • Blockchain Explorer
        • Funções de um blockchain explorer
        • Beneficios de utilizar um blockchain explorer
      • Remix
        • Características do Remix
        • Workspaces ou espaços de trabalho
        • Carregar e compilar um contrato
        • Implantar na máquina virtual do Remix (Remix VM)
        • Interagindo com funções
        • Deployar em uma rede pública
      • Crie seu primeiro Smart Contract
  • Módulo 2
    • Fundamentos de Solidity
      • Hello World
      • Tipos de Dados
      • Funções
      • Variáveis
        • Exercício 1
      • Operadores
        • Ejercicio 2
      • Constructor
        • Exercício 3
      • Convenções de nomenclatura
      • Tipos de armazenamento para variáveis
      • Estruturas de Controle
        • Exercício 4
      • Modificadores
      • Eventos
        • Exercício 5
      • Tipos de Referencia
        • Arrays
          • Exercício 6
        • Mappings
          • Exercício 7
        • Structs
          • Exercício 8
      • Address Payable
      • Como os contratos e funções recebem Ether.
      • Transferências de Ether
      • Conceitos Avançados
        • Codificação de ABI
        • Hashing
        • This
        • Herança
        • Abstract
        • Interface
        • Chamada entre contratos
        • EVM
        • ABI
        • Bytecode
        • Opcodes
  • Módulo 3
    • ERCs, Bibliotecas e Padrões de Desenvolvimento
      • Boas Práticas de Desenvolvimento
      • Padrões de Desenvolvimento
      • EIP & ERC
      • ERC-20
      • ERC-721
      • Open Zeppelin
      • Crie um Token ERC-20
      • Almacenamiento Descentralizado: IPFS
      • Crea un Token ERC-721
      • DeFi
  • Módulo 4
    • Kit de ferramentas para desenvolvimento na Ethereum
      • Requisitos para o módulo 4
        • Terminal
        • Git e Github
        • Node.js e npm
        • Visual Studio Code para Solidity
      • Toolkit
        • JSON-RPC
        • Ethers.js
          • Exercício
        • Hardhat
          • Implantação de um contrato no Hardhat
          • Implantação de um contrato em uma rede pública
        • Scaffold-ETH
          • Características do Scaffold-ETHCaracterísticas
          • Como instalar o Scaffold-ETH
  • Módulo 5
    • Segurança, Testes e Auditorias
      • Testes
        • Importância de realizar testes
        • Métodos para testar contratos inteligentes
          • Testes automatizados
          • Testes manuais
        • Conceitos importantes em testes
        • Ferramentas para testes
        • Testes com Hardhat
        • Recursos adicionais
      • Segurança
        • Uma mentalidade diferente de design
        • Principais vulnerabilidades em contratos inteligentes
          • Reentrancy attack (ataque de reentrada)
          • Replay attack (ataque de repetición)
          • Price Oracle Manipulation (Manipulación de Oráculos de Precios)
          • Missing Access Control (Pérdida de Control de Acceso)
          • Reward Manipulation (Manipulación de Recompensas)
          • Failure to Initialize (Falla al Inicializar)
          • Front-running
          • Invariant Breaks (Quebra de Invariantes)
          • Mishandling of ETH (Má gestão de ETH)
          • Denial of Service (DoS - Negação de Serviço)
          • Integer overflow and underflow (Overflow e Underflow de inteiros)
          • Phishing y Typosquatting
        • Recursos adicionais
      • Auditoria de smart contracts
        • Processo de Auditoria
        • Ferramentas
        • Como se preparar para uma auditoria
        • O teste Rekt
        • Desafios
        • Recursos adicionais
  • Contribuye
    • Kipu Explorer
Powered by GitBook
On this page
  1. Módulo 5
  2. Segurança, Testes e Auditorias
  3. Segurança
  4. Principais vulnerabilidades em contratos inteligentes

Mishandling of ETH (Má gestão de ETH)

Refere-se a erros na gestão de transações com ETH, o que pode resultar em perda de fundos, bloqueio de contratos ou comportamentos inesperados. Essas vulnerabilidades geralmente ocorrem devido à implementação incorreta de funções responsáveis por receber, enviar ou transferir ETH.

Exemplo: Considere um contrato que permite aos usuários depositar ETH e, posteriormente, sacar seu saldo a qualquer momento. Um problema comum é o uso das funções transfer() ou send() para enviar ETH, sem levar em conta que essas funções limitam a quantidade de gas disponível para a execução da lógica do contrato destinatário. Isso pode ser explorado se o destinatário for um contrato que consome muito gas, fazendo com que a transação falhe e o ETH não seja transferido, potencialmente resultando no bloqueio permanente dos fundos..

contract VulnerableContract {
    mapping(address => uint) public balances;

    function deposit() external payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw(uint _amount) external {
        require(balances[msg.sender] >= _amount, "Insufficient balance");
        balances[msg.sender] -= _amount;
        msg.sender.transfer(_amount);  // Vulnerable to failure if the recipient contract consumes too much gas
    }
}

Neste exemplo, se um usuário tentar sacar ETH e seu endereço for um contrato que requer mais gas do que os 2300 gas fornecidos por transfer() ou send(), a transação falhará e os fundos poderão ficar bloqueados permanentemente no contrato.

Mitigação:

  1. Uso de call para Enviar ETH: Em vez de utilizar transfer() ou send(), recomenda-se o uso da função call{value: amount}(""), que oferece maior flexibilidade no gerenciamento de gas. No entanto, call retorna um valor booleano que deve ser verificado para garantir que a transferência foi bem-sucedida.

    function withdraw(uint _amount) external {
        require(balances[msg.sender] >= _amount, "Insufficient balance");
        balances[msg.sender] -= _amount;
        (bool success, ) = msg.sender.call{value: _amount}("");
        require(success, "Transfer failed");
    }
  2. Considerar a Reentrância: Ao utilizar call para enviar ETH, o contrato torna-se vulnerável a ataques de reentrância se não forem implementadas as medidas de segurança adequadas. Para mitigar esse risco, é essencial aplicar o padrão "checks-effects-interactions", garantindo que o estado do contrato seja atualizado antes da chamada externa.

    function withdraw(uint _amount) external {
        require(balances[msg.sender] >= _amount, "Insufficient balance");
        balances[msg.sender] -= _amount; // Actualizar el estado antes de la llamada externa
        (bool success, ) = msg.sender.call{value: _amount}("");
        require(success, "Transfer failed");
    }
  3. Funções Fallback e Recebimento de ETH: É importante implementar corretamente as funções fallback ou receive para lidar com o recebimento de ETH de forma segura no contrato. Recomenda-se evitar incluir muita lógica nessas funções, a fim de reduzir o risco de erros ou explorações.

    receive() external payable {
        balances[msg.sender] += msg.value;
    }
  4. Gestão de Fundos Bloqueados: Implementar uma função de emergência que permita ao proprietário do contrato recuperar fundos bloqueados, caso ocorra algum erro durante as transferências. Essa funcionalidade garante que os fundos não fiquem permanentemente inacessíveis, preservando a segurança e a recuperabilidade dos ativos.

    function emergencyWithdraw() external onlyOwner {
        payable(owner).transfer(address(this).balance);
    }
PreviousInvariant Breaks (Quebra de Invariantes)NextDenial of Service (DoS - Negação de Serviço)

Last updated 21 days ago