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

Front-running

Ocurre cuando un atacante explota el orden de las transacciones pendientes en la mempool para ejecutar una transacción antes de otra transacción que ya está en espera, con el fin de obtener un beneficio injusto. Este tipo de ataque es común en plataformas DeFi, como intercambios descentralizados (DEXs), donde el precio de un activo puede verse afectado por grandes órdenes de compra o venta.

Ejemplo:

Imagina que un usuario A intenta comprar una gran cantidad de un token en un intercambio descentralizado (DEX). La transacción del usuario A se envía a la red y queda en la mempool a la espera de ser confirmada. Un atacante, que está monitoreando la mempool, observa la transacción y se da cuenta de que la compra del usuario A incrementará el precio del token.

El atacante puede entonces enviar una transacción con un gas más alto para comprar el token antes de que se ejecute la transacción del usuario A. Debido a que los mineros priorizan las transacciones con tarifas de gas más altas, la transacción del atacante se procesará primero, comprando el token a un precio más bajo. Luego, cuando la transacción del usuario A se ejecute, el precio del token habrá subido, permitiendo al atacante vender su token adquirido a un precio más alto, obteniendo una ganancia rápida.

function swapTokens(uint amountIn, address tokenIn, address tokenOut) external {
    // Cálculo del precio antes de ejecutar el intercambio
    uint priceBefore = getPrice(tokenOut);

    // Ejecuta el intercambio de tokens
    uint amountOut = executeSwap(amountIn, tokenIn, tokenOut);

    // Cálculo del precio después del intercambio
    uint priceAfter = getPrice(tokenOut);

    // Potencialmente, un atacante podría observar y ejecutar una transacción antes de esta
}

Mitigación:

  1. Uso de Commit-Reveal Schemes: Este esquema implica dividir la transacción en dos fases: un "commit" donde se envía un hash de la transacción y un "reveal" donde se revela la transacción completa. Durante la fase de "commit", el atacante no tiene acceso a la información completa y no puede realizar un front running.

    solidityCopiar código
    mapping(address => bytes32) public commitments;
    
    function commitSwap(bytes32 _commitment) external {
        commitments[msg.sender] = _commitment;
    }
    
    function revealSwap(uint amountIn, address tokenIn, address tokenOut, uint nonce) external {
        require(commitments[msg.sender] == keccak256(abi.encodePacked(amountIn, tokenIn, tokenOut, nonce)), "Invalid reveal");
        // Ejecutar el swap
    }
  2. Gas Limit y priorización de transacciones: Los contratos inteligentes pueden establecer límites de gas o incluir reglas que prioricen las transacciones en función de factores distintos a la tarifa de gas, lo que hace más difícil para un atacante simplemente pagar más gas para adelantarse en la fila.

  3. Slippage tolerance: En los intercambios descentralizados, los usuarios pueden establecer una "tolerancia al deslizamiento" que define el rango de precios aceptable para la transacción. Si el precio se mueve más allá de esta tolerancia debido a un posible front running, la transacción se revertirá.

    function swapTokens(uint amountIn, address tokenIn, address tokenOut, uint minAmountOut) external {
        uint amountOut = executeSwap(amountIn, tokenIn, tokenOut);
        require(amountOut >= minAmountOut, "Slippage too high");
    }
  4. Mecanismos de bloqueo temporal: Introducir retrasos controlados o ventanas de tiempo en las que una transacción no puede ser confirmada inmediatamente puede reducir la capacidad de los atacantes de ejecutar transacciones en un orden ventajoso.

  5. Ordenación aleatoria de transacciones: En lugar de procesar las transacciones en el orden en que llegan a la mempool, se pueden ordenar de forma aleatoria o utilizar loterías para determinar el orden de procesamiento, dificultando los ataques de front running.

  6. Flashbots y MEV-Protection: Herramientas como Flashbots permiten a los usuarios enviar transacciones directamente a los validadores sin que pasen por la mempool pública, evitando que sean visibles para atacantes que buscan ejecutar un front running. Esta técnica ayuda a mitigar el riesgo de "Maximal Extractable Value" (MEV), que es la ganancia que los atacantes pueden obtener mediante front running.

PreviousFailure to Initialize (Falla al Inicializar)NextInvariant Breaks (Ruptura de invariantes)

Last updated 8 months ago

Was this helpful?