Атаки повторного виклику (Reentrancy) у смарт-контрактах: пояснення
Потенційні вразливості у смарт-контрактах
Незважаючи на те, що смарт-контракти є інноваційними, вони не є захищеними від недоліків, які можуть бути використані зловмисниками.
Недостатня перевірка вхідних даних є поширеною слабкою стороною, яка дозволяє зловмисникам впливати на виконання контракту, подаючи непередбачені дані. Крім того, неправильне застосування бізнес-логіки може призвести до вразливостей, створюючи непередбачену поведінку або логічні прогалини в контракті. Також, якщо неправильно обробляти небезпечні зовнішні виклики — наприклад, взаємодію з зовнішніми джерелами даних або іншими контрактами — це може створити додаткові ризики.
Атаки повторного виклику — це слабкі місця, які виникають, коли контракт здійснює зовнішній виклик до іншого контракту до завершення власних змін у стані. Це дозволяє викликаному контракту знову «заходити» до викликаючого контракту та, можливо, виконувати деякі з його операцій ще раз. Це може призвести до непередбачених дій і дозволити нападникам змінювати стан контракту, що, в свою чергу, може спричинити втрату коштів чи інші негативні наслідки.
З огляду на можливість таких атак, розробникам слід бути обачними, працюючи із зовнішніми контрактами або джерелами даних, забезпечуючи правильне оброблення зовнішніх викликів, щоб уникнути непередбаченої поведінки та вразливостей. Дотримання принципів безпеки, таких як тестування смарт-контрактів, може допомогти захистити їх від загроз, що змінюються.
Що таке атаки повторного виклику в смарт-контрактах?
У смарт-контрактах атаки повторного виклику виникають, коли контракт забезпечує зовнішній виклик функції іншого контракту до завершення власних змін у стані.
Це дозволяє викликаному контракту знову «заходити» до викликаючого контракту та, можливо, повторювати частину його операцій, що може призвести до непередбаченої, часто зловмисної поведінки. Наприклад, ситуація, коли контракт А викликає контракт B для переказу коштів, а потім змінює власний стан.
Код контракту B може містити функцію зворотного виклику, яка дозволяє йому повернутися до контракту А та, можливо, виконати функцію передачі коштів повторно до того, як контракт А завершить внесення змін до свого стану. Це дозволяє зловмиснику кілька разів зняти гроші з контракту А до завершення початкової транзакції.
Відомий злом децентралізованої автономної організації (DAO) у блокчейні Ethereum в 2016 році також є прикладом такої атаки. Зловмисник рекурсивно виводив кошти з DAO, використовуючи вразливість у коді смарт-контракту, що зрештою призвело до втрати мільйонів доларів у вигляді Ether.
Крім того, кілька протоколів децентралізованих фінансів (DeFi), включаючи Uniswap, Lendf.Me, BurgerSwap, SURGEBNB, Cream Finance і Siren Protocol, зазнали серйозних фінансових втрат через атаки повторного виклику. Ці порушення спричинили збитки у розмірі від 3,5 до 25 мільйонів доларів, що підкреслює постійну загрозу, яку становлять вразливості повторного виклику в просторі DeFi.
Як працюють атаки повторного виклику
Атаки повторного виклику використовують послідовне виконання функцій смарт-контракту разом із зовнішніми викликами для створення циклу, у якому зловмисники можуть виконувати певні функції кілька разів до її завершення, що може призвести до зловмисної поведінки та несанкціонованого виведення коштів.
Перш ніж жертва завершує зміни власного стану, контракт зловмисника ефективно «обманює» контракт жертви, змушуючи його знову викликати зовнішній контракт. Це може призвести до повторних виводів коштів або інших неналежних дій.
Смарт-контракт із функцією «виведення»
Припустімо, існує смарт-контракт цифрового гаманця, який дозволяє користувачам виводити кошти. Окрім відстеження балансів користувачів, цей контракт має функцію «виведення», яка спрощує зняття коштів.
Взаємодія користувача та виконання функції
Користувач запитує вивід коштів із власного гаманця. Вони використовують функцію «виведення», вводячи необхідну суму.
Колл до зовнішнього контракту
Контракт робить зовнішній виклик до іншого контракту або акаунта. У цьому моменті проявляється слабкість.
Рекурсивний виклик
Код зовнішнього контракту ще раз ініціює первинний. У результаті створюється рекурсія.
Експлуатація повторного виклику
Зловмисники швидко виводять кошти.