🇧🇷
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

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)