Взлом Resolv: как один ключ AWS выпустил $25 млн и снова обрушил DeFi
22 марта 2026 года злоумышленник зашел в Resolv Labs со 100 000 в ETH. Смарт-контракты не давали сбоев. Оракул не лгал. Дельта-нейтральная стратегия хеджирования работала в точности так, как было задумано. Вместо этого одни-единственные учетные данные AWS Key Management Service — ключ подписи, находившийся вне блокчейна, — дали взломщику разр ешение на минт 80 миллионов необеспеченных токенов USR под залог депозита в 100 000 до 0,025 $, что означает обвал на 97,5 %, и протоколы кредитования по всему Ethereum приняли на себя удар.
Инцидент с Resolv примечателен не тем, что он был хитроумным. Он примечателен тем, что о н таковым не был. Отсутствие проверки максимального объема минта, единая точка отказа в облачном управлении ключами и оракулы, оценивавшие потерявший привязку стейблкоин в 1 $ — DeFi уже сталкивался с каждым из этих сбоев раньше. То, что раскрывает этот взлом, вызывает дискомфорт: поверхность атаки на современные стейблкоины незаметно переместилась из Solidity в консоли AWS, а модели безопасности отрасли еще не адаптировались.
Анатомия 17-минутного ограбления
Процесс минта в Resolv представлял собой двухэтапный оффчейн-процесс. Пользователь вызывал requestSwap(), чтобы внести USDC. Привилегированный оффчейн-подписант — SERVICE_ROLE — проверял запрос, решал, сколько USR выпустить, и вызывал completeSwap(), чтобы завершить минт. Контракт устанавливал минимальный объем выпуска, но не максимальный. Контракт исполнял всё, что подписывал владелец ключа.
Такая архитектура поставила всю целостность протокола с TVL более 500 млн $ в зависимость от одного закрытого ключа, хранящегося в AWS KMS. Когда злоумышленник скомпрометировал облачную среду Resolv и получил доступ к учетным данным для подписи в KMS, остальная часть эксплойта стала почти механической:
- Внести примерно 100–200 тыс. $ в USDC через
requestSwap(). - Использовать украденный ключ SERVICE_ROLE, чтобы подписать авторизацию
completeSwap()на 80 миллионов USR. - Конвертировать выпущенные USR в wstUSR (стейкинговый обернутый вариант), чтобы смягчить первоначальное влияние на рынок.
- Вывести ликвидность через Curve, Uniswap и KyberSwap, переводя средства в ETH.
К 02:38 UTC токен USR торговался по 0,025 . Вся операция заняла 17 минут от начала до конца.
Оффчейн-поверхность атаки, которую никто не аудирует
Вот что поражает: Resolv проходил аудит. Проблема была не в коде Solidity. Защита от повторного входа (reentrancy), проверки на переполнение целых чисел, логические проверки — всё было в порядке. Эксплойт прошел ровно по тому пути кода, который спроектировали инженеры.
Уязвимость находилась уровнем выше — в облачной инфраструктуре, которая контролировала полномочия на выпуск токенов. Современные протоколы DeFi не являются чисто ончейн-системами. Они полагаются на оффчейн-ценовые потоки, оффчейн-киперов, оффчейн-мультисиги управления и, как показывает пример Resolv, на облачные сервисы подписи. Стандартные аудиты смарт-контрактов проверяют ончейн-код. Они не аудируют политики AWS IAM, графики ротации ключей KMS, гигиену переменных окружения или радиус поражения скомпрометированного CI / CD-конвейера.
Chainalysis в своем отчете по итогам инцидента прямо сформулировал урок: «Следующий эксплойт может произойти из-за фишингового письма, неправильно настроенной политики IAM или утечки переменной окружения». Другими словами, самым сложным для защиты элементом современного стейблкоина является не его кривая связывания (bonding curve) или коэффициент обеспечения. Это облачный аккаунт, в котором хранится ключ для минта.
Три проектных решения усугубили риск в Resolv:
- Отсутствие ончейн-проверки максимального объема минта. Контракт полностью доверял оффчейн-подписанту. Даже простое правило «ни один минт не может превышать 5 % от общего предложения» ограничило бы ущерб несколькими миллионами долларов вместо 25 миллионов $.
- Отсутствие ограничения частоты (rate limiting). В логике минта ничто не заметило, что 80 млн токенов только что были выпущены одним вызовом под залог депозита, который на несколько порядков меньше.
- Отсутствие многосторонней авторизации. Одной подписи SERVICE_ROLE — не пороговой подписи, не мультисига — было достаточно для завершения минта любого размера.
Любой из этих механизмов контроля превратил бы инцидент в досадную неприятность, а не в катастрофу.