Один резерв посчитали дважды в разные моменты: как похитили 92,6 тыс. из MCN Labs

Введение
MCN Labs — это проект в сети BNB Smart Chain. Пользователи вкладывают токены в пул ликвидности — хранилище, где два токена торгуются автоматически. За это они получают вознаграждения в токене FIST.
Резерв пула — это количество токенов, которое в данный момент находится в хранилище. От этого числа зависит цена и размер наград.
Ход инцидента
-
Злоумышленник взаимодействовал с контрактом LPBonus, который отвечает за начисление вознаграждений пользователям пула.
-
Контракт рассчитывал награду в два этапа. Сначала он смотрел на текущий резерв токена MSN в пуле и на его основе определял, сколько токенов FIST приходится на одну долю пула. Это число называлось oneshareFIST.
-
Злоумышленник уменьшил резерв MSN в пуле в момент начисления новых наград. Из-за этого контракт рассчитал завышенное значение oneshareFIST — на одну долю приходилось больше FIST, чем должно было.
-
Затем он восстановил ликвидность и вернул резерв MSN обратно к прежнему уровню.
-
После этого злоумышленник вызвал вывод своей позиции. На этом этапе контракт снова посмотрел на резерв MSN, но уже восстановленный, и посчитал вес позиции пользователя по этому новому, более высокому резерву.
-
В результате показатель награды был сформирован при низком резерве, а вес позиции — при высоком. Контракт начислил злоумышленнику больше токенов FIST, чем фактически было обеспечено поступившими вознаграждениями.
-
Полученные токены были обменяны, и ущерб для протокола составил около 92 607 BSC-USD — стейблкоина в сети BNB Smart Chain, привязанного к доллару.
Почему это стало возможным
Контракт использовал одно и то же значение резерва MSN на двух этапах расчёта, но брал его в разные моменты времени. Первое значение участвовало при формировании накопительного индекса награды, второе — при определении веса пользователя при выводе.
Контракт не фиксировал единое состояние резерва для обеих частей расчёта. Поэтому пользователь мог изменить резерв между этими двумя операциями, манипулируя итоговым результатом.
Также отсутствовала проверка, которая связывала бы итоговую выплату с фактически добавленным за этот период количеством токенов FIST. Накопительная система могла рассчитать награду, превышающую реальные поступления в резерв вознаграждений.
Детали расследования: движение средств
Похищенные средства в размере 92 607 BSC-USD поступили на контракт злоумышленника:
Затем они были отправлены транзитом через адрес:
Далее 34,1 ETH были отправлены восемью транзакциями в миксер Tornado Cash — сервис, который скрывает источник и путь криптовалюты.
Заключение
Инцидент в MCN Labs показал, что использование одного изменяемого значения на разных этапах одного расчёта создаёт уязвимость. Отсутствие фиксации состояния резерва и проверки соответствия выплаты реальным поступлениям позволило злоумышленнику получить награду, не обеспеченную протоколом.


