Sui 鏈овий протокол DeFi кредитування Scallop у офіційному акаунті X ( @Scallop_io ) опублікував повідомлення про безпекову подію, підтвердивши, що платформа зазнала атаки. Scallop заявляє, що команда виявила, що використанню піддався бічний контракт (side contract), пов’язаний із пулом винагород sSUI spool, що спричинило втрату приблизно 150 тис. монет SUI. Scallop підкреслив, що уражені контракти вже заморожено, основний контракт залишається безпечним, і лише пул винагород sSUI зазнав впливу.
У подальших оновленнях Scallop додатково пояснив: «Основний контракт розморожено, всі операції відновлено. Ця проблема не пов’язана з основним протоколом, вона стосується лише одного застарілого контракту винагород. Депозити користувачів не постраждали, усі кошти в безпеці, функції внесення та зняття коштів відновлено в нормальному режимі». Команда пообіцяла поділитися більш детальними подробицями та продовжувати моніторинг і посилення безпеки протоколу.
Колишній NEAR core-учасник Vadim: проблема в старому пакеті, якому 17 місяців
Щодо цієї події колишній NEAR core-розробник Vadim ( @zacodil ) у X опублікував детальний технічний аналіз, розкривши деталі вразливості. Vadim зазначив, що атакувальник дуже добре знав, який саме із застарілих пакетів потрібно викликати. «Не код, який зараз працює, і не шлях SDK, а старий V2 від 2023 року 11 місяця, який кілька місяців ніхто не використовував. Це або глибоке реверс-інжиніринг, або хтось давно знав, де саме шукати. Ця вразливість просиділа 17 місяців.
Vadim пояснив, що spool відстежує index, який зростає разом із розподілом винагород. Під час стейкінгу кожен користувацький акаунт мав би записувати last_index на той момент, тож формула розрахунку нарахованих балів така: кількість стейкінгу × (current_index − last_index), тобто користувач може заробляти винагороди лише з моменту приєднання.
Але в застарілому пакеті V2 під час створення нового spool_account last_index не ініціалізувався і залишався рівним 0. Тому коли виконується update_points, результат обчислення стає таким: бали = кількість стейкінгу × (current_index − 0) = кількість стейкінгу × повний історичний індекс. Користувачів було зараховано на всі винагороди, накопичені з моменту створення spool у 2023 році 8 місяць.
Vadim надав конкретні дані: індекс spool зріс до 1.19 мільярда за 20 місяців. Атакувальник застейкав 136 тис. монет sSUI і миттєво отримав зарахування на 162 трлн балів. Оскільки пул винагород використовує обмін 1:1 (і чисельник, і знаменник дорівнюють 1), 162 трлн балів напряму конвертувалися в винагороду на 16.2 тис. монет SUI. Але в пулі винагород було лише 150 тис. монет SUI, тому їх усі було виснажено.
Усі ланцюгові безпекові інциденти цього квітня сталися в системах «на периферії»
Vadim пояснив, що для звичайних користувачів новий пакет використовується через SDK, і в ньому виправлено проблему синхронізації last_index. Причина, чому застарілий пакет V2 досі залишався в ланцюгу, полягає в незмінності Sui-пакетів. — Після публікації кожна стара версія пакета назавжди залишається доступною для виклику. Спільні об’єкти Spool і RewardsPool приймають виклики з будь-якої версії, тож атакувальник обійшов SDK і напряму влучив у шлях виклику старого коду.
Vadim класифікував це як «вразливість із застарілими пакетами Sui». Він зазначив, що правильне виправлення має включати поле версії у спільних об’єктах і додавання assert!(version == CURRENT_VERSION) у кожній функції. Без такого механізму кожна раніше опублікована версія пакета назавжди залишатиметься живою мішенню для атаки.
Vadim також підкреслив, що більшість атак цього місяця відбулися не в коді основного протоколу, а в периферійних системах:
KelpDAO: RPC-інфраструктура
Litecoin: рівень MWEB для приватності
Aethir: контроль доступу для периферійного конектора
Scallop: забутий старий пакет
Ця стаття про те, що Sui DeFi протокол кредитування Scallop зазнав злому, а вразливість у старих контрактах призвела до викрадення 150 тис. SUI, уперше з’явилася в 鏈新聞 ABMedia.