ETH Kipu
  • Ethereum Developer Pack
  • Módulo 1
    • Intro a Smart Contracts
      • Fundamentos de Blockchain
        • Antecedentes
        • Bitcoin
        • Qué es Blockchain
        • Conceptos Clave en Blockchain
        • Cómo funciona la Blockchain
        • Tipos de Blockchain
        • Modelos de Consenso
      • El nuevo Internet
        • Web 3
        • Elementos Fundamentales
        • Impacto de Ethereum en Diversos Sectores
      • Wallets
        • Componentes de una wallet
        • Tipos de Wallet
        • Códigos mnemónicos
      • Ethereum 101
        • Smart Contracts
        • Cuentas
          • Tipos de cuentas
          • Contenido de cuentas
        • Transacciones
          • Componentes
          • Ciclo de vida
        • Gas
        • Solidity
        • EVM
          • La máquina de estados
          • Opcodes
          • Cómo funciona la EVM
          • Clientes de ejecución
          • DApps
      • Blockchain Explorer
        • Funciones de un blockchain explorer
        • Beneficios de utilizar un blockchain explorer
      • Remix
        • Características de Remix
        • Workspaces o espacios de trabajo
        • Cargar y compilar un contrato
        • Desplegar en la máquina virtual de Remix (Remix VM)
        • Interactuando con funciones
        • Desplegar en una red pública
      • Crea tu primer Smart Contract
  • Módulo 2
    • Fundamentos de Solidity
      • Hello World
      • Tipos de Datos
      • Funciones
      • Variables
        • Ejercicio 1
      • Operadores
        • Ejercicio 2
      • Constructor
        • Ejercicio 3
      • Convenciones de nomenclatura
      • Tipos de almacenamiento para variables
      • Estructuras de Control
        • Ejercicio 4
      • Modificadores
      • Eventos
        • Ejercicio 5
      • Tipos de Referencia
        • Arrays
          • Ejercicio 6
        • Mappings
          • Ejercicio 7
        • Structs
          • Ejercicio 8
      • Address Payable
      • Cómo reciben Ether los contratos y funciones
      • Transferencias de Ether
      • Conceptos Avanzados
        • Codificación ABI
        • Hashing
        • This
        • Herencia
        • Abstract
        • Interface
        • Llamadas entre contratos
        • EVM
        • ABI
        • Bytecode
        • Opcodes
  • Módulo 3
    • Estándares, Librerías y Patrones
      • Buenas Prácticas de Diseño
      • Patrones de Diseño
      • EIP y ERC
      • ERC-20
      • ERC-721
      • Open Zeppelin
      • Crea un Token ERC-20
      • Almacenamiento Descentralizado: IPFS
      • Crea un Token ERC-721
      • DeFi
  • Módulo 4
    • Toolkit para desarrollo en Ethereum
      • Requisitos para el módulo 4
        • Terminal
        • Git y Github
        • Node.js y npm
        • Visual Studio Code para Solidity
      • Toolkit
        • JSON-RPC
        • Ethers.js
          • Ejercicio
        • Hardhat
          • Despliegue de un contrato en Hardhat
          • Despliegue de un contrato en una red pública
        • Scaffold-ETH
          • Características
          • Cómo instalar Scaffold-ETH
  • Módulo 5
    • Seguridad, Pruebas y Auditoría
      • Pruebas
        • Importancia de realizar pruebas
        • Métodos para probar contratos inteligentes
          • Pruebas automatizadas
          • Pruebas manuales
        • Conceptos importantes en testing
        • Herramientas para testing
        • Testing con Hardhat
        • Recursos adicionales
      • Seguridad
        • Una mentalidad distinta de diseño
        • Principales vulnerabilidades en smart contracts
          • 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 (Ruptura de invariantes)
          • Mishandling of ETH (Mal manejo de ETH)
          • Denial of Service (DoS - Denegación de Servicio)
          • Integer overflow and underflow (desbordamiento y subdesbordamiento de enteros)
          • Phishing y Typosquatting
        • Recursos adicionales
      • Auditoría de smart contracts
        • Proceso de Auditoría
        • Herramientas
        • Cómo prepararse para una auditoría
        • El test Rekt
        • Retos
        • Recursos adicionales
  • Contribuye
    • Kipu Explorer
Powered by GitBook
On this page

Was this helpful?

  1. Módulo 5
  2. Seguridad, Pruebas y Auditoría
  3. Seguridad
  4. Principales vulnerabilidades en smart contracts

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

Last updated 8 months ago

Was this helpful?