смартконтракти цілочисельного переповнення: детальний опис заходів захисту

robot
Генерація анотацій у процесі

Вразливість переповнення цілого числа та її захист

Переповнення цілих чисел є поширеною проблемою в програмуванні. У більшості мов програмування ціле числове значення зберігається у пам'яті фіксованої довжини. Цілі числа поділяються на беззнакові та знакові, різниця полягає в тому, чи використовується старший біт як знак. Наприклад, 32-розрядна пам'ять може зберігати беззнакове ціле число в діапазоні від 0 до 4,294,967,295 (uint32), або знакове ціле число в діапазоні від -2,147,483,648 до 2,147,483,647 (int32).

Коли результати обчислень перевищують діапазон, який може бути представленим типом даних «ціле число», відбувається переповнення. Більшість мов програмування та компіляторів не перевіряють такі помилки, а просто виконують модульні обчислення або призводять до невизначеної поведінки. Це може призвести до несподіваних результатів роботи програми. У написанні смарт-контрактів на блокчейні, особливо в сфері децентралізованих фінансів, обчислення цілих чисел є поширеним, тому потрібно особливо звертати увагу на вразливості переповнення цілих чисел.

Цілісні переповнення можна поділити на два випадки: переповнення нагору та переповнення вниз:

  1. Переповнення: Результат обчислення перевищує максимальне значення, яке може бути представлене типом. Наприклад, 0xFFFFFFFF у uint32, додавши 1, стане 0x00000000.

  2. Нижнє переповнення: обчислений результат менший за найменше значення, яке може бути представлене типом. Наприклад, 0 - 1 для uint32 стане 0xFFFFFFFF.

!

У квітні 2018 року контракт токенів BeautyChain(BEC) був атакований через вразливість переповнення цілого числа, внаслідок чого зловмисник отримав величезну кількість токенів. Ця вразливість виникла у функції batchTransfer, оскільки не було перевірки на переповнення множення, що дозволило вивести велику кількість токенів з невеликого балансу токенів.

!

Щоб запобігти переповненню цілих чисел, можна вжити такі заходи:

  1. Налаштуйте параметри компіляції Rust, щоб перевіряти переповнення цілих чисел у режимі release і викликати panic.

  2. Використовуйте пакет uint для підтримки більших типів цілих чисел, таких як U256, U512 тощо.

  3. Використовуйте функції перетворення типу uint для виявлення переповнень, такі як as_u128().

  4. Використовуйте функції Safe Math, такі як checked_add(), щоб перевірити, чи не відбулася переповнення під час обчислення.

За допомогою цих методів можна ефективно уникати вразливостей переповнення цілих чисел, підвищуючи безпеку смарт-контрактів. При написанні контрактів, що містять великі обчислення, слід уважно ставитися до проблеми переповнення цілих чисел.

!

SAFE-1.99%
MATH-9.43%
Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • 5
  • Поділіться
Прокоментувати
0/400
AirdropHunterXiaovip
· 13год тому
Переповнення? Зараз будуть Кліпові купони.
Переглянути оригіналвідповісти на0
gas_guzzlervip
· 14год тому
Перед розробкою не забудьте налаштувати переповнення, браття.
Переглянути оригіналвідповісти на0
0xInsomniavip
· 14год тому
Переповнення завдало шкоди скільки невдах
Переглянути оригіналвідповісти на0
AirdropHunterZhangvip
· 14год тому
Лам у ламі, ті, хто безкоштовно користується, мають головний біль.
Переглянути оригіналвідповісти на0
0xOverleveragedvip
· 14год тому
Снова немає свекрухи.
Переглянути оригіналвідповісти на0
  • Закріпити