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

Reward Manipulation (Manipulación de Recompensas)

Ocurre cuando un atacante encuentra una forma de manipular el sistema de recompensas de un contrato para obtener beneficios indebidos o desproporcionados. Esta vulnerabilidad es especialmente relevante en sistemas DeFi, juegos basados en blockchain, y otros contratos donde los usuarios son recompensados por su participación o contribuciones.

Ejemplo:

Imagina un contrato inteligente que distribuye recompensas en tokens a los usuarios en función de su participación en un staking pool. Los usuarios que depositan sus tokens en el pool reciben recompensas proporcionales al tiempo que sus tokens permanecen en staking.

Un atacante podría intentar manipular el sistema realizando depósitos y retiros repetidos de una gran cantidad de tokens en un corto período de tiempo, aprovechando un error en la lógica de cálculo de recompensas. Si el contrato no está diseñado para evitar esta situación, el atacante podría obtener una cantidad desproporcionada de recompensas en relación con su verdadera participación.

contract RewardPool {
    mapping(address => uint) public stakedAmount;
    mapping(address => uint) public rewardDebt;
    uint public totalStaked;
    uint public rewardRate;

    function stake(uint _amount) external {
        // Actualiza las recompensas pendientes antes de cambiar el estado
        updateRewards(msg.sender);
        stakedAmount[msg.sender] += _amount;
        totalStaked += _amount;
    }

    function withdraw(uint _amount) external {
        updateRewards(msg.sender);
        stakedAmount[msg.sender] -= _amount;
        totalStaked -= _amount;
    }

    function updateRewards(address _user) internal {
        uint pendingReward = stakedAmount[_user] * rewardRate;
        rewardDebt[_user] += pendingReward;
    }

    function claimRewards() external {
        updateRewards(msg.sender);
        uint reward = rewardDebt[msg.sender];
        rewardDebt[msg.sender] = 0;
        // Lógica para transferir la recompensa al usuario
    }
}

En este ejemplo, un atacante podría depositar y retirar rápidamente tokens para maximizar el valor de pendingReward en la función updateRewards, explotando una vulnerabilidad en la forma en que las recompensas se calculan y acumulan.

Mitigación:

  1. Implementar medidas Anti-Sybil: Una técnica común es limitar la frecuencia de las interacciones de los usuarios con el contrato, como establecer un período mínimo entre depósitos y retiros (locking period), o aplicar tarifas por transacción que desincentiven el comportamiento de entrada y salida repetitiva.

  2. Cálculos basados en tiempo y periodos Continuos: Asegurar que las recompensas se calculen de manera continua en función del tiempo que los tokens han estado en staking, en lugar de hacerlo únicamente en base a los eventos de depósito y retiro. Esto puede evitar que los atacantes obtengan recompensas adicionales al realizar múltiples transacciones en un corto período.

    function updateRewards(address _user) internal {
        uint timeStaked = block.timestamp - lastUpdateTime[_user];
        uint pendingReward = stakedAmount[_user] * rewardRate * timeStaked;
        rewardDebt[_user] += pendingReward;
        lastUpdateTime[_user] = block.timestamp;
    }
  3. Aplicar un proceso de slashing: Introducir una penalización (slashing) para retiros antes de un período mínimo de staking. Esto desincentiva a los atacantes de retirar rápidamente sus tokens después de hacer staking para manipular las recompensas.

  4. Auditorías de seguridad: Realizar auditorías de seguridad en el contrato para identificar y corregir cualquier lógica que permita la manipulación de recompensas. Las auditorías también pueden incluir pruebas de estrés y simulaciones de comportamiento de los usuarios para identificar posibles explotaciones.

  5. Monitoreo y ajuste de parámetros dinámicos: Implementar sistemas de monitoreo que ajusten dinámicamente las tasas de recompensa o las reglas del sistema en respuesta a patrones de comportamiento sospechoso o anómalo.

  6. Mecanismos de recompensa basados en la historia del usuario: En lugar de calcular las recompensas únicamente en función del saldo actual, considerar la historia completa del usuario, incluyendo cuánto tiempo han estado participando y la cantidad total de participación durante ese tiempo.

PreviousMissing Access Control (Pérdida de Control de Acceso)NextFailure to Initialize (Falla al Inicializar)

Last updated 8 months ago

Was this helpful?