Вложил $2 600 — забрал $261 тыс.: как 100 нулевых переводов обманули контракт Royalties
24.06.2026 | CoinKyt Company

23 июня 2026 года злоумышленник вложил в контракт $2 600, а вышел с $261 тыс. Никакого сложного взлома — только одна логическая ошибка и 100 одинаковых операций, которые контракт воспринимал как повод пересчитать вознаграждение заново.

 


Введение


Контракт Royalties в сети Polygon — это система распределения вознаграждений между владельцами определённых токенов. Принцип простой: кто-то вносит средства, контракт рассчитывает, кому и сколько полагается, и выплачивает. Проблема возникла в момент, когда систему расчёта можно было запустить снова и снова — не внося новых средств.

 


Ход инцидента


1️⃣ Мгновенный кредит. Злоумышленник взял флэш-лоан — кредит без залога, который берётся и возвращается в рамках одной транзакции, — около $2 600 в токене USDC.e (это версия доллара-стейблкоина, адаптированная для сети Polygon) на платформе QuickSwap V2.


2️⃣ Внесение средств в контракт. Эти $2 600 злоумышленник отправил в контракт Royalties. Контракт рассчитал вознаграждение: определил, что атакующему полагается определённая сумма за его долю — и зафиксировал её.


3️⃣ Сто нулевых переводов. Дальше злоумышленник 100 раз подряд провёл перевод токенов с нулевой суммой — то есть формально «перевёл» ноль токенов. Каждый такой перевод запускал в контракте функцию повторного расчёта вознаграждения.


4️⃣ Ошибка: вознаграждение прибавлялось каждый раз заново. Контракт должен был при первом расчёте отметить: эта часть вознаграждения уже учтена, больше её не начислять. Но из-за логической ошибки этой пометки не было. При каждом следующем вызове контракт снова прибавлял ту же самую сумму — как будто вознаграждение появилось заново. После 100 итераций одна и та же сумма в $2 600 была учтена примерно 100 раз.


5️⃣ Вывод средств. В итоге контракт выплатил злоумышленнику около $263 тыс. Из них $2 600 вернулись в QuickSwap в счёт погашения кредита, а оставшиеся ~$261 тыс. злоумышленник перевёл в сеть Ethereum через мост LiFi.

 


Почему это стало возможным


Логика контракта предусматривала пересчёт вознаграждения при каждом переводе токенов — в том числе при переводе нуля. Это само по себе уже спорное решение: нулевой перевод не меняет ничего в балансах, и запускать из-за него пересчёт не было смысла.


Но главная ошибка в другом: после того как вознаграждение было рассчитано и зафиксировано, контракт не помечал его как «уже учтённое». Из-за этого повторный вызов той же функции прибавлял ту же сумму снова. Не было проверки: «а не начислялось ли это уже?» Именно это и позволило злоумышленнику накрутить сумму в 100 раз — просто повторяя одну и ту же бесплатную операцию.

 


Детали расследования: движение средств


Сеть Polygon


Злоумышленник взял ~$2 600 USDC.e в кредит на адрес 0x11ca9155aedfeb6772df5ea42ff714db7fba6adb. После проведения атаки с контракта Royalties поступило ~$263 тыс. Из них ~$2 600 вернулись в QuickSwap V2, а оставшиеся ~$261 тыс. были отправлены через мост LiFi в сеть Ethereum.


Сеть Ethereum


На адрес злоумышленника 0x11ca9155aedfeb6772df5ea42ff714db7fba6adb поступило около 156 ETH. Оттуда средства разделились:


— 76 ETH переведены на адрес 0x6cfd599adf20640e496be5233d2f7dd2368bf0af и остаются там на момент расследования


— 80 ETH направлены на адрес 0xda1b3e6f8246761f404548d363d51e1cb1fec57e, из которых 79 ETH остаются на балансе, а 1 ETH переведён на адрес 0x0d0d33d7052872b56080cc02d249266153d952e8


Основная транзакция: 0x7a92106f145045b7a2bdce60a22109739f9b0cd0185bf16ff83fd1fac98cb42e

 


Заключение


Эта атака — один из самых наглядных примеров того, как небольшая логическая ошибка превращается в многократный убыток. Злоумышленник не искал экзотических уязвимостей: он просто нашёл операцию, которая ничего не стоит и которую можно повторять бесконечно, и контракт, который каждый раз воспринимал её как новое основание для выплаты.


$2 600 вложений, 100 нулевых переводов, $261 тыс. ущерба. Соотношение говорит само за себя.


Похищенные средства на момент расследования остаются на известных адресах в сети Ethereum без движения. Команда КоинКит продолжает отслеживать ситуацию.