Vulnerabilidade de overflow de inteiros e sua proteção
O estouro 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 podem ser divididos em números sem sinal e números com sinal, com a diferença de que o bit mais significativo é usado como bit de sinal para representar positivo ou negativo. Por exemplo, 32 bits de memória podem armazenar inteiros sem sinal de 0 a 4.294.967.295 (uint32), ou inteiros com sinal de -2.147.483.648 a 2.147.483.647 (int32).
Quando o resultado de um cálculo excede o intervalo que pode ser representado pelo tipo inteiro, ocorre um estouro. A maioria das linguagens de programação não verifica esse erro, mas realiza uma simples operação de módulo ou produz um comportamento indefinido. Isso pode levar a resultados inesperados na execução do programa. Em contratos inteligentes de blockchain, especialmente na área de DeFi, cálculos inteiros são muito comuns, portanto, é necessário ter atenção especial às vulnerabilidades de estouro de inteiros.
Definição de overflow de inteiro
A sobrecarga de inteiros divide-se em duas situações: overflow( e underflow).
Overflow: O resultado excede o valor máximo do tipo inteiro. Por exemplo, 0xFFFFFFFF de um uint32 mais 1 se tornará 0x00000000.
Underflow: o resultado é menor que o valor mínimo do tipo inteiro. Por exemplo, 0 menos 1 em uint32 se torna 0xFFFFFFFF.
Tecnologia de Proteção
Em Rust, podem ser tomadas as seguintes medidas para evitar a sobrecarga de inteiros:
Configurar o Cargo.toml para verificar a sobrecarga de inteiros também no modo de release:
ferrugem
let result = x.checked_add(y).expect("Overflow na adição");
Utilize funções de conversão de tipo como as_u128() para detectar overflow:
ferrugem
let amount_u256 = U256::from(u128::MAX) + 1;
let amount_u128 = amount_u256.as_u128(); // irá disparar panic
Através destes métodos, podemos prevenir eficazmente vulnerabilidades de overflow de inteiros em contratos inteligentes Rust, aumentando a segurança dos contratos. Ao escrever contratos inteligentes que envolvem cálculos matemáticos, é fundamental tratar as operações inteiras com cuidado, adotando as medidas de proteção adequadas.
Ver original
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.
8 Curtidas
Recompensa
8
4
Compartilhar
Comentário
0/400
GasDevourer
· 07-20 17:20
Cuidado com projetos fraudulentos!
Ver originalResponder0
SchrodingerAirdrop
· 07-19 14:45
O autor está certo, vamos aprender Rust juntos?
Ver originalResponder0
liquiditea_sipper
· 07-17 23:42
Uau, a verificação de estouro deve ser ativada!
Ver originalResponder0
TokenCreatorOP
· 07-17 23:24
Eh, quem é que nunca caiu numa armadilha com isso de overflow~
Dicas de proteção contra estouro de inteiros em contratos inteligentes Rust
Vulnerabilidade de overflow de inteiros e sua proteção
O estouro 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 podem ser divididos em números sem sinal e números com sinal, com a diferença de que o bit mais significativo é usado como bit de sinal para representar positivo ou negativo. Por exemplo, 32 bits de memória podem armazenar inteiros sem sinal de 0 a 4.294.967.295 (uint32), ou inteiros com sinal de -2.147.483.648 a 2.147.483.647 (int32).
Quando o resultado de um cálculo excede o intervalo que pode ser representado pelo tipo inteiro, ocorre um estouro. A maioria das linguagens de programação não verifica esse erro, mas realiza uma simples operação de módulo ou produz um comportamento indefinido. Isso pode levar a resultados inesperados na execução do programa. Em contratos inteligentes de blockchain, especialmente na área de DeFi, cálculos inteiros são muito comuns, portanto, é necessário ter atenção especial às vulnerabilidades de estouro de inteiros.
Definição de overflow de inteiro
A sobrecarga de inteiros divide-se em duas situações: overflow( e underflow).
Overflow: O resultado excede o valor máximo do tipo inteiro. Por exemplo, 0xFFFFFFFF de um uint32 mais 1 se tornará 0x00000000.
Underflow: o resultado é menor que o valor mínimo do tipo inteiro. Por exemplo, 0 menos 1 em uint32 se torna 0xFFFFFFFF.
Tecnologia de Proteção
Em Rust, podem ser tomadas as seguintes medidas para evitar a sobrecarga de inteiros:
toml [profile.release] overflow-checks = true panic = 'abort'
ferrugem use uint::construct_uint;
construct_uint! { pub struct U1024(16); }
ferrugem let result = x.checked_add(y).expect("Overflow na adição");
ferrugem let amount_u256 = U256::from(u128::MAX) + 1; let amount_u128 = amount_u256.as_u128(); // irá disparar panic
Através destes métodos, podemos prevenir eficazmente vulnerabilidades de overflow de inteiros em contratos inteligentes Rust, aumentando a segurança dos contratos. Ao escrever contratos inteligentes que envolvem cálculos matemáticos, é fundamental tratar as operações inteiras com cuidado, adotando as medidas de proteção adequadas.