
Hoje, vamos nos aprofundar em um aspecto crucial do desenvolvimento de contratos inteligentes – Integer Overflow e Underflow. Como desenvolvedor de contratos inteligentes com foco na concepção de contratos inteligentes complexos, compreender essas vulnerabilidades é essencial para garantir a segurança e a confiabilidade de seus contratos inteligentes.
O que é estouro/underflow de número inteiro?
Overflow e underflow de inteiros são erros de programação comuns que ocorrem quando o resultado de uma operação aritmética excede o máximo ou fica abaixo do valor mínimo representável para um determinado tipo de inteiro.
No contexto dos contratos inteligentes, que muitas vezes envolvem o tratamento de grandes quantidades de valor e dados, estas vulnerabilidades podem ter consequências graves. Vamos explorar cada um:
Estouro de número inteiro: O estouro de número inteiro ocorre quando o resultado de uma operação aritmética excede o valor máximo que pode ser armazenado no tipo de variável designado. No Solidity, a linguagem de programação para contratos inteligentes Ethereum, um overflow em um tipo inteiro não assinado será zero, enquanto em um tipo inteiro assinado, ele será retornado ao valor mínimo representável.
function overflowExample (uint8 a, uint8 b) public pure return (uint8) {uint8 resultado = a + b;return resultado;}
Se a soma de aeb exceder 255, o resultado será um valor entre 0 e 255.
Underflow de inteiro: Por outro lado, underflow de inteiro ocorre quando o resultado de uma operação aritmética fica abaixo do valor mínimo representável para um determinado tipo de variável. No Solidity, um underflow em um tipo inteiro não assinado irá contornar o valor máximo, enquanto em um tipo inteiro assinado, ele envolverá o valor positivo máximo representável.
função underflowExample (uint8 a, uint8 b) retornos puros públicos (uint8) {resultado uint8 = a – b; resultado de retorno;}
Se b for maior que a, ocorrerá um underflow, resultando em um valor inesperado.
Mitigação de estouro/subfluxo de números inteiros: para evitar essas vulnerabilidades, considere implementar as seguintes práticas recomendadas:
Biblioteca SafeMath: Use bibliotecas SafeMath em seus contratos inteligentes. Essas bibliotecas fornecem operações aritméticas seguras que verificam automaticamente overflow e underflow, evitando esses problemas.
Exemplo:
// Usando a biblioteca SafeMath usando SafeMath para uint256;
função safeAdd (uint256 a, uint256 b) retornos puros públicos (uint256) {return a.add (b);}
Validação de dados: valide as entradas e garanta que o resultado das operações aritméticas esteja dentro de intervalos aceitáveis antes de executar funções críticas.
Exemplo:
function safeSubtract(uint256 a, uint256 b) public pure return (uint256) {require(b <= a, "Subtração resultaria em underflow");return a - b;}
Compreender como os invasores podem explorar vulnerabilidades de overflow e underflow de inteiros é crucial para projetar contratos inteligentes seguros. Vamos mergulhar nos detalhes
Exploração de underflow inteiro
Cenário: Considere um contrato inteligente que permite aos usuários sacar fundos. O contrato deduz o valor solicitado do saldo do usuário.
function retiradaFunds(uint256 amount) public {// Dedução de saldo simplificada sem underflow checkbalances(msg.sender) -= amount;// Lógica adicional para retirada de fundos}
Exploração: um invasor pode explorar isso retirando mais fundos do que seu saldo atual. Sem verificações de underflow, o saldo atingiria o valor máximo, permitindo que o invasor tivesse efetivamente um grande saldo positivo.
Mitigação: Para evitar estouro negativo, sempre valide os parâmetros de entrada e certifique-se de que o resultado das operações aritméticas esteja dentro dos intervalos aceitáveis antes de atualizar o estado.
function retiradaFunds(uint256 amount) public {require(amount <= balances(msg.sender), "Fundos insuficientes");balances(msg.sender) -= amount;// Lógica adicional para retirada de fundos}
Conclusão: No mundo do desenvolvimento de contratos inteligentes, onde a segurança é fundamental, compreender e mitigar as vulnerabilidades de overflow e underflow de inteiros é crucial. Ao incorporar as melhores práticas, como o uso de bibliotecas SafeMath e a validação de entradas de dados, você pode aumentar a robustez de seus contratos inteligentes. Boa codificação!
Postado originalmente em