Vulnerabilidade de overflow de inteiro e sua proteção
A sobrecarga de inteiros é uma vulnerabilidade comum de programação que pode ocorrer na maioria das linguagens de programação. A sobrecarga acontece quando o resultado de um cálculo ultrapassa o intervalo de representação do tipo inteiro. Por exemplo, o intervalo do inteiro sem sinal de 32 bits (uint32) é de 0 a 4.294.967.295. Se adicionarmos 1 a 4.294.967.295, o resultado "transbordará" e se tornará 0.
Esta sobrecarga pode causar sérios erros de programa, especialmente ao lidar com dados financeiros. Por exemplo, se o preço das ações for representado por um inteiro de 32 bits, quando o preço exceder o valor máximo, pode ser erroneamente lido como 0, o que claramente causaria uma enorme confusão.
A sobrecarga de inteiros divide-se em dois casos: sobrecarga superior e sobrecarga inferior.
Overflow: o resultado excede o valor máximo, como uint32 de 0xFFFFFFFF + 1 = 0x00000000
Underflow: o resultado é menor que o valor mínimo, como uint32 de 0x00000000 - 1 = 0xFFFFFFFF
Em contratos inteligentes de blockchain, a vulnerabilidade de estouro de inteiros é especialmente perigosa. Em 2018, o token BEC da BeautyChain foi explorado por atacantes devido a uma vulnerabilidade de estouro de inteiros, resultando no roubo de uma grande quantidade de tokens.
Para evitar a sobrecarga de inteiros, a linguagem Rust oferece alguns métodos eficazes:
Ativar verificação de estouro no modo de lançamento:
Use o crate uint para suportar tipos de inteiros maiores, como U256, U512, etc.
Use funções de conversão de tipo para detectar overflow, como:
ferrugem
let amount_u256 = U256::from(u128::MAX) + 1;
let amount_u128 = amount_u256.as_u128(); // irá disparar panic
Usar funções Safe Math como checked_add, checked_sub, etc:
ferrugem
let result = x.checked_sub(y).expect("Underflow ocorreu");
Através desses métodos, podemos detectar e prevenir efetivamente o overflow de inteiros, aumentando a segurança dos contratos inteligentes. Ao escrever contratos que envolvem cálculos com grandes valores, é essencial tratar com cautela as possíveis situações de overflow.
Ver original
Esta página pode conter conteúdos de terceiros, que são fornecidos apenas para fins informativos (sem representações/garantias) e não devem ser considerados como uma aprovação dos seus pontos de vista pela Gate, nem como aconselhamento financeiro ou profissional. Consulte a Declaração de exoneração de responsabilidade para obter mais informações.
9 gostos
Recompensa
9
4
Partilhar
Comentar
0/400
SellLowExpert
· 07-16 05:14
Não será que alguém foi apanhado numa avalanche novamente?
Ver originalResponder0
SigmaBrain
· 07-16 05:14
Escrever código sem estouro é impossível, quem entende, entende.
Ver originalResponder0
SchroedingersFrontrun
· 07-16 05:11
Vocês estão dizendo que essa coisa não é apenas cair para zero os ativos na Carteira?
Prevenção de estouro de inteiros: a chave para garantir a segurança dos contratos inteligentes
Vulnerabilidade de overflow de inteiro e sua proteção
A sobrecarga de inteiros é uma vulnerabilidade comum de programação que pode ocorrer na maioria das linguagens de programação. A sobrecarga acontece quando o resultado de um cálculo ultrapassa o intervalo de representação do tipo inteiro. Por exemplo, o intervalo do inteiro sem sinal de 32 bits (uint32) é de 0 a 4.294.967.295. Se adicionarmos 1 a 4.294.967.295, o resultado "transbordará" e se tornará 0.
Esta sobrecarga pode causar sérios erros de programa, especialmente ao lidar com dados financeiros. Por exemplo, se o preço das ações for representado por um inteiro de 32 bits, quando o preço exceder o valor máximo, pode ser erroneamente lido como 0, o que claramente causaria uma enorme confusão.
A sobrecarga de inteiros divide-se em dois casos: sobrecarga superior e sobrecarga inferior.
Em contratos inteligentes de blockchain, a vulnerabilidade de estouro de inteiros é especialmente perigosa. Em 2018, o token BEC da BeautyChain foi explorado por atacantes devido a uma vulnerabilidade de estouro de inteiros, resultando no roubo de uma grande quantidade de tokens.
Para evitar a sobrecarga de inteiros, a linguagem Rust oferece alguns métodos eficazes:
toml [profile.release] overflow-checks = true panic = 'abort'
Use o crate uint para suportar tipos de inteiros maiores, como U256, U512, etc.
Use funções de conversão de tipo para detectar overflow, como:
ferrugem let amount_u256 = U256::from(u128::MAX) + 1; let amount_u128 = amount_u256.as_u128(); // irá disparar panic
ferrugem let result = x.checked_sub(y).expect("Underflow ocorreu");
Através desses métodos, podemos detectar e prevenir efetivamente o overflow de inteiros, aumentando a segurança dos contratos inteligentes. Ao escrever contratos que envolvem cálculos com grandes valores, é essencial tratar com cautela as possíveis situações de overflow.