Вразливість переповнення цілого числа та її захист
Переповнення цілого числа є поширеною вразливістю програмування, яка може виникнути в більшості мов програмування. Переповнення відбувається, коли результат обчислення виходить за межі діапазону представлення цілого типу. Наприклад, діапазон 32-бітного беззнакового цілого числа (uint32) становить від 0 до 4,294,967,295. Якщо до 4,294,967,295 додати 1, результат "переповниться" і стане 0.
Цей переповнення може призвести до серйозних помилок у програмі, особливо при обробці фінансових даних. Наприклад, якщо використовувати 32-бітне ціле число для представлення цін на акції, то коли ціна перевищує максимальне значення, вона може бути помилково прочитана як 0, що очевидно призведе до величезного хаосу.
Цілісні переповнення поділяються на два випадки: верхнє переповнення та нижнє переповнення:
Переповнення: результат перевищує максимальне значення, наприклад, uint32 0xFFFFFFFF + 1 = 0x00000000
Нижнє переповнення: результат менший за мінімальне значення, наприклад, uint32 з 0x00000000 - 1 = 0xFFFFFFFF
У розумних контрактах блокчейну вразливість переповнення цілого числа є особливо небезпечною. У 2018 році токен BEC BeautyChain був використаний зловмисниками через вразливість переповнення цілого числа, що призвело до викрадення великої кількості токенів.
!
Щоб запобігти переповненню цілого числа, мова Rust пропонує кілька ефективних методів:
Увімкніть перевірку переповнення в режимі випуску:
Використовуйте функції Safe Math, такі як checked_add, checked_sub тощо:
іржа
let result = x.checked_sub(y).expect("Відбулося переповнення");
!
За допомогою цих методів ми можемо ефективно виявляти та запобігати переповненню цілих чисел, підвищуючи безпеку смарт-контрактів. Під час написання контрактів, що містять обчислення з великими значеннями, обов'язково обережно ставтеся до можливих ситуацій переповнення.
!
Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
9 лайків
Нагородити
9
4
Поділіться
Прокоментувати
0/400
SellLowExpert
· 07-16 05:14
Напевно, знову хтось потрапив у сніговий обвал.
Переглянути оригіналвідповісти на0
SigmaBrain
· 07-16 05:14
Написання коду без переповнення — це неможливо. Ті, хто розуміє, той знає.
Переглянути оригіналвідповісти на0
SchroedingersFrontrun
· 07-16 05:11
Ви ж кажете, що ця річ просто призводить до падіння до нуля активів у гаманці.
Запобігання переповненню цілих чисел: ключ до безпеки смартконтрактів
Вразливість переповнення цілого числа та її захист
Переповнення цілого числа є поширеною вразливістю програмування, яка може виникнути в більшості мов програмування. Переповнення відбувається, коли результат обчислення виходить за межі діапазону представлення цілого типу. Наприклад, діапазон 32-бітного беззнакового цілого числа (uint32) становить від 0 до 4,294,967,295. Якщо до 4,294,967,295 додати 1, результат "переповниться" і стане 0.
Цей переповнення може призвести до серйозних помилок у програмі, особливо при обробці фінансових даних. Наприклад, якщо використовувати 32-бітне ціле число для представлення цін на акції, то коли ціна перевищує максимальне значення, вона може бути помилково прочитана як 0, що очевидно призведе до величезного хаосу.
Цілісні переповнення поділяються на два випадки: верхнє переповнення та нижнє переповнення:
У розумних контрактах блокчейну вразливість переповнення цілого числа є особливо небезпечною. У 2018 році токен BEC BeautyChain був використаний зловмисниками через вразливість переповнення цілого числа, що призвело до викрадення великої кількості токенів.
!
Щоб запобігти переповненню цілого числа, мова Rust пропонує кілька ефективних методів:
Томл [профіль.реліз] Переповнення-перевірки = Істина паніка = 'перервати'
Використовуйте пакет uint для підтримки більших типів цілих чисел, таких як U256, U512 тощо.
Використовуйте функції перетворення типів для перевірки переповнення, наприклад:
ржавчина нехай amount_u256 = U256::from(u128::MAX) + 1; let amount_u128 = amount_u256.as_u128(); // викликатиме паніку
іржа let result = x.checked_sub(y).expect("Відбулося переповнення");
!
За допомогою цих методів ми можемо ефективно виявляти та запобігати переповненню цілих чисел, підвищуючи безпеку смарт-контрактів. Під час написання контрактів, що містять обчислення з великими значеннями, обов'язково обережно ставтеся до можливих ситуацій переповнення.
!