28 мая 2025 года протокол Cork на Ethereum подвергся атаке [1], что привело к убыткам в размере около 12 миллионов долларов. Первопричиной стала комбинация манипуляции ценой с использованием исторического среднего значения подразумеваемой доходности (HIYA) перед истечением срока действия и отсутствия контроля доступа в обратном вызове хука Uniswap v4. Поскольку премии за риск HIYA растут экспоненциально по мере приближения времени до погашения к нулю, свопы на поздних стадиях завышали HIYA и приводили к тому, что во вновь инициализированных рынках цена Cover Tokens сильно занижалась. В то же время в CorkHook.beforeSwap отсутствовала аутентификация msg.sender, что позволяло выполнять произвольные вызовы со специально сформированными параметрами. Используя оба этих недостатка, злоумышленник извлек около 3,760e18 CT и DS и обменял их на wstETH, опустошив резервы протокола.
0x1 Общая информация
0x1.1 Токеномика
Протокол Cork [2] вводит новый примитив для токенизированного риска, выступая в качестве программируемого уровня риска для ончейн-активов, таких как токены хранилищ, доходные стейблкоины и ликвидные токены стейкинга (и рестейкинга). Фундаментальным компонентом является Cork Pool, который служит механизмом, вокруг которого строятся рынки. Каждый Cork Pool базируется на паре активов: Redemption Asset (RA — актив погашения) и Pegged Asset (PA — привязанный актив).
Cork Pool получает депозиты актива погашения, который блокируется. Взамен депоненту возвращаются два токена: Depeg Swap (DS) и Cover Token (CT). До установленного срока погашения 1 DS + 1 CT/PA могут быть обменены обратно на 1 RA; после погашения 1 CT может быть погашен пропорционально оставшимся в пуле RA + PA.
0x1.2 Реализация контракта
И DS, и CT являются торгуемыми. Пользователи могут торговать CT и RA, используя NormalSwap на основе пользовательской кривой AMM через CorkHook, в то время как DS и RA торгуются с использованием FlashSwap через Router и CorkHook.
NormalSwap [Пользовательская кривая AMM]:
FlashSwap [FlashSwapRouter.swapDsforRa]: Этот механизм является центральным в эксплойте. Злоумышленник позже инициирует этот путь посредством прямого, неаутентифицированного вызова beforeSwap (раздел 0x2.2).
-
Покупатель переводит RA в
Router. -
При первом вызове
beforeSwapRouterвычисляет количество DS, которое должно быть обменено. При необходимости он заимствует RA и CT из пула Uniswap v4, конвертирует заимствованные CT и DS протокола в RA, оставляет требуемое RA и возвращает заимствованные RA в пул Uniswap. -
При втором вызове
beforeSwapRouterразлагает RA на CT и DS черезdepositPsm, переводит весь объем DS пользователю, возвращает заимствованные CT в пул Uniswap и возвращает излишки CT покупателю.
Распределение средств после выпуска:
0x1.3 Механизм ценообразования для нового выпуска
Протокол использует HIYA (Historical Implied Yield Average — историческое среднее значение подразумеваемой доходности), рассчитываемое как кумулятивная сумма объема () × премия за риск (), которое служит для оценки премий за риск и корректировки цен инициализации при истечении срока действия. Если HIYA высока, протокол предполагает более высокий риск отвязки (depeg), что приводит к более низкой начальной цене CT.
Расчет премии за риск () состоит из двух компонентов: высокие цены CT коррелируют с низкими значениями (что интуитивно понятно), а срок до истечения имеет эффект экспоненциального усиления. Близко к моменту истечения срока приближается к нулю, что приводит к быстрому росту показателя степени . Это усиливает даже небольшие изменения цены CT в огромные значения премии за риск.
-
равно 1
-
— цена CT
-
— время до погашения, нормализованное от 1 до 0
Для иллюстрации усиления: если CT торгуется по (скидка 5%), то премия за риск при (полпути до истечения срока) составляет:
При (близко к истечению срока) та же цена CT дает:
Та же 5% скидка на CT генерирует премию за риск, которая примерно в 1500 раз больше около момента истечения срока. Эта экспоненциальная чувствительность является вектором манипуляции: своп, выполненный незадолго до истечения срока, несоразмерно завышает HIYA, искажая цену инициализации следующего рынка.
0x2 Анализ уязвимости
Затронутый рынок включает следующие токены:
| Роль | Токен | Описание |
|---|---|---|
| RA | wstETH |
Актив погашения |
| PA | weETH |
Привязанный актив |
| DS | weETH8DS-2 |
Depeg Swap |
| CT | weETH8CT-2 |
Cover Token |
Для ясности в оставшейся части отчета токены будут упоминаться по их абстрактным ролям (RA, DS, CT), а не по их конкретным именам, за исключением случаев, когда различие имеет значение.
Злоумышленник извлек как DS, так и CT из AMM и Router двумя различными методами. Поскольку DS + CT могут быть обменяны на RA, получение обоих позволяет напрямую извлечь прибыль. Атака состоит из двух компонентов.
0x2.1 Извлечение Cover Token: Манипуляция HIYA, ведущая к искусственно низким ценам инициализации рынка
Когда срок действия рыночного контракта истекает, протокол инициализирует следующий период, используя accumulatedHIYA из предыдущего периода для установления ценового соотношения CT/RA в AMM. Более высокое значение HIYA сигнализирует о более высоком воспринимаемом риске отвязки, что приводит к более низкой начальной цене CT.
Поскольку HIYA обновляется при каждом свопе и включает в себя премии за риск (раздел 0x1.3), а премии за риск растут экспоненциально при , свопы, выполненные незадолго до истечения срока, завышают accumulatedHIYA на порядки. Злоумышленник использовал это, вызвав SwapRaForDs() непосредственно перед истечением срока, что привело к генерации большой премии за риск, которая накопилась в HIYA.
Когда впоследствии был инициализирован новый рыночный период, протокол считал завышенное значение HIYA, интерпретировал его как экстремальный риск отвязки и установил начальную цену CT в AMM значительно ниже ее справедливой стоимости. Затем злоумышленник обменял RA на CT по этой искаженной цене, дешево приобретя большую позицию CT.
0x2.2 Извлечение Depeg Swap: Отсутствие контроля доступа в CorkHook.beforeSwap
В стандартной архитектуре хуков Uniswap v4 beforeSwap вызывается исключительно PoolManager во время свопа. Реализация Cork не обеспечивала это ограничение:
// Отсутствует: require(msg.sender == address(poolManager));
function beforeSwap(
address sender,
PoolKey calldata key,
IPoolManager.SwapParams calldata params,
bytes calldata hookData
) external override returns (bytes4, BeforeSwapDelta, uint24) {
...
}
Без этой проверки любой внешний контракт может вызвать beforeSwap напрямую с произвольными hookData. Когда hookData не пуст, функция переходит к пути выполнения FlashSwap (раздел 0x1.2), который разлагает RA на CT и DS через depositPsm. Злоумышленник использовал это, вызвав beforeSwap напрямую со специально подготовленными hookData, в которых указывались токены фиктивного рынка, что заставило протокол разложить токены и перевести результаты злоумышленнику.
0x2.3 Как сочетаются две уязвимости
Ни одна из уязвимостей по отдельности не достаточна для извлечения полных 12 миллионов долларов.
Манипуляция HIYA дает злоумышленнику дешевые CT, но одни только CT нельзя обменять на RA. Формула погашения требует наличия обоих токенов: CT + DS = RA. Злоумышленнику все еще нужен способ получения DS.
Отсутствие контроля доступа в beforeSwap предоставляет этот путь. Вызывая beforeSwap напрямую со специальными hookData, злоумышленник может инициировать путь разложения FlashSwap с произвольными параметрами. Чтобы получить реальные DS таким путем, злоумышленник развертывает фиктивный рынок, который назначает реальные DS в качестве своего RA (актива погашения), затем вызывает beforeSwap, чтобы разложить этот "RA" (реальные DS) на фиктивные CT и фиктивные DS, которые затем можно обменять обратно на реальные DS через фиктивный рынок.
Имея на руках и CT (после манипуляции с HIYA), и DS (после неаутентифицированного вызова beforeSwap через фиктивный рынок), злоумышленник погашает их в соотношении 1:1 в обмен на RA (wstETH).
0x3 Анализ атаки
Атака разворачивается в три транзакции, каждая из которых соответствует одной фазе: завышение HIYA, приобретение дешевых CT и извлечение DS для завершения пары погашения.
0x3.1 Подготовка: Завышение HIYA
В этой транзакции злоумышленник вызвал SwapRaForDs() незадолго до истечения срока действия рынка. Поскольку было близко к нулю, этот своп сгенерировал несоразмерно большую премию за риск (раздел 0x1.3), завысив accumulatedHIYA.

У злоумышленника после этой фазы: DS из свопа (используются позже в фазе 0x3.3) и завышенное значение accumulatedHIYA, сохраненное в блокчейне.
0x3.2 Инициализация: Приобретение дешевых CT
В этой транзакции был инициализирован новый рыночный период. Протокол считал завышенное значение accumulatedHIYA и установил искаженное ценовое соотношение CT/RA в AMM, оценив CT намного ниже справедливой стоимости. Затем злоумышленник обменял ~0.000003e18 RA на 3,760e18 CT по этой заниженной цене.
У злоумышленника после этой фазы: большая позиция CT (приобретенная дешево через манипулированную цену инициализации).
0x3.3 Извлечение: Получение DS через фиктивный рынок
Эта фаза использует уязвимость контроля доступа (раздел 0x2.2) для извлечения DS, завершая пару CT + DS, необходимую для погашения RA. Основной метод — это фиктивный рынок, который рассматривает реальные DS как свой актив погашения:
| Роль на фиктивном рынке | Реальный токен | Цель |
|---|---|---|
| Фиктивный RA | Реальные DS (weETH8DS-2) |
Позволяет реальным DS войти в путь разложения |
| Фиктивный CT | Выпущен из разложения фиктивного RA | Промежуточный; обменивается обратно на реальные DS |
| Фиктивный DS | Выпущен из разложения фиктивного RA | Промежуточный; обменивается обратно на реальные DS |
Основные шаги транзакции атаки:
-
Злоумышленник сначала обменял RA на DS на легитимном рынке.
У злоумышленника: реальные DS.
-
Злоумышленник развернул и инициализировал фиктивный рынок, назначив реальные DS в качестве фиктивного RA.
-
Злоумышленник вызвал
beforeSwapнапрямую (используя отсутствие контроля доступа) с непустымиhookData, инициируя путь выполнения FlashSwap на фиктивном рынке. ВнутриhookDataзлоумышленник указалpaymentTokenкак фиктивный CT, что заставило протокол выполнить логику разложения RA на фиктивном рынке.
-
Протокол разложил весь фиктивный RA (т.е. реальные DS) на фиктивные CT и фиктивные DS. Вся часть фиктивных DS была переведена злоумышленнику, а часть фиктивных CT (за вычетом минимальной
paymentAmount) была возвращена.У злоумышленника: 3,761e18 фиктивных CT + 3,761e18 фиктивных DS (оба получены из реальных DS).
-
Злоумышленник обменял фиктивные CT и фиктивные DS обратно на фиктивные RA на фиктивном рынке, восстановив реальные DS.
У злоумышленника: 3,761e18 реальных DS (восстановлено).
-
Злоумышленник объединил восстановленные DS с CT, полученными в разделе 0x3.2, чтобы погасить RA (wstETH), завершив извлечение прибыли.
У злоумышленника: 3,760e18 RA (wstETH) прибыли (т.е. $12M).
Итог
Этот инцидент объединил две независимые уязвимости, ни одна из которых не была достаточной сама по себе, в единую цепочку эксплойта, которая вывела из протокола 12 миллионов долларов.
- Экспоненциальная премия за риск перед истечением срока. Формула ценообразования HIYA усиливает премии за риск по мере приближения времени до погашения к нулю, превращая свопы на поздних стадиях в вектор манипуляции ценами реинициализации рынка.
- Отсутствие проверки отправителя в обратных вызовах хуков.
CorkHook.beforeSwapне обеспечивал проверку того, чтоmsg.sender— этоPoolManager, что позволяло прямой вызов с произвольными параметрами и позволяло злоумышленнику подделать путь выполнения FlashSwap. - Взаимодействие между модулями как "слепое пятно". Экономический дизайн (ценообразование на основе HIYA) и пробел в контроле доступа (неаутентифицированный обратный вызов хука) находились в отдельных модулях. Их взаимодействие создало путь к атаке, который вряд ли можно было обнаружить при анализе отдельных модулей.
Ссылки
О компании BlockSec
BlockSec — поставщик решений в области безопасности блокчейна и крипто-комплаенса полного цикла. Мы создаем продукты и услуги, которые помогают клиентам проводить аудит кода (включая смарт-контракты, блокчейн и кошельки), перехватывать атаки в реальном времени, анализировать инциденты, отслеживать незаконные средства и соблюдать обязательства AML/CFT на протяжении всего жизненного цикла протоколов и платформ.
BlockSec опубликовала множество статей по безопасности блокчейна на престижных конференциях, сообщила о нескольких уязвимостях нулевого дня в DeFi-приложениях, заблокировала несколько взломов, спасая более 20 миллионов долларов, и обеспечила безопасность миллиардов в криптовалютах.
-
Официальный сайт: https://blocksec.com/
-
Официальный аккаунт в Twitter: https://twitter.com/BlockSecTeam



