Vulnerabilidade de overflow de inteiro e sua proteção
A sobrecarga de inteiros é um problema comum na programação. Na maioria das linguagens de programação, os valores inteiros são armazenados em uma memória de comprimento fixo. Os inteiros são divididos em dois tipos: sem sinal e com sinal, diferenciando-se pelo uso do bit mais significativo como bit de sinal. Por exemplo, 32 bits de memória podem armazenar um inteiro sem sinal no intervalo de 0 a 4.294.967.295 (uint32), ou um inteiro com sinal no intervalo de -2.147.483.648 a 2.147.483.647 (int32).
Quando o resultado do cálculo excede o intervalo que o tipo inteiro pode representar, ocorre um estouro. A maioria das linguagens de programação e compiladores não verifica esse tipo de erro, mas simplesmente executa a operação de módulo ou gera comportamentos indefinidos. Isso pode levar a resultados inesperados na execução do programa. Na redação de contratos inteligentes de blockchain, especialmente no campo das finanças descentralizadas, cálculos inteiros são comuns, portanto, é necessário ter atenção especial às vulnerabilidades de estouro de inteiros.
A sobrecarga de inteiros pode ser dividida em dois casos: sobrecarga superior e sobrecarga inferior.
Overflow: o resultado do cálculo excede o valor máximo que o tipo pode representar. Por exemplo, 0xFFFFFFFF de uint32 mais 1 torna-se 0x00000000.
Underflow: o resultado do cálculo é menor que o valor mínimo que o tipo pode representar. Por exemplo, 0 menos 1 em uint32 se torna 0xFFFFFFFF.
Em abril de 2018, o contrato do token BeautyChain(BEC) foi atacado devido a uma vulnerabilidade de estouro inteiro, resultando na obtenção de uma grande quantidade de tokens pelo atacante. A vulnerabilidade estava presente na função batchTransfer, onde a falta de verificação de estouro de multiplicação permitiu que uma grande quantidade de tokens fosse transferida com um saldo de token muito pequeno.
Para evitar o estouro de inteiros, podem ser adotadas as seguintes medidas:
Configurar opções de compilação do Rust para verificar estouro de inteiros e ativar panic no modo release.
Utilizar o pacote uint para suportar tipos de inteiros maiores, como U256, U512, etc.
Utilize funções de conversão do tipo uint para detectar overflow, como as_u128().
Utilize funções Safe Math como checked_add() para verificar se houve estouro nos cálculos.
Através destes métodos, é possível evitar de forma eficaz as vulnerabilidades de estouro de inteiros, melhorando a segurança dos contratos inteligentes. Ao escrever contratos que envolvem cálculos de grandes números, é imperativo lidar com o problema do estouro de inteiros com cautela.
Esta página pode conter conteúdo de terceiros, que é fornecido apenas para fins informativos (não para representações/garantias) e não deve ser considerada como um endosso de suas opiniões pela Gate nem como aconselhamento financeiro ou profissional. Consulte a Isenção de responsabilidade para obter detalhes.
9 Curtidas
Recompensa
9
5
Compartilhar
Comentário
0/400
AirdropHunterXiao
· 10h atrás
Overflow? Vai ser Cupões de Recorte.
Ver originalResponder0
gas_guzzler
· 10h atrás
Antes de desenvolver, lembrem-se de ajustar o transbordamento, irmãos.
contratos inteligentes inteiro overflow vulnerabilidade: medidas de proteção detalhadas
Vulnerabilidade de overflow de inteiro e sua proteção
A sobrecarga de inteiros é um problema comum na programação. Na maioria das linguagens de programação, os valores inteiros são armazenados em uma memória de comprimento fixo. Os inteiros são divididos em dois tipos: sem sinal e com sinal, diferenciando-se pelo uso do bit mais significativo como bit de sinal. Por exemplo, 32 bits de memória podem armazenar um inteiro sem sinal no intervalo de 0 a 4.294.967.295 (uint32), ou um inteiro com sinal no intervalo de -2.147.483.648 a 2.147.483.647 (int32).
Quando o resultado do cálculo excede o intervalo que o tipo inteiro pode representar, ocorre um estouro. A maioria das linguagens de programação e compiladores não verifica esse tipo de erro, mas simplesmente executa a operação de módulo ou gera comportamentos indefinidos. Isso pode levar a resultados inesperados na execução do programa. Na redação de contratos inteligentes de blockchain, especialmente no campo das finanças descentralizadas, cálculos inteiros são comuns, portanto, é necessário ter atenção especial às vulnerabilidades de estouro de inteiros.
A sobrecarga de inteiros pode ser dividida em dois casos: sobrecarga superior e sobrecarga inferior.
Overflow: o resultado do cálculo excede o valor máximo que o tipo pode representar. Por exemplo, 0xFFFFFFFF de uint32 mais 1 torna-se 0x00000000.
Underflow: o resultado do cálculo é menor que o valor mínimo que o tipo pode representar. Por exemplo, 0 menos 1 em uint32 se torna 0xFFFFFFFF.
Em abril de 2018, o contrato do token BeautyChain(BEC) foi atacado devido a uma vulnerabilidade de estouro inteiro, resultando na obtenção de uma grande quantidade de tokens pelo atacante. A vulnerabilidade estava presente na função batchTransfer, onde a falta de verificação de estouro de multiplicação permitiu que uma grande quantidade de tokens fosse transferida com um saldo de token muito pequeno.
Para evitar o estouro de inteiros, podem ser adotadas as seguintes medidas:
Configurar opções de compilação do Rust para verificar estouro de inteiros e ativar panic no modo release.
Utilizar o pacote uint para suportar tipos de inteiros maiores, como U256, U512, etc.
Utilize funções de conversão do tipo uint para detectar overflow, como as_u128().
Utilize funções Safe Math como checked_add() para verificar se houve estouro nos cálculos.
Através destes métodos, é possível evitar de forma eficaz as vulnerabilidades de estouro de inteiros, melhorando a segurança dos contratos inteligentes. Ao escrever contratos que envolvem cálculos de grandes números, é imperativo lidar com o problema do estouro de inteiros com cautela.