Вразливість переповнення цілого числа та її захист
Переповнення цілих чисел є поширеною проблемою в програмуванні. У більшості мов програмування ціле числове значення зберігається у пам'яті фіксованої довжини. Цілі числа поділяються на беззнакові та знакові, різниця полягає в тому, чи використовується старший біт як знак. Наприклад, 32-розрядна пам'ять може зберігати беззнакове ціле число в діапазоні від 0 до 4,294,967,295 (uint32), або знакове ціле число в діапазоні від -2,147,483,648 до 2,147,483,647 (int32).
Коли результати обчислень перевищують діапазон, який може бути представленим типом даних «ціле число», відбувається переповнення. Більшість мов програмування та компіляторів не перевіряють такі помилки, а просто виконують модульні обчислення або призводять до невизначеної поведінки. Це може призвести до несподіваних результатів роботи програми. У написанні смарт-контрактів на блокчейні, особливо в сфері децентралізованих фінансів, обчислення цілих чисел є поширеним, тому потрібно особливо звертати увагу на вразливості переповнення цілих чисел.
Цілісні переповнення можна поділити на два випадки: переповнення нагору та переповнення вниз:
Переповнення: Результат обчислення перевищує максимальне значення, яке може бути представлене типом. Наприклад, 0xFFFFFFFF у uint32, додавши 1, стане 0x00000000.
Нижнє переповнення: обчислений результат менший за найменше значення, яке може бути представлене типом. Наприклад, 0 - 1 для uint32 стане 0xFFFFFFFF.
!
У квітні 2018 року контракт токенів BeautyChain(BEC) був атакований через вразливість переповнення цілого числа, внаслідок чого зловмисник отримав величезну кількість токенів. Ця вразливість виникла у функції batchTransfer, оскільки не було перевірки на переповнення множення, що дозволило вивести велику кількість токенів з невеликого балансу токенів.
!
Щоб запобігти переповненню цілих чисел, можна вжити такі заходи:
Налаштуйте параметри компіляції Rust, щоб перевіряти переповнення цілих чисел у режимі release і викликати panic.
Використовуйте пакет uint для підтримки більших типів цілих чисел, таких як U256, U512 тощо.
Використовуйте функції перетворення типу uint для виявлення переповнень, такі як as_u128().
Використовуйте функції Safe Math, такі як checked_add(), щоб перевірити, чи не відбулася переповнення під час обчислення.
За допомогою цих методів можна ефективно уникати вразливостей переповнення цілих чисел, підвищуючи безпеку смарт-контрактів. При написанні контрактів, що містять великі обчислення, слід уважно ставитися до проблеми переповнення цілих чисел.
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
9 лайків
Нагородити
9
6
Поділіться
Прокоментувати
0/400
PensionDestroyer
· 4год тому
З терміновими позиками є битва
Переглянути оригіналвідповісти на0
AirdropHunterXiao
· 19год тому
Переповнення? Зараз будуть Кліпові купони.
Переглянути оригіналвідповісти на0
gas_guzzler
· 19год тому
Перед розробкою не забудьте налаштувати переповнення, браття.
Переглянути оригіналвідповісти на0
0xInsomnia
· 19год тому
Переповнення завдало шкоди скільки невдах
Переглянути оригіналвідповісти на0
AirdropHunterZhang
· 19год тому
Лам у ламі, ті, хто безкоштовно користується, мають головний біль.
смартконтракти цілочисельного переповнення: детальний опис заходів захисту
Вразливість переповнення цілого числа та її захист
Переповнення цілих чисел є поширеною проблемою в програмуванні. У більшості мов програмування ціле числове значення зберігається у пам'яті фіксованої довжини. Цілі числа поділяються на беззнакові та знакові, різниця полягає в тому, чи використовується старший біт як знак. Наприклад, 32-розрядна пам'ять може зберігати беззнакове ціле число в діапазоні від 0 до 4,294,967,295 (uint32), або знакове ціле число в діапазоні від -2,147,483,648 до 2,147,483,647 (int32).
Коли результати обчислень перевищують діапазон, який може бути представленим типом даних «ціле число», відбувається переповнення. Більшість мов програмування та компіляторів не перевіряють такі помилки, а просто виконують модульні обчислення або призводять до невизначеної поведінки. Це може призвести до несподіваних результатів роботи програми. У написанні смарт-контрактів на блокчейні, особливо в сфері децентралізованих фінансів, обчислення цілих чисел є поширеним, тому потрібно особливо звертати увагу на вразливості переповнення цілих чисел.
Цілісні переповнення можна поділити на два випадки: переповнення нагору та переповнення вниз:
Переповнення: Результат обчислення перевищує максимальне значення, яке може бути представлене типом. Наприклад, 0xFFFFFFFF у uint32, додавши 1, стане 0x00000000.
Нижнє переповнення: обчислений результат менший за найменше значення, яке може бути представлене типом. Наприклад, 0 - 1 для uint32 стане 0xFFFFFFFF.
!
У квітні 2018 року контракт токенів BeautyChain(BEC) був атакований через вразливість переповнення цілого числа, внаслідок чого зловмисник отримав величезну кількість токенів. Ця вразливість виникла у функції batchTransfer, оскільки не було перевірки на переповнення множення, що дозволило вивести велику кількість токенів з невеликого балансу токенів.
!
Щоб запобігти переповненню цілих чисел, можна вжити такі заходи:
Налаштуйте параметри компіляції Rust, щоб перевіряти переповнення цілих чисел у режимі release і викликати panic.
Використовуйте пакет uint для підтримки більших типів цілих чисел, таких як U256, U512 тощо.
Використовуйте функції перетворення типу uint для виявлення переповнень, такі як as_u128().
Використовуйте функції Safe Math, такі як checked_add(), щоб перевірити, чи не відбулася переповнення під час обчислення.
За допомогою цих методів можна ефективно уникати вразливостей переповнення цілих чисел, підвищуючи безпеку смарт-контрактів. При написанні контрактів, що містять великі обчислення, слід уважно ставитися до проблеми переповнення цілих чисел.
!