Вразливість переповнення цілого числа та її захист
Цілочисельний переповнення є поширеною проблемою в програмуванні. У більшості мов програмування цілочисельні значення зберігаються в пам'яті фіксованої довжини. Цілі числа можна поділити на беззнакові та знакові, відмінність полягає в тому, чи використовується старший біт як знак для позначення позитивних чи негативних значень. Наприклад, 32-бітна пам'ять може зберігати беззнакове ціле число від 0 до 4,294,967,295 (uint32) або знакове ціле число від -2,147,483,648 до 2,147,483,647 (int32).
Коли результат обчислень виходить за межі діапазону, який може бути представлений цілим числом, відбувається переповнення. Більшість мов програмування не перевіряють цю помилку, а просто виконують просту операцію модулю або створюють невизначену поведінку. Це може призвести до несподіваних результатів виконання програми. У смарт-контрактах блокчейну, особливо в сфері DeFi, обчислення цілих чисел є дуже поширеними, тому потрібно особливо звертати увагу на вразливість переповнення цілих чисел.
Визначення переповнення цілих чисел
Цілісні переповнення діляться на два випадки: верхнє переповнення ( overflow ) і нижнє переповнення ( underflow ).
Переповнення: результат перевищує максимальне значення цілочисельного типу. Наприклад, 0xFFFFFFFF для uint32 плюс 1 стане 0x00000000.
Нижнє переповнення: результат менший за мінімальне значення цілочисельного типу. Наприклад, 0 від uint32 зменшене на 1 стане 0xFFFFFFFF.
!
Техніка захисту
У Rust можна вжити такі заходи для запобігання переповненню цілих чисел:
Налаштуйте Cargo.toml, щоб режим release також перевіряв переповнення цілих чисел:
Завдяки цим методам ми можемо ефективно запобігати вразливостям переповнення цілих чисел у смарт-контрактах на Rust, підвищуючи безпеку контрактів. При написанні смарт-контрактів, що містять математичні обчислення, необхідно обережно обробляти цілі числові операції та вживати відповідних заходів захисту.
!
Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
8 лайків
Нагородити
8
4
Поділіться
Прокоментувати
0/400
GasDevourer
· 07-20 17:20
Обережно з переповненням і шахрайськими проєктами!
Техніки захисту від переповнення цілих чисел у смартконтрактах на Rust
Вразливість переповнення цілого числа та її захист
Цілочисельний переповнення є поширеною проблемою в програмуванні. У більшості мов програмування цілочисельні значення зберігаються в пам'яті фіксованої довжини. Цілі числа можна поділити на беззнакові та знакові, відмінність полягає в тому, чи використовується старший біт як знак для позначення позитивних чи негативних значень. Наприклад, 32-бітна пам'ять може зберігати беззнакове ціле число від 0 до 4,294,967,295 (uint32) або знакове ціле число від -2,147,483,648 до 2,147,483,647 (int32).
Коли результат обчислень виходить за межі діапазону, який може бути представлений цілим числом, відбувається переповнення. Більшість мов програмування не перевіряють цю помилку, а просто виконують просту операцію модулю або створюють невизначену поведінку. Це може призвести до несподіваних результатів виконання програми. У смарт-контрактах блокчейну, особливо в сфері DeFi, обчислення цілих чисел є дуже поширеними, тому потрібно особливо звертати увагу на вразливість переповнення цілих чисел.
Визначення переповнення цілих чисел
Цілісні переповнення діляться на два випадки: верхнє переповнення ( overflow ) і нижнє переповнення ( underflow ).
Переповнення: результат перевищує максимальне значення цілочисельного типу. Наприклад, 0xFFFFFFFF для uint32 плюс 1 стане 0x00000000.
Нижнє переповнення: результат менший за мінімальне значення цілочисельного типу. Наприклад, 0 від uint32 зменшене на 1 стане 0xFFFFFFFF.
!
Техніка захисту
У Rust можна вжити такі заходи для запобігання переповненню цілих чисел:
Томл [профіль.реліз] Переповнення-перевірки = Істина паніка = 'перервати'
іржа використовуйте uint::construct_uint;
construct_uint! { паб структура U1024(16); }
іржа let result = x.checked_add(y).expect("Переповнення при додаванні");
іржа нехай amount_u256 = U256::from(u128::MAX) + 1; let amount_u128 = amount_u256.as_u128(); // викликатиме паніку
!
Завдяки цим методам ми можемо ефективно запобігати вразливостям переповнення цілих чисел у смарт-контрактах на Rust, підвищуючи безпеку контрактів. При написанні смарт-контрактів, що містять математичні обчислення, необхідно обережно обробляти цілі числові операції та вживати відповідних заходів захисту.
!