Вразливість переповнення цілого числа та її захист
Переповнення цілого числа є поширеною проблемою програмування, особливо в розробці смарт-контрактів у блокчейні, на яку слід звертати особливу увагу. Коли результат обчислення перевищує діапазон, який може бути представлений типом цілого числа, відбувається переповнення цілого числа.
Цілісні переповнення поділяються на два види: переповнення вгору та переповнення вниз. Переповнення вгору означає, що результат перевищує максимальне значення, наприклад, максимальне значення для типу uint32 - 4,294,967,295, додавання 1 призведе до 0. Переповнення вниз означає, що результат менший за мінімальне значення, наприклад, 0 для типу uint32, зменшене на 1, призведе до 4,294,967,295.
Наприклад, на токені BEC BeautyChain, зловмисники скористалися вразливістю переповнення цілого числа, щоб отримати велику кількість токенів. У функції batchTransfer amount = cnt * _value може статися переповнення, що призводить до збою перевірки балансу в require.
!
Щоб запобігти переповненню цілого числа, під час розробки смарт-контрактів на Rust можна вжити такі заходи:
Налаштуйте перевірку переповнення цілих чисел в режимі випуску в Cargo.toml.
Використовуйте пакет uint для підтримки більших типів цілих чисел, таких як U256, U512 тощо.
Використовуйте функції перетворення типу uint для перевірки переповнення, такі як as_u128().
Використовуйте функції Safe Math, такі як checked_add(), checked_sub() та інші для безпечних обчислень.
Виконати unwrap або expect обробку результатів Option, які повертаються функцією Safe Math.
!
Завдяки цим методам можна ефективно уникнути ризиків безпеки, пов'язаних з переповненням цілих чисел. У розробці смарт-контрактів слід завжди бути обережними з проблемою переповнення цілих чисел та вживати необхідних заходів захисту.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
14 лайків
Нагородити
14
5
Поділіться
Прокоментувати
0/400
CompoundPersonality
· 07-15 00:43
Проблема переповнення знову виникла.
Переглянути оригіналвідповісти на0
MEVSandwichMaker
· 07-14 16:58
Баг переповнення - це обов'язкове меню для Криптоветеранів.
Переглянути оригіналвідповісти на0
CommunityWorker
· 07-13 17:55
Цю помилку потрібно виправити, гм-гм.
Переглянути оригіналвідповісти на0
GasFeeCrybaby
· 07-13 17:50
Змастило, змастило, газ такий дорогий, ще й витікає.
Переглянути оригіналвідповісти на0
DegenMcsleepless
· 07-13 17:34
Раннє виявлення і лікування проблеми переповнення.
Безпека смартконтрактів: аналіз стратегій захисту від переповнення цілого числа
Вразливість переповнення цілого числа та її захист
Переповнення цілого числа є поширеною проблемою програмування, особливо в розробці смарт-контрактів у блокчейні, на яку слід звертати особливу увагу. Коли результат обчислення перевищує діапазон, який може бути представлений типом цілого числа, відбувається переповнення цілого числа.
Цілісні переповнення поділяються на два види: переповнення вгору та переповнення вниз. Переповнення вгору означає, що результат перевищує максимальне значення, наприклад, максимальне значення для типу uint32 - 4,294,967,295, додавання 1 призведе до 0. Переповнення вниз означає, що результат менший за мінімальне значення, наприклад, 0 для типу uint32, зменшене на 1, призведе до 4,294,967,295.
Наприклад, на токені BEC BeautyChain, зловмисники скористалися вразливістю переповнення цілого числа, щоб отримати велику кількість токенів. У функції batchTransfer amount = cnt * _value може статися переповнення, що призводить до збою перевірки балансу в require.
!
Щоб запобігти переповненню цілого числа, під час розробки смарт-контрактів на Rust можна вжити такі заходи:
Налаштуйте перевірку переповнення цілих чисел в режимі випуску в Cargo.toml.
Використовуйте пакет uint для підтримки більших типів цілих чисел, таких як U256, U512 тощо.
Використовуйте функції перетворення типу uint для перевірки переповнення, такі як as_u128().
Використовуйте функції Safe Math, такі як checked_add(), checked_sub() та інші для безпечних обчислень.
Виконати unwrap або expect обробку результатів Option, які повертаються функцією Safe Math.
!
Завдяки цим методам можна ефективно уникнути ризиків безпеки, пов'язаних з переповненням цілих чисел. У розробці смарт-контрактів слід завжди бути обережними з проблемою переповнення цілих чисел та вживати необхідних заходів захисту.
!