Анализ атаки на Loopscale: манипуляция ценой PTUSDe и её последствия
Недавно Loopscale официально подтвердил в Twitter, что в результате уязвимости в механизме ценообразования RateX было потеряно около 12% средств в их SOL‑ и USDC‑Genеsis‑вкладках. В этой статье я постараюсь разобрать вектор атаки, посмотрю ключевые транзакции и объясню, как некорректное использование оракула привело к выводу миллионов USDC и WSOL. Как автор, я хочу развить свои навыки в блокчейн‑разработке и аудите смарт‑контрактов, поэтому начинаю писать об уязвимостях и постараюсь делать это регулярно. Поэтому Let’s go.

Что такое Loopscale
Loopscale — модульный протокол кредитования на Solana с использованием ордер‑бука (order book), а не пула ликвидности. Заёмщики и кредиторы взаимодействуют напрямую, согласовывая точную цену и объём займа.
Адрес протокола:
1oopBoJG58DgkUVKkEzKgyG9dvRmpgeEm1AVjoHkF78
Залоги: поддерживаются разные активы, в том числе собственный токен PTUSDe и PTkySOL.
Эксплойтеры и атака
На момент написания статьи уже были известны два «эксплойтера», поэтому начинаю рассматривать их транзакции на solanascan и не иду на контракт Loopscale:
4QsqugQcrCuSVzU9WjeLDoR6HaaSZtMEZr5JCyxwHgCV - Loopscale Exploiter 1
C1QyPYoWQiueqhtLeaG5Nhkv1LJ8oweBNCbfGJ3LprYT - Loopscale Exploiter 2
Ключевые события:
Деплой вредоносного аккаунта BdADVdaAdDbFo85EP2ynEanQQMDDJgPyTZmAKtaHKRbK на BPF‑загрузчике.
Серия транзакций create_loan, в которых с минимальным залогом (0.001 PTUSDe или PTkySOL) выводились сотни тысяч и миллионы USDC/WSOL.

Структура транзакций атаки
Транзакции:
2Cti6x4wMw2CCvDwQYa4JvnHZAeQaSu6krAtMnBjx9mxHpr3LTmbRDwZs21fjRiwU2Z5dV4BTJbkjaD7E2mxrRrq
55dmSjy4Whjfqbfp8LwRduzTwz1fDeLu6aj8STqDXeiezZneNJwr2XiX3Qy7yWb2G2DL3d991ACD6sejNkQ7eH5Q
XxksDRzx1KFVJpUzVCFDjRCXJcUzwbdTRYPmHQzZwmzYS6DptV8qAJxU2CGAXhxyPvWLPitFCAuPA6ASBG5beub
2SkCkmX2Q8R7W7RDzgfc6ZFCmYgehmENw72sgTQLfNLHGupNdPDeNkW6S7qCNgYtintFcxhkBCsyf81XA9NSF2RJ
3LcknBmavGUAMJvNMAc5xwsLqFaKs3vfguWsoTNYzpBv76B4ChiagitSHogpdMwWZpuKDV3a62uT4wXn2SvLZvGP
Во всех пяти транзакциях create_loan прослеживался единый паттерн:
Блокировка залога 0.001 PTUSDe / PTkySOL в ATA заёмщика.
CPI‑вызов к Marginfi V2: снятие из пула 1 500 000 USDC (в транзакциях 1-3) и 1 226 725 USDC (в транзакции 4) .
Закрытие временного ATA и возврат депозита SOL (~0.002 SOL).
CPI‑вызов к Marginfi V2: снятие из пула WSOL (~1 211.4 SOL) в транзакции 5.
Малый размер залога в сочетании с колоссальным выводом средств ясно указывает на эксплуатацию уязвимости оракула.
Это было подтверждено самой командой Loopscale в твиттере.
Следует подчеркнуть, что Loopscale в своём твите чётко заявили: сами по себе оракул RateX (который они используют) не виноват — уязвимость возникла исключительно из-за того, как Loopscale использовал его для ценообразования. Их цитата из твитераД «Коренной причиной эксплойта стала изолированная проблема расчётов стоимости залогов на основе RateX в Loopscale. Сам RateX к этому не причастен. Потери понесли лишь вкладчики SOL и USDC в их Genesis-хранилищах.»
Так же отреагировал founder RateX:

Самый главный вопрос, на который мне пока не удалось найти ответа, как именно выглядела манипуляция оракулом (какие значения возвращались подставным оракулом? Какая проверка была со стороны loopscale на данные возвращаемые оракулами, которая пропустила это?). Сложность в том, что проект не является open source и я не очень знаю как к этому подобраться.
Как отметил пользователь Twitter @bill_papas_12, хотя Loopscale и не открывает исходный код, тщательный анализ бинарников, IDL и примеров транзакций позволяет почти полностью восстановить логику работы смарт-контракта. Возможно, именно этим методом воспользовался атакующий: изучив, какие данные должна возвращать программа BdADVdaAdDbFo85EP2ynEanQQMDDJgPyTZmAKtaHKRbK, он смог подменить цену и провести эксплойт.

Куда средства были отправлены далее?
Транзакция bR4YweLndnAAUX3DxwSfSqQNZcTgjdhnamLg35hF7tKzMnTPEzHvyAyQJtsAooKwgXY68tBuZzptc2R4aCqLz7H показывает, что USDC были обменены на WSOL.

Затем в транзакции 4uG4fVWmxXuZXNxw2BLWfTFVFbU4aYoqJ6PTntcD2dvRG9wL8csJraZ1MXYK8HjLWp5Wc6k3bwSfgcK861KTigN7 токены SOL были отправлены на Loopscale Exploiter 1.

И далее в трех транзакциях
5XzyPcvEL8JRD4B8rZcQxKCAi3FtxFYmGBjaWw5rSAu3ET3Z59RHuJafSJebeazZ3xDZDj9Qum8EubRchzN1Gm1e
FcafMbKHC4e1bArfsWJTDDgYtqktWTLeptmBnpGpSKZTdkSFYUJqtffwmvV1PQTX7Vfxp1EjHdjWMFcw1VWahTH
4KHQphm8CSS9YxgDiKgAfsLmTceFLYD8f9JEiaoZZRi7RQxfL3kPY4MD9GXuazeG6eyebChuupkQBA93ufh41QU2
токены были отправлены на Ethereum используя Wormhole:

P.S. Основные выводы я постарался получить собственными силами, проанализировав транзакции, а затем сверил их с данными из других источников — чтобы дополнить картину и исключить свои домыслы.