смарт-контракты целочисленное переполнение уязвимости: Подробное описание мер защиты

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, чтобы проверять переполнение целых чисел и вызывать panic даже в режиме release.

  2. Используйте crate uint для поддержки больших целочисленных типов, таких как U256, U512 и т.д.

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

  4. Используйте функции Safe Math, такие как checked_add(), для проверки, произошел ли переполнение вычислений.

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

!

SAFE3.31%
MATH0.49%
Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • 5
  • Поделиться
комментарий
0/400
AirdropHunterXiaovip
· 4ч назад
Переполнение? Будет использовано для Клиповые купоны.
Посмотреть ОригиналОтветить0
gas_guzzlervip
· 4ч назад
Перед разработкой не забудьте настроить переполнение, братцы.
Посмотреть ОригиналОтветить0
0xInsomniavip
· 4ч назад
Переполнение сильно навредило многим неудачникам
Посмотреть ОригиналОтветить0
AirdropHunterZhangvip
· 4ч назад
Лам ли ге лам, белый пират страдает головной болью.
Посмотреть ОригиналОтветить0
0xOverleveragedvip
· 5ч назад
Снова нет Ссу Лао По
Посмотреть ОригиналОтветить0
  • Закрепить