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ú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.
8 gostos
Recompensa
8
4
Republicar
Partilhar
Comentar
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.