馃嚙馃嚪
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

Failure to Initialize (Falla al Inicializar)

Ocurre cuando un contrato no se inicializa correctamente antes de ser utilizado, lo que puede llevar a que variables cr铆ticas, como el propietario del contrato o configuraciones importantes, queden en un estado por defecto. Esto puede permitir que cualquier usuario tome el control del contrato o que el contrato funcione de manera inesperada.

Ejemplo:

Imagina que tienes un contrato inteligente que deber铆a ser inicializado con una direcci贸n de propietario (owner) que tiene privilegios especiales, como la capacidad de pausar o destruir el contrato. Si el contrato no tiene un constructor que asigne la direcci贸n del propietario o si se despliega utilizando un proxy sin una funci贸n de inicializaci贸n adecuada, la variable owner podr铆a quedar en un estado predeterminado, como la direcci贸n 0x0 o cualquier otra direcci贸n por defecto.

contract VulnerableContract {
    address public owner;

    function initialize(address _owner) external {
        owner = _owner;
    }

    function pauseContract() external {
        require(msg.sender == owner, "Not the contract owner");
        // L贸gica para pausar el contrato
    }
}

En este ejemplo, si la funci贸n initialize no se llama despu茅s de desplegar el contrato, la variable owner permanecer谩 sin establecer, y cualquier usuario podr铆a potencialmente llamar a initialize y establecerse a s铆 mismo como el propietario, tomando el control del contrato.

Mitigaci贸n:

  1. Uso de un constructor: Si el contrato no utiliza un patr贸n de proxy y se despliega directamente, siempre es recomendable usar un constructor para inicializar variables cr铆ticas como owner. El constructor asegura que estas variables se establezcan en el momento del despliegue y no puedan ser modificadas posteriormente.

    contract SecureContract {
        address public owner;
    
        constructor(address _owner) {
            owner = _owner;
        }
    
        function pauseContract() external {
            require(msg.sender == owner, "Not the contract owner");
            // L贸gica para pausar el contrato
        }
    }
  2. Inicializaci贸n en proxies: Cuando se utiliza un patr贸n de proxy para desplegar contratos (un patr贸n com煤n para facilitar actualizaciones), es crucial incluir una funci贸n de inicializaci贸n que asegure que el contrato solo puede ser inicializado una vez. Esta funci贸n debe estar protegida para que solo pueda ser llamada una vez y no pueda ser reutilizada por un atacante.

    contract SecureContract {
        address public owner;
        bool private initialized;
    
        function initialize(address _owner) external {
            require(!initialized, "Already initialized");
            owner = _owner;
            initialized = true;
        }
    
        function pauseContract() external {
            require(msg.sender == owner, "Not the contract owner");
            // L贸gica para pausar el contrato
        }
    }
  3. Protecci贸n contra la re-Inicializaci贸n: Adem谩s de asegurar que la funci贸n de inicializaci贸n solo se puede ejecutar una vez, se puede implementar un modificador que verifique que el contrato ya ha sido inicializado antes de permitir la ejecuci贸n de funciones cr铆ticas.

    modifier onlyInitialized() {
        require(initialized, "Contract not initialized");
        _;
    }
    
    function pauseContract() external onlyInitialized {
        require(msg.sender == owner, "Not the contract owner");
        // L贸gica para pausar el contrato
    }

PreviousReward Manipulation (Manipulaci贸n de Recompensas)NextFront-running